[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 }
View Code

 

posted @ 2017-01-02 17:31  KingSann  阅读(115)  评论(0)    收藏  举报