1. 程式人生 > 其它 >2021杭電多校第九場題解

2021杭電多校第九場題解

G

樹狀陣列簽到題。

每次詢問記錄左右端點,然後用樹狀陣列記錄當前位置是否存在(存在為1不存在為0)。然後對於詢問則採用二分位置+樹狀陣列查詢。

可能有同學會好奇為什麼不能線段樹,這樣可以少個log……這很簡單,記憶體是256MB,線段樹要開4倍大小,會爆記憶體

#include<bits/stdc++.h>
using namespace std;
const int N=2e7+7;
int n,l,r,now,num,c[N],a[N/2],p[N];
void add(int x,int v){while(x<=n)c[x]+=v,x+=x&-x;}
int ask(int
x){int ret=0;while(x)ret+=c[x],x-=x&-x;return ret;} int main() { int q,x;scanf("%d",&q); l=q+1,r=q,n=2*q; while(q--) { char c=getchar(); while(c<'A'||c>'Z')c=getchar(); if(c=='L') { ++num,p[--l]=++now,a[now]=l; add(l,
1); } else if(c=='R') { ++num,p[++r]=++now,a[now]=r; add(r,1); } else if(c=='G')scanf("%d",&x),add(a[x],-1),--num; else{ int pos=num/2+1,L=l,R=r,mid,ans=r; while(L<=R) { mid
=L+R>>1; if(ask(mid)-ask(l-1)>=pos)ans=mid,R=mid-1; else L=mid+1; } printf("%d\n",p[ans]); } } }
View Code

未完待續……