为什么这个代码开O2就WA了
查看原帖
为什么这个代码开O2就WA了
285617
黑影洞人楼主2024/9/17 16:32
#include<cstdio>
#include<algorithm>
#define mp make_pair
#define N 1145144
#define pni pair<node,int>
using namespace std;
int T;
int n,k;
struct node{
	int val,id;
	bool operator<(const node &a)const{return val==a.val?id<a.id:val<a.val;}
	node operator-(const node &a)const{return (node){val-a.val,id};}
}a[N];
node q1[N],q2[N];
int l1,r1,l2,r2;
//l大r小 
//int:0:1l,1:1r,2:2l,3:2r,4:1r+1,5:2r+1;
pni getmax(){
	if(l2>r2)return mp(q1[l1],0);
	if(l1>r1)return mp(q2[l2],2);
	if(q1[l1]<q2[l2])return mp(q2[l2],2);
	else return mp(q1[l1],0);
}
pni getmin(){
	if(l2>r2)return mp(q1[r1],1);
	if(l1>r1)return mp(q2[r2],3);
	if(q1[r1]<q2[r2])return mp(q1[r1],1);
	else return mp(q2[r2],3);
}
pni aa[4];
pni getcmn(){
	int tot=0;
	if(l1<=r1)aa[++tot]=mp(q1[r1],1);
	if(l2<=r2)aa[++tot]=mp(q2[r2],3);
	if(r1-l1+1>=2)aa[++tot]=mp(q1[r1-1],4);
	if(r2-l2+1>=2)aa[++tot]=mp(q2[r2-1],5);
	sort(aa+1,aa+tot+1);
	return aa[2];
}
void del(pni x){
	int typ=x.second;
	if(typ==0)l1++;
	if(typ==2)l2++;
	if(typ==1)r1--;
	if(typ==3)r2--;
}
void add(node x){q2[++r2]=x;}
bool isgo(){
	if(r1-l1+1+r2-l2+1==2)return 1;
	pni x=getmin(),y=getmax(),z=getcmn();
	if(!(y.first-x.first<z.first))return 1;
	del(y);del(x);
	add(y.first-x.first);
	return !isgo(); 
}
signed main(){
	//freopen("P7078_5.in","r",stdin);
	scanf("%d",&T);
	while(T--){
		if(!n){
			scanf("%d",&n);
			for(int i=1;i<=n;i++)scanf("%d",&a[i].val),a[i].id=i;
		}else{
			scanf("%d",&k);
			for(int i=1;i<=k;i++){
				int id,val;
				scanf("%d%d",&id,&val);
				a[id].val=val;
			}
		}
		l1=1,l2=1;r1=n,r2=0;
		for(int i=1;i<=n;i++)q1[n-i+1]=a[i];
		int flg=0;
		while(1){
			pni x=getmin(),y=getmax(),z=getcmn();
			if(y.first-x.first<z.first)break;
			del(x);del(y);
			add(y.first-x.first);
		}
		int ans=r1-l1+1+r2-l2+1;
		if(isgo())printf("%d\n",ans-1);
		else printf("%d\n",ans);
	}
	return 0;
}



2024/9/17 16:32
加载中...