P2671 [NOIP2015 普及组] 求和
这道题我用到一些小tricks
1.容易发现x+z必然为偶数,所以可以用i*2指代偶数,i*2+1指代奇数,像扫描线那样构造。
2.对于涉及大量运算的某个恒量,尽量用const 事先标明,出于某种我还不会的神奇原理,加了const 对于取模等场合,在速度上的优化是非常惊人的。
3.push_back()->emplace_back()
4.cin->scanf
下面是代码:
在洛谷提交需要开O2,因为用了STL
#include#define p cout << "***"; #define rep(i,x,n) for(int i=x;i<=n;++i) using namespace std; const int mod=10007; int n,m; int a[100010]; int b[100010]; vector v[200010]; main() { cin >> n >> m; rep(i,1,n) {scanf("%d",&a[i]);a[i]%=mod;} rep(i,1,n) scanf("%d",&b[i]); rep(i,1,n) v[b[i]*2+i%2].emplace_back(i); int ans=0; rep(i,1,m*2+1) { int len=v[i].size(); if(len<2) continue; rep(j,0,len-1) rep(k,j+1,len-1) { ans+=(1LL)*(v[i][j]+v[i][k])*(a[v[i][j]]+a[v[i][k]])%mod; ans%=mod; } } cout << ans; }