求助关于不同写法
查看原帖
求助关于不同写法
744687
Coffee_zzz/xin楼主2023/12/2 17:10

下面是我的两种写法,第一种写法 AC 了,第二种写法只过了 #1#2,感觉没啥差别,只改了 checkl()、checkr() 和第 5656 行,求结果不同的原因。

#include <bits/stdc++.h>
using namespace std;
const int N=5e5+5,inf=2e9;
int c,n,m,q,XX[N],YY[N],X[N],Y[N],x[N],y[N],lax[N],lix[N],rax[N],rix[N],lay[N],liy[N],ray[N],riy[N];
int mmax(int a,int b,int c,int d){
	if(a>b) return c;
	else return d;
}
int mmin(int a,int b,int c,int d){
	if(a<b) return c;
	else return d; 
}
bool checkl(int nn,int mm){
	if(nn==1||mm==1) return 1;
	int a=lax[nn-1],b=lay[mm-1],c=lix[nn-1],d=liy[mm-1];
	if(x[c]<y[d]) return checkl(c,mm);
	if(x[a]<y[b]) return checkl(nn,b);
	return 0;
}
bool checkr(int nn,int mm){
	if(nn==n||mm==m) return 1;
	int a=rax[nn+1],b=ray[mm+1],c=rix[nn+1],d=riy[mm+1];
	if(x[c]<y[d]) return checkr(c,mm);
	if(x[a]<y[b]) return checkr(nn,b);
	return 0;
}
void read(){
	int aa,bb,p,v;
	cin>>aa>>bb;
	for(int i=1;i<=n;i++) XX[i]=X[i];
	for(int i=1;i<=m;i++) YY[i]=Y[i];
	for(int i=1;i<=aa;i++) cin>>p>>v,XX[p]=v;
	for(int i=1;i<=bb;i++) cin>>p>>v,YY[p]=v;
}
bool solve(){
	bool res=0,flag=0;
	if(XX[1]==YY[1]||XX[n]==YY[m]||(XX[1]-YY[1]<0)!=(XX[n]-YY[m]<0)) return 0;
	if(XX[1]>YY[1]){
		swap(n,m);
		for(int i=1;i<=n;i++) x[i]=YY[i];
		for(int i=1;i<=m;i++) y[i]=XX[i];
		flag=1;
	}
	else{
		for(int i=1;i<=n;i++) x[i]=XX[i];
		for(int i=1;i<=m;i++) y[i]=YY[i];
	}
	x[0]=-1,y[0]=-1,x[n+1]=inf,y[m+1]=inf;
	lax[0]=0,lix[0]=n+1,rax[n+1]=0,rix[n+1]=n+1,lay[0]=0,liy[0]=m+1,ray[m+1]=0,riy[m+1]=m+1;
	for(int i=1;i<=n;i++) lax[i]=mmax(x[lax[i-1]],x[i],lax[i-1],i),lix[i]=mmin(x[lix[i-1]],x[i],lix[i-1],i);
	for(int i=1;i<=m;i++) lay[i]=mmax(y[lay[i-1]],y[i],lay[i-1],i),liy[i]=mmin(y[liy[i-1]],y[i],liy[i-1],i);
	for(int i=n;i>=1;i--) rax[i]=mmax(x[rax[i+1]],x[i],rax[i+1],i),rix[i]=mmin(x[rix[i+1]],x[i],rix[i+1],i);
	for(int i=m;i>=1;i--) ray[i]=mmax(y[ray[i+1]],y[i],ray[i+1],i),riy[i]=mmin(y[riy[i+1]],y[i],riy[i+1],i);
	int a=rax[1],b=ray[1],c=rix[1],d=riy[1];
	if(x[c]>=y[d]||x[a]>=y[b]) res=0;
	else if(checkl(c,b)&&checkr(c,b)) res=1;
	else res=0;
	if(flag) swap(n,m);
	return res;
}
signed main(){
	ios::sync_with_stdio(0);
	cin>>c>>n>>m>>q;
	for(int i=1;i<=n;i++) cin>>X[i];
	for(int i=1;i<=m;i++) cin>>Y[i];
	for(int i=1;i<=n;i++) XX[i]=X[i];
	for(int i=1;i<=m;i++) YY[i]=Y[i];
	cout<<solve();
	for(int t=1;t<=q;t++) read(),cout<<solve();
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N=5e5+5,inf=2e9;
int c,n,m,q,XX[N],YY[N],X[N],Y[N],x[N],y[N],lax[N],lix[N],rax[N],rix[N],lay[N],liy[N],ray[N],riy[N];
int mmax(int a,int b,int c,int d){
	if(a>b) return c;
	else return d;
}
int mmin(int a,int b,int c,int d){
	if(a<b) return c;
	else return d; 
}
bool checkl(int nn,int mm){
	if(nn==0||mm==0) return 1;
	int a=lax[nn],b=lay[mm],c=lix[nn],d=liy[mm];
	if(x[c]<y[d]) return checkl(c-1,mm-1);
	if(x[a]<y[b]) return checkl(nn-1,b-1);
	return 0;
}
bool checkr(int nn,int mm){
	if(nn==n+1||mm==m+1) return 1;
	int a=rax[nn],b=ray[mm],c=rix[nn],d=riy[mm];
	if(x[c]<y[d]) return checkr(c+1,mm+1);
	if(x[a]<y[b]) return checkr(nn+1,b+1);
	return 0;
}
void read(){
	int aa,bb,p,v;
	cin>>aa>>bb;
	for(int i=1;i<=n;i++) XX[i]=X[i];
	for(int i=1;i<=m;i++) YY[i]=Y[i];
	for(int i=1;i<=aa;i++) cin>>p>>v,XX[p]=v;
	for(int i=1;i<=bb;i++) cin>>p>>v,YY[p]=v;
}
bool solve(){
	bool res=0,flag=0;
	if(XX[1]==YY[1]||XX[n]==YY[m]||(XX[1]-YY[1]<0)!=(XX[n]-YY[m]<0)) return 0;
	if(XX[1]>YY[1]){
		swap(n,m);
		for(int i=1;i<=n;i++) x[i]=YY[i];
		for(int i=1;i<=m;i++) y[i]=XX[i];
		flag=1;
	}
	else{
		for(int i=1;i<=n;i++) x[i]=XX[i];
		for(int i=1;i<=m;i++) y[i]=YY[i];
	}
	x[0]=-1,y[0]=-1,x[n+1]=inf,y[m+1]=inf;
	lax[0]=0,lix[0]=n+1,rax[n+1]=0,rix[n+1]=n+1,lay[0]=0,liy[0]=m+1,ray[m+1]=0,riy[m+1]=m+1;
	for(int i=1;i<=n;i++) lax[i]=mmax(x[lax[i-1]],x[i],lax[i-1],i),lix[i]=mmin(x[lix[i-1]],x[i],lix[i-1],i);
	for(int i=1;i<=m;i++) lay[i]=mmax(y[lay[i-1]],y[i],lay[i-1],i),liy[i]=mmin(y[liy[i-1]],y[i],liy[i-1],i);
	for(int i=n;i>=1;i--) rax[i]=mmax(x[rax[i+1]],x[i],rax[i+1],i),rix[i]=mmin(x[rix[i+1]],x[i],rix[i+1],i);
	for(int i=m;i>=1;i--) ray[i]=mmax(y[ray[i+1]],y[i],ray[i+1],i),riy[i]=mmin(y[riy[i+1]],y[i],riy[i+1],i);
	int a=lax[n],b=lay[m],c=lix[n],d=liy[m];
	if(x[c]>=y[d]||x[a]>=y[b]) res=0;
	else if(checkl(c-1,b-1)&&checkr(c+1,b+1)) res=1;
	else res=0;
	if(flag) swap(n,m);
	return res;
}
signed main(){
	ios::sync_with_stdio(0);
	cin>>c>>n>>m>>q;
	for(int i=1;i<=n;i++) cin>>X[i];
	for(int i=1;i<=m;i++) cin>>Y[i];
	for(int i=1;i<=n;i++) XX[i]=X[i];
	for(int i=1;i<=m;i++) YY[i]=Y[i];
	cout<<solve();
	for(int t=1;t<=q;t++) read(),cout<<solve();
	return 0;
}
2023/12/2 17:10
加载中...