TLE与RE相结合 16pts
查看原帖
TLE与RE相结合 16pts
1159944
__YiChaQAQ__o_O楼主2025/7/22 17:13

思路:用vector里的erase,insert等操作结合二分找点,原题过了

测试点:

代码:

#include<bits/stdc++.h>
using namespace std;
#define mid (l+r+1)/2
#define midr (l+r)/2
#define int long long
vector<int >jihe;
int t,m;
int ans;
int last;
signed main(){
	//freopen("P3369_5.in","r",stdin);
	cin>>m>>t;
	while(m--){
		int x;
		scanf("%d",&x);
		jihe.push_back(x);
	}
	while(t--){
		int opera,n;
		scanf("%d%d",&opera,&n);
		n^=last;
		if (opera==2){
			int l=0,r=jihe.size()-1;
			while(l<r){
				if (jihe[mid]<=n)	l=mid;
				else r=mid-1;
			}
			jihe.erase(jihe.begin()+l);
		}
		if (opera==3){
			int l=0,r=jihe.size()-1;
			while(l<r){
				if (jihe[mid]<n)	l=mid;
				else r=mid-1;
			}
			if (jihe[0]>=n)	last=1,ans^=1;
			else	last=l+2,ans^=l+2;
		}
		if (opera==4)	last=jihe[n-1],ans^=jihe[n-1];
		if (opera==5){
			int l=0,r=jihe.size()-1;
			while(l<r){
				if (jihe[mid]<n)	l=mid;
				else r=mid-1;
			}
			last=jihe[l],ans^=jihe[l];
		}
		if (opera==6){
			int l=0,r=jihe.size()-1;
			while(l<r){
				if (jihe[midr]>n)	r=midr;
				else l=midr+1;
			}
			last=jihe[l],ans^=jihe[l];
		}
		if (opera==1){
			int l=0,r=jihe.size()-1;
			while(l<r){
				if (jihe[mid]<n)	l=mid;
				else r=mid-1;
			}
			if (jihe.size()==0)
				jihe.push_back(n);
			else if (n>=jihe[jihe.size()-1])
				jihe.push_back(n);
			else if (jihe[0]>n)
				jihe.insert(jihe.begin(),n);
			else
				jihe.insert(jihe.begin()+l+1,n);
		}
	}
	cout<<ans;
}
2025/7/22 17:13
加载中...