题目链接:CF 86D
用自定义函数来排序会超时的一道题超时N次看了大牛的博客发现把块写到结构体里面速度比较快;把add和del函数写到while里面也可以加快速度,再加上位运算会快一点(注意一下优先级)
代码:
#include<iostream> #include<algorithm> #include<cstdlib> #include<sstream> #include<cstring> #include<bitset> #include<cstdio> #include<string> #include<deque> #include<stack> #include<cmath> #include<queue> #include<set> #include<map> using namespace std; #define INF 0x3f3f3f3f #define CLR(x,y) memset(x,y,sizeof(x)) #define LC(x) (x<<1) #define RC(x) ((x<<1)+1) #define MID(x,y) ((x+y)>>1) typedef pair<int,int> pii; typedef long long LL; const double PI=acos(-1.0); const int N=200010; const int M=1000010; LL cnt[M]; int arr[N]; LL ans[N]; int unit; struct info { int l,r; int d; int b; bool operator<(const info &t)const { if(b==t.b) return r<t.r; return b<t.b; } }; info node[N]; int main(void) { int n,m,i,j; scanf("%d%d",&n,&m); unit=(int)sqrt(n+0.5); for (i=1; i<=n; ++i) scanf("%d",&arr[i]); for (i=0; i<m; ++i) { scanf("%d%d",&node[i].l,&node[i].r); node[i].d=i; node[i].b=node[i].l/unit; } sort(node,node+m); int L=node[0].l; int R=L-1; LL power=0; for (i=0; i<m; ++i) { while (L>node[i].l) { --L; power=power+arr[L]*((cnt[arr[L]]<<1)+1); ++cnt[arr[L]]; } while (L<node[i].l) { --cnt[arr[L]]; power=power-arr[L]*((cnt[arr[L]]<<1)+1); ++L; } while (R>node[i].r) { --cnt[arr[R]]; power=power-arr[R]*((cnt[arr[R]]<<1)+1); --R; } while (R<node[i].r) { ++R; power=power+arr[R]*((cnt[arr[R]]<<1)+1); ++cnt[arr[R]]; } ans[node[i].d]=power; } for (i=0; i<m; ++i) printf("%I64d ",ans[i]); return 0; }