Bzoj-1878&&Bzoj-2743
阿新 • • 發佈:2018-01-06
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> 3using 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;} 18bool 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