2 条题解
-
1
#include<bits/stdc++.h> using namespace std; set<int>s; int main() { ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); int n,q;cin>>n>>q; string ss;cin>>ss; for(int i=0;i<n;i++)if(ss[i]-'0')s.insert(i); while(q--) { int op,x;cin>>op>>x; if(op==0)s.insert(x); if(op==1)s.erase(x); if(op==2)cout<<s.count(x)<<'\n'; if(op==3) { auto it=s.lower_bound(x); if(it==s.end())cout<<-1<<'\n'; else cout<<*it<<'\n'; } if(op==4) { auto it=s.upper_bound(x); if(it==s.begin())cout<<-1<<'\n'; else it--,cout<<*it<<'\n'; } } return 0; } /* 当调用 s.erase(x) 时: 如果 x 存在:集合会将其删除,并且函数返回 1(表示删除了 1 个元素)。 如果 x 不存在:集合什么都不做,不会抛出异常,不会导致未定义行为(UB),并且函数返回 0。 */ -
1
#include<bits/stdc++.h> #define lc(p) tr[p].ls #define rc(p) tr[p].rs using namespace std; typedef long long ll; int id,rt; struct N{ int ls,rs,v,rd,sz; }tr[10000010]; mt19937 rd(999983); int nd(int v){ tr[++id]={0,0,v,rd(),1}; return id; } void pushup(int p){ tr[p].sz=tr[lc(p)].sz+tr[rc(p)].sz+1; } void split(int p,int v,int &x,int &y){ if(!p){ x=y=0; return ; } if(tr[p].v<=v){ x=p; split(rc(p),v,rc(p),y); } else{ y=p; split(lc(p),v,x,lc(p)); } pushup(p); } int merge(int x,int y){ if(!x||!y)return x+y; if(tr[x].rd<tr[y].rd){ rc(x)=merge(rc(x),y); pushup(x); return x; } else{ lc(y)=merge(x,lc(y)); pushup(y); return y; } } void ins(int v){ int x,y,z; split(rt,v-1,x,y); split(y,v,z,y); rt=merge(merge(x,nd(v)),y); } void del(int v){ int x,y,z; split(rt,v,x,y); split(x,v-1,x,z); rt=merge(x,y); } int getval(int p,int k){ while(1){ if(tr[lc(p)].sz+1==k)return tr[p].v; if(tr[lc(p)].sz>=k)p=lc(p); else k-=tr[lc(p)].sz+1,p=rc(p); } } int getpre(int v){ int x,y; split(rt,v,x,y); int ans=getval(x,tr[x].sz); rt=merge(x,y); return ans; } int getnxt(int v){ int x,y; split(rt,v-1,x,y); int ans=getval(y,1); rt=merge(x,y); return ans; } int main(){ ios::sync_with_stdio(0); cin.tie(0); int n,q; cin>>n>>q; string s; cin>>s; ins(-1);ins(1e9); for(int i=0;i<n;i++){ if(s[i]=='1')ins(i); } while(q--){ int op,x; cin>>op>>x; if(op==0){ ins(x); } if(op==1){ del(x); } if(op==2){ if(getpre(x)==x)cout<<"1\n"; else cout<<"0\n"; } if(op==3){ int ans=getnxt(x); if(ans==1e9)cout<<"-1\n"; else cout<<ans<<'\n'; } if(op==4){ int ans=getpre(x); if(ans==-1)cout<<"-1\n"; else cout<<ans<<'\n'; } } return 0; }
- 1
信息
- ID
- 8117
- 时间
- 5000ms
- 内存
- 1024MiB
- 难度
- 7
- 标签
- 递交数
- 112
- 已通过
- 24
- 上传者