BZOJ 2743 树状数组

Posted on 2016-09-28 19:36  yyjxx2010xyu  阅读(135)  评论(0编辑  收藏  举报

不能用分块。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int Maxn=1000100;
 4 struct Info{int l,r,Id;}Q[Maxn];
 5 int a[Maxn],n,c,m,Last[Maxn],Next[Maxn],d[Maxn],Ans[Maxn];
 6 inline bool Cmp(Info A,Info B) {return A.l>B.l;}
 7 inline int Lowbit(int x) {return x&(-x);}
 8 inline void Add(int x,int v) {for (int i=x;i<=n;i+=Lowbit(i)) d[i]+=v;}
 9 inline int Query(int x) {int Ret=0; for (int i=x;i;i-=Lowbit(i)) Ret+=d[i];return Ret;}
10 int main()
11 {
12     // freopen("c.in","r",stdin);
13     scanf("%d%d%d",&n,&c,&m);
14     for (int i=1;i<=n;i++) scanf("%d",&a[i]);
15     for (int i=1;i<=c;i++) Last[i]=n+1;
16     for (int i=n;i>=1;i--)
17     {
18         Next[i]=Last[a[i]];
19         Last[a[i]]=i;
20     }
21     Next[n+1]=n+1;
22     for (int i=1;i<=m;i++) scanf("%d%d",&Q[i].l,&Q[i].r),Q[i].Id=i;
23     sort(Q+1,Q+m+1,Cmp); int j=n;
24     for (int i=1;i<=m;i++)
25     {
26         while (j && j>=Q[i].l) Add(Next[Next[j]],-1),Add(Next[j--],1);
27         Ans[Q[i].Id]=Query(Q[i].r);
28     }
29     for (int i=1;i<=m;i++) printf("%d\n",Ans[i]);
30     return 0;
31 }
C++