[bzoj2743]采花

http://blog.csdn.net/jiangshibiao/article/details/23743939 诡异的解法。。

写莫队的话迟早要完。。

 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=1000010;
16 
17 int n,c,m,a[N],lst[N],pre[N],tot=1;
18 void add(int i,int c){for(;i;i-=i&-i)a[i]+=c;}
19 void ask(int i,int &c){for(c=0;i<=n;i+=i&-i)c+=a[i];}
20 struct ASD{
21     int l,r,ans,id;
22     bool operator < (ASD b) const{return r<b.r||(r==b.r&&l<b.l);}
23 }rd[N];
24 bool cmp(ASD a,ASD b){return a.id<b.id;}
25 int main(){
26     scanf("%d%d%d",&n,&c,&m);
27     for(int i=1,t;i<=n;i++)scanf("%d",&t),pre[i]=lst[t],lst[t]=i;
28     for(int i=1;i<=m;i++)scanf("%d%d",&rd[i].l,&rd[i].r),rd[i].id=i;
29     sort(rd+1,rd+1+m);
30     for(int i=1;i<=n;i++){
31         add(pre[pre[i]],-1),add(pre[i],1);
32         while(rd[tot].r==i)ask(rd[tot].l,rd[tot].ans),tot++;
33     }
34     sort(rd+1,rd+1+m,cmp);
35     for(int i=1;i<=m;i++)printf("%d\n",rd[i].ans);
36 }
View Code

 

posted @ 2017-01-07 20:50  KingSann  阅读(90)  评论(0)    收藏  举报