洛谷P4867 Gty的二逼妹子序列(莫队+树状数组)

传送门

 

本来打算用主席树

然后发现没办法维护颜色数

于是用了莫队加树状数组

然后竟然A了……

 1 //minamoto
 2 #include<iostream>
 3 #include<cstdio>
 4 #include<cmath>
 5 #include<algorithm>
 6 using namespace std;
 7 #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
 8 char buf[1<<21],*p1=buf,*p2=buf;
 9 inline int read(){
10     #define num ch-'0'
11     char ch;bool flag=0;int res;
12     while(!isdigit(ch=getc()))
13     (ch=='-')&&(flag=true);
14     for(res=num;isdigit(ch=getc());res=res*10+num);
15     (flag)&&(res=-res);
16     #undef num
17     return res;
18 }
19 char sr[1<<21],z[20];int C=-1,Z;
20 inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
21 inline void print(int x){
22     if(C>1<<20)Ot();if(x<0)sr[++C]=45,x=-x;
23     while(z[++Z]=x%10+48,x/=10);
24     while(sr[++C]=z[Z],--Z);sr[++C]='\n';
25 }
26 const int N=1e5+5,M=1e6+5;
27 int cnt[N],a[N],ans[M],c[N],rt[N],n,m,res,l,r,s;
28 struct node{
29     int l,r,ql,qr,id;
30     node(){}
31     node(int l,int r,int ql,int qr,int id):l(l),r(r),ql(ql),qr(qr),id(id){}
32     inline bool operator <(const node &b)const
33     {return rt[l]==rt[b.l]?rt[l]&1?r<b.r:r>b.r:l<b.l;}
34 }q[M];
35 inline void change(int x,int y){
36     for(;x<=n;x+=x&-x) c[x]+=y;
37 }
38 inline int query(int x){
39     int res=0;
40     for(;x;x-=x&-x) res+=c[x];
41     return res;
42 }
43 inline void add(int x){
44     if(++cnt[x]==1) change(x,1);
45 }
46 inline void del(int x){
47     if(--cnt[x]==0) change(x,-1);
48 }
49 int main(){
50 //    freopen("testdata.in","r",stdin);
51     n=read(),m=read(),s=sqrt(n);
52     for(int i=1;i<=n;++i) a[i]=read(),rt[i]=(i-1)/s+1;
53     for(int i=1,l,r,ql,qr;i<=m;++i)
54     l=read(),r=read(),ql=read(),qr=read(),q[i]=node(l,r,ql,qr,i);
55     sort(q+1,q+1+m);
56     l=1,r=0,res=0;
57     for(int i=1;i<=m;++i){
58         while(l>q[i].l) add(a[--l]);
59         while(r<q[i].r) add(a[++r]);
60         while(l<q[i].l) del(a[l++]);
61         while(r>q[i].r) del(a[r--]);
62         ans[q[i].id]=query(q[i].qr)-query(q[i].ql-1);
63     }
64     for(int i=1;i<=m;++i) print(ans[i]);
65     Ot();
66     return 0;
67 }

 

posted @ 2018-10-08 18:51  bztMinamoto  阅读(171)  评论(0编辑  收藏  举报
Live2D