5分求调
查看原帖
5分求调
684285
Makerlike楼主2024/6/30 21:22
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=5e5+10;
int c,n,m,q,x[N],y[N],tx[N],ty[N];
struct node{
	int mx,mn;
};
node prf[N],prg[N],suf[N],sug[N];
#define upd(T,p) (node){T[i]<T[p.mn]?i:p.mn,T[i]>T[p.mx]?i:p.mx}
bool check1(int xx,int yy,int n,int m,int f[],int g[]){
	if(xx==1||yy==1)
		return true;
	node t1=prf[xx-1],t2=prg[yy-1];
	if(f[t1.mn]<g[t2.mn])
		return check1(t1.mn,yy,n,m,f,g);
	if(f[t1.mx]<g[t2.mx])
		return check1(xx,t2.mx,n,m,f,g);
	return false;
}
bool check2(int xx,int yy,int n,int m,int f[],int g[]){
	if(xx==n||yy==m)
		return true;
	node t1=suf[xx+1],t2=sug[yy+1];
	if(f[t1.mn]<g[t2.mn])
		return check2(t1.mn,yy,n,m,f,g);
	if(f[t1.mx]<g[t2.mx])
		return check2(xx,t2.mx,n,m,f,g);
	return false;
}
bool sol(int f[],int n,int g[],int m){
	if(f[1]>=g[1])
		return false;
	for(int i=1;i<=n;i++)
		prf[i]=(i==1)?(node){1,1}:upd(f,prf[i-1]);
	for(int i=1;i<=m;i++)
		prg[i]=(i==1)?(node){1,1}:upd(g,prg[i-1]);
	for(int i=n;i>=1;i--)
		suf[i]=(i==n)?(node){n,n}:upd(f,suf[i+1]);
	for(int i=m;i>=1;i--)
		sug[i]=(i==m)?(node){m,m}:upd(g,sug[i+1]);
	node t1=prf[n],t2=prg[m];
	if(f[t1.mn]>=g[t2.mn]||f[t1.mx]>=g[t2.mx])
		return false;
	return check1(t1.mn,t2.mx,n,m,f,g)&&check2(t1.mn,t2.mx,n,m,f,g);
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>c>>n>>m>>q;
	for(int i=1;i<=n;i++){
		cin>>x[i];
		tx[i]=x[i];
	}
	for(int i=1;i<=m;i++){
		cin>>y[i];
		ty[i]=y[i];
	}
	bool f1=sol(x,n,y,m);
	bool f2=sol(y,m,x,n);
	cout<<(f1||f2);
	while(q--){
		int kx,ky;
		cin>>kx>>ky;
		while(kx--){
			int p,v;
			cin>>p>>v;
			x[p]=v;
		}
		while(ky--){
			int p,v;
			cin>>p>>v;
			y[p]=v;
		}
		bool f1=sol(x,n,y,m);
		bool f2=sol(y,m,x,n);
		cout<<(f1||f2);
		for(int i=1;i<=n;i++)
			x[i]=tx[i];
		for(int i=1;i<=m;i++)
			y[i]=ty[i];
	}
	return 0;
}
2024/6/30 21:22
加载中...