2 条题解

  • 1
    @ 2025-12-9 18:46:52
    #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
      @ 2025-12-7 9:05:21
      #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

      *【STL:set】前驱问题(Predecessor Problem)

      信息

      ID
      8117
      时间
      5000ms
      内存
      1024MiB
      难度
      7
      标签
      递交数
      112
      已通过
      24
      上传者