[bzoj2038]小Z的袜子
%%%莫队 %%%sbit
莫队算法:http://www.cnblogs.com/hzf-sbit/p/4056874.html
啊爆了若干次0原来是因为爆int了。。。(对着代码改了若干次。。)

1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 #include <cstdlib> 5 #include <map> 6 #include <string> 7 #include <vector> 8 #include <stack> 9 #include <cmath> 10 #include <queue> 11 #include <cstdio> 12 #include <set> 13 using namespace std; 14 15 const int N=600000; 16 17 struct bk{ 18 int l,r,id,b; 19 long long u,d; 20 bool operator < (bk a)const{ 21 return b<a.b||(b==a.b&&r<a.r); 22 } 23 }bs[N]; 24 bool cmp(bk a,bk b){return a.id<b.id;} 25 int n,m,a[N],l=1,r,cnt[N]; 26 long long now; 27 void add(int i){ 28 now+=2*(cnt[a[i]]++)+1; 29 } 30 void rem(int i){ 31 now+=-2*(cnt[a[i]]--)+1; 32 } 33 long long gcd(long long a,long long b){return b?gcd(b,a%b):a;} 34 int main(){ 35 scanf("%d%d",&n,&m); 36 int len=sqrt(n); 37 for(int i=1;i<=n;i++)scanf("%d",&a[i]); 38 for(int i=1;i<=m;i++)scanf("%d%d",&bs[i].l,&bs[i].r),bs[i].id=i,bs[i].b=bs[i].l/len; 39 sort(bs+1,bs+1+m); 40 for(int i=1;i<=m;i++){ 41 if(r<bs[i].r){for(r++;r<bs[i].r;r++)add(r);add(r);} 42 if(l>bs[i].l){for(l--;l>bs[i].l;l--)add(l);add(l);} 43 if(r>bs[i].r){for(;r>bs[i].r;r--)rem(r);} 44 if(l<bs[i].l){for(;l<bs[i].l;l++)rem(l);} 45 if(l==r){bs[i].u=0,bs[i].d=1;continue;} 46 bs[i].u=now-(r-l+1); 47 bs[i].d=(long long)(r-l+1)*(r-l); 48 long long g=gcd(bs[i].u,bs[i].d); 49 bs[i].u/=g; 50 bs[i].d/=g; 51 } 52 sort(bs+1,bs+1+m,cmp); 53 for(int i=1;i<=m;i++)printf("%lld/%lld\n",bs[i].u,bs[i].d); 54 }