1. 程式人生 > >Bzoj-1878&&Bzoj-2743

Bzoj-1878&&Bzoj-2743

tdi 一起 () 一個點 就是 style 端點 space 發現

前言

因為兩題類似所以一起寫了,雙倍經驗233

Bzoj-1878

看到數據範圍,覺得可以莫隊啊,但是不會寫qwq...

然後發現可以樹狀數組(By hzwer

然後理解了一下,大概是這樣的

把詢問按照左右端點排序以後維護的幾乎就是一個序列了

"將所有顏色的第一個點x a[x]++

然後從左往右掃

掃到一個點x將a[next[x]]++

碰到一個詢問l,r輸出sum[r]-sum[l-1]"

聽說cxk(Bunny)當初看了10+min就懂了,可怕

 1 #include<cstdio>
 2 #include<algorithm>
 3
using namespace std; 4 #define max(a,b) a>b?a:b 5 inline void read(int &x) 6 { 7 x=0;int f=1;char ch=getchar(); 8 while(ch<0||ch>9){if(ch==-) f=-1;ch=getchar();} 9 while(ch>=0&&ch<=9){x=x*10+ch-0;ch=getchar();} 10 } 11 int t[50005],n,m,a[50005];
12 #define l(x) x&-x 13 inline void add(int x,int v){for(;x<=n;x+=l(x))t[x]+=v;} 14 inline int ask(int x){int ans=0;for(;x>0;x-=l(x))ans+=t[x];return ans;} 15 int nxt[50005],mx,p[1000005]; 16 struct pos{int l,r,id,ans;}q[200005]; 17 bool cmp1(pos a,pos b){return a.l==b.l?a.r<b.r:a.l<b.l;} 18
bool cmp2(pos a,pos b){return a.id<b.id;} 19 int main() 20 { 21 read(n);for(int i=1;i<=n;i++){read(a[i]);mx=max(mx,a[i]);} 22 for(int i=n;i;i--){nxt[i]=p[a[i]];p[a[i]]=i;} 23 for(int i=0;i<=mx;i++) if(p[i]) add(p[i],1); 24 read(m);for(int i=1;i<=m;i++){q[i].id=i;read(q[i].l);read(q[i].r);} 25 sort(q,q+m+1,cmp1);int l=1; 26 for(int i=1;i<=m;i++){while(l<q[i].l){if(nxt[l]) add(nxt[l],1);l++;}q[i].ans=ask(q[i].r)-ask(q[i].l-1);} 27 sort(q,q+m+1,cmp2); 28 for(int i=1;i<=m;i++) printf("%d\n",q[i].ans); 29 return 0; 30 }

Bzoj-2743

這道就不能莫隊了qwq...反正我還不會寫=v=

和上面那道類似,不過這次取nxt[nxt[l]],這樣就可以避免取到只有一朵的

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 #define max(a,b) a>b?a:b
 5 inline void read(int &x)
 6 {
 7     x=0;int f=1;char ch=getchar();
 8     while(ch<0||ch>9){if(ch==-) f=-1;ch=getchar();}
 9     while(ch>=0&&ch<=9){x=x*10+ch-0;ch=getchar();}
10 }
11 int t[1000005],a[1000005],n,m,c;
12 #define l(x) x&-x
13 inline void add(int x,int v){for(;x<=n;x+=l(x))t[x]+=v;}
14 inline int  ask(int x){int ans=0;for(;x>0;x-=l(x))ans+=t[x];return ans;}
15 int nxt[1000005],mx,p[1000005];
16 struct pos{int l,r,id,ans;}q[1000005];
17 bool cmp1(pos a,pos b){return a.l==b.l?a.r<b.r:a.l<b.l;}
18 bool cmp2(pos a,pos b){return a.id<b.id;}
19 int main()
20 {
21     read(n);read(c);read(m);for(int i=1;i<=n;i++)read(a[i]);
22     for(int i=n;i;i--){nxt[i]=p[a[i]];p[a[i]]=i;}
23     for(int i=1;i<=c;i++) if(nxt[p[i]]) add(nxt[p[i]],1);
24     for(int i=1;i<=m;i++){q[i].id=i;read(q[i].l);read(q[i].r);}
25     sort(q,q+m+1,cmp1);int l=1;
26     for(int i=1;i<=m;i++){while(l<q[i].l){if(nxt[l]) add(nxt[l],-1);if(nxt[nxt[l]]) add(nxt[nxt[l]],1);l++;}q[i].ans=ask(q[i].r)-ask(q[i].l-1);}
27     sort(q,q+m+1,cmp2);
28     for(int i=1;i<=m;i++) printf("%d\n",q[i].ans);
29     return 0;
30 }

Bzoj-1878&&Bzoj-2743