求set的大致常数
  • 板块灌水区
  • 楼主Amoribus
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/12/2 19:58
  • 上次更新2024/12/2 22:07:00
查看原帖
求set的大致常数
935976
Amoribus楼主2024/12/2 19:58

P11361 [NOIP2024] 编辑字符串(民间数据) 我使用set+二分维护,O(nlogn)O(n\log n),挂成60分,跟 O(n2)O(n^2) 一样分数,求问原因。

是常数太大的原因吗?

正确性应该没有问题。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int T,p=0;
int n,ans;
char s1[N],s2[N],t1[N],t2[N];
set<int> pos_s1,pos_s2,pos_s3,pos_s4,pos_t1,pos_t2;
int main()
{
//	ios::sync_with_stdio(0);
	//cin.tie(0);
//	cout.tie(0);
//	freopen("edit2.in","r",stdin);
	//freopen("2.out","w",stdout);
	cin>>T;
	while(T--) {
		pos_s1.clear();
		pos_s2.clear();
		pos_s3.clear();
		pos_s4.clear();
		pos_t1.clear();
		pos_t2.clear();
		ans=0;
		cin>>n;
		cin>>s1+1>>s2+1>>t1+1>>t2+1;
		for(int i=1; i<=n; i++) {
			if(s1[i]=='0') pos_s1.insert(i);
			if(s1[i]=='1') pos_s2.insert(i);
			if(s2[i]=='0') pos_s3.insert(i);
			if(s2[i]=='1') pos_s4.insert(i);
			if(t1[i]=='0') pos_t1.insert(i);
			if(t2[i]=='0') pos_t2.insert(i);
		}
		pos_s1.insert(n+1);
		pos_s2.insert(n+1);
		pos_s3.insert(n+1);
		pos_s4.insert(n+1);
		pos_t1.insert(n+1);
		pos_t2.insert(n+1);
		for(int i=1; i<=n; i++) {
			//cout<<s1+1<<endl;
			//cout<<s2+1<<endl;
			//cout<<endl;
			if(s1[i]==s2[i]) continue;
			else if(s1[i]!=s2[i]) {
				if(t1[i]=='1') {
					int r1=*pos_s1.upper_bound(i);
					int r2=*pos_s2.upper_bound(i);
					int c1=*upper_bound(pos_t1.begin(),pos_t1.end(),i);
					if(c1==n+1) {
						if(s1[i]=='1') {
							if(r1<=n) {
								swap(s1[i],s1[r1]);
								pos_s2.insert(r1);//标记1的数组加入r1
								pos_s1.erase(r1);//标记0的数组减掉r1
								pos_s1.insert(i);
								pos_s2.erase(i);
								//pos_s1.erase(r1);
							}
						} else if(s1[i]=='0') {
							if(r2<=n) {
								swap(s1[i],s1[r2]);
								pos_s2.erase(r2);
								pos_s1.insert(r2);//标记0的数组加入r1
								pos_s1.erase(i);
								pos_s2.insert(i);
							}
						}
					} else {
						if(s1[i]=='1') {
							if(r1<=n&&r1<c1) {
								swap(s1[i],s1[r1]);
								pos_s2.insert(r1);
								pos_s1.erase(r1);
								pos_s1.insert(i);
								pos_s2.erase(i);
							}
						} else if(s1[i]=='0') {
							if(r2<=n&&r2<c1) {
								swap(s1[i],s1[r2]);
								pos_s1.insert(r2);
								pos_s2.erase(r2);
								pos_s2.insert(i);
								pos_s1.erase(i);
							}
						}
					}
				}
				if(s1[i]==s2[i]) continue;
				if(t2[i]=='1') {
					int r1=*upper_bound(pos_s3.begin(),pos_s3.end(),i);
					int r2=*upper_bound(pos_s4.begin(),pos_s4.end(),i);
					int c1=*upper_bound(pos_t2.begin(),pos_t2.end(),i);
					if(c1==n+1) {
						if(s2[i]=='1') {
							if(r1<=n) {
								swap(s2[i],s2[r1]);
								pos_s4.insert(r1);//标记1的数组加入r1
								pos_s3.erase(r1);//标记0的数组减掉r1
								pos_s3.insert(i);
								pos_s4.erase(i);
							}
						} else if(s2[i]=='0') {
							if(r2<=n) {
								swap(s2[i],s2[r2]);
								pos_s4.erase(r2);
								pos_s3.insert(r2);//标记0的数组加入r1
								pos_s3.erase(i);
								pos_s4.insert(i);
							}
						}
					} 
					else{
						if(s2[i]=='1') {
							if(r1<=n&&r1<c1) {
								swap(s2[i],s2[r1]);
								pos_s4.insert(r1);
								pos_s3.erase(r1);
								pos_s3.insert(i);
								pos_s4.erase(i);
							}
						} else if(s2[i]=='0') {
							if(r2<=n&&r2<c1) {
								swap(s2[i],s2[r2]);
								pos_s3.insert(r2);
								pos_s4.erase(r2);
								pos_s4.insert(i);
								pos_s3.erase(i);
							}
						}
					}
				}
			}
		}
		for(int i=1; i<=n; i++) {
			if(s1[i]==s2[i]) ans++;
		}
		cout<<ans<<endl;
	}
	//cout<<s1+1<<endl;
	//cout<<s2+1<<endl;

	return 0;
}
2024/12/2 19:58
加载中...