TLE on test 49 求助
查看原帖
TLE on test 49 求助
723238
wukaichen888楼主2024/3/19 13:37
#pragma GCC optimize("Ofast,no-stack-protector")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include<bits/stdc++.h> 
using namespace std;
#define ll long long
#define ull unsigned long long
const int N=2e5+5,inf=1e9;
int t,n,q,K,a[N],b[N],pre1[100],pre2[100];
struct qwq{int sum,val;};
bool cmp1(qwq x,qwq y){return x.sum<y.sum;}
bool cmp2(qwq x,qwq y){return x.sum>y.sum;}
#define lc k<<1
#define rc k<<1|1
#define ls lc,l,mid
#define rs rc,mid+1,r
struct node{
	vector<qwq>lmax,rmax;
	int sum,minn,maxx;
}tree[N<<2];
node ans,las;
void pre(int k,int l,int r){
	if(l==r){
		tree[k].maxx=a[l];
		tree[k].minn=inf,tree[k].sum=b[l];
		if(b[l]>=K) tree[k].minn=a[l];
		tree[k].lmax.clear();
		tree[k].lmax.push_back(qwq{b[l],a[l]});
		tree[k].rmax.clear();
		tree[k].rmax.push_back(qwq{b[l],a[l]});
		return ;
	}
	int mid=l+r>>1;
	pre(ls);pre(rs);
	tree[k].lmax.clear(); 
	tree[k].rmax.clear();
	tree[k].maxx=max(tree[lc].maxx,tree[rc].maxx);
	for(auto v:tree[lc].lmax) tree[k].lmax.push_back(v);
	for(auto v:tree[rc].lmax){
		if((tree[lc].sum|v.sum)==tree[lc].sum) continue;
		tree[k].lmax.push_back(qwq{tree[lc].sum|v.sum,max(tree[lc].maxx,v.val)});
	}
	for(auto v:tree[rc].rmax) tree[k].rmax.push_back(v);
	for(auto v:tree[lc].rmax){
		if((tree[rc].sum|v.sum)==tree[rc].sum) continue;
		tree[k].rmax.push_back(qwq{v.sum|tree[rc].sum,max(v.val,tree[rc].maxx)});
	}
	tree[k].minn=min(tree[lc].minn,tree[rc].minn);
	pre1[0]=tree[lc].rmax[0].val;
	pre2[0]=tree[rc].lmax[0].val;
	for(int i=1;i<tree[lc].rmax.size();i++)
		pre1[i]=max(pre1[i-1],tree[lc].rmax[i].val);
	for(int i=1;i<tree[rc].lmax.size();i++)
		pre2[i]=max(pre2[i-1],tree[rc].lmax[i].val);
	for(int r1=0,r2=tree[rc].lmax.size()-1;r1<tree[lc].rmax.size();r1++){
		while((r2>0)&&((tree[lc].rmax[r1].sum|tree[rc].lmax[r2-1].sum)>=K))
			r2--;
		if((tree[lc].rmax[r1].sum|tree[rc].lmax[r2].sum)>=K)
			tree[k].minn=min(tree[k].minn,max(pre1[r1],pre2[r2]));
	}
	tree[k].sum=tree[lc].sum|tree[rc].sum;
}
void change(int k,int l,int r,int x,int d){
	if(l==r){
		b[l]=d;
		tree[k].maxx=a[l];
		tree[k].minn=inf,tree[k].sum=b[l];
		if(b[l]>=K) tree[k].minn=a[l];
		tree[k].lmax.clear();
		tree[k].lmax.push_back(qwq{b[l],a[l]});
		tree[k].rmax.clear();
		tree[k].rmax.push_back(qwq{b[l],a[l]});
		return ;
	}
	int mid=l+r>>1;
	if(x<=mid) change(ls,x,d);
	else change(rs,x,d);
	tree[k].lmax.clear(); 
	tree[k].rmax.clear();
	tree[k].maxx=max(tree[lc].maxx,tree[rc].maxx);
	for(auto v:tree[lc].lmax) tree[k].lmax.push_back(v);
	for(auto v:tree[rc].lmax){
		if((tree[lc].sum|v.sum)==tree[lc].sum) continue;
		tree[k].lmax.push_back(qwq{tree[lc].sum|v.sum,max(tree[lc].maxx,v.val)});
	}
	for(auto v:tree[rc].rmax) tree[k].rmax.push_back(v);
	for(auto v:tree[lc].rmax){
		if((tree[rc].sum|v.sum)==tree[rc].sum) continue;
		tree[k].rmax.push_back(qwq{v.sum|tree[rc].sum,max(v.val,tree[rc].maxx)});
	}
	tree[k].minn=min(tree[lc].minn,tree[rc].minn);
	pre1[0]=tree[lc].rmax[0].val;
	pre2[0]=tree[rc].lmax[0].val;
	for(int i=1;i<tree[lc].rmax.size();i++)
		pre1[i]=max(pre1[i-1],tree[lc].rmax[i].val);
	for(int i=1;i<tree[rc].lmax.size();i++)
		pre2[i]=max(pre2[i-1],tree[rc].lmax[i].val);
	for(int r1=0,r2=tree[rc].lmax.size()-1;r1<tree[lc].rmax.size();r1++){
		while((r2>0)&&((tree[lc].rmax[r1].sum|tree[rc].lmax[r2-1].sum)>=K))
			r2--;
		if((tree[lc].rmax[r1].sum|tree[rc].lmax[r2].sum)>=K)
			tree[k].minn=min(tree[k].minn,max(pre1[r1],pre2[r2]));
	}
	tree[k].sum=tree[lc].sum|tree[rc].sum;
}
void query(int k,int l,int r,int x,int y){
	if(x<=l&&r<=y){
		if(x==l) ans=tree[k];
		else{
			las=ans;
			ans.lmax.clear();
			ans.rmax.clear();
			ans.maxx=max(las.maxx,tree[k].maxx);
			for(auto v:las.lmax) ans.lmax.push_back(v);
			for(auto v:tree[k].lmax){
				if((las.sum|v.sum)==las.sum) continue;
				ans.lmax.push_back(qwq{las.sum|v.sum,max(las.maxx,v.val)});
			}
			for(auto v:tree[k].rmax) ans.rmax.push_back(v);
			for(auto v:las.rmax){
				if((tree[k].sum|v.sum)==tree[k].sum) continue;
				ans.rmax.push_back(qwq{v.sum|tree[k].sum,max(v.val,tree[k].maxx)});
			}
			ans.minn=min(las.minn,tree[k].minn);
			pre1[0]=las.rmax[0].val;
			pre2[0]=tree[k].lmax[0].val;
			for(int i=1;i<las.rmax.size();i++)
				pre1[i]=max(pre1[i-1],las.rmax[i].val);
			for(int i=1;i<tree[k].lmax.size();i++)
				pre2[i]=max(pre2[i-1],tree[k].lmax[i].val);
			for(int r1=0,r2=tree[k].lmax.size()-1;r1<las.rmax.size();r1++){
				while((r2>0)&&((las.rmax[r1].sum|tree[k].lmax[r2-1].sum)>=K))
					r2--;
				if((las.rmax[r1].sum|tree[k].lmax[r2].sum)>=K)
					ans.minn=min(ans.minn,max(pre1[r1],pre2[r2]));
			}
			ans.sum=las.sum|tree[k].sum;
		}
		return ;
	}
	int mid=l+r>>1;
	if(x<=mid) query(ls,x,y);
	if(mid<y) query(rs,x,y);
}
char *p1,*p2,buf[1000005];
#define nc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++)
int read(){
	int x=0,f=1;char ch=nc();
	while(ch<48||ch>57){if(ch=='-')f=-1;ch=nc();}
	while(ch>=48&&ch<=57){x=x*10+ch-48,ch=nc();}
	return x*f;
}
int main(){
	t=read();
	while(t--){
		n=read();K=read();
		for(int i=1;i<=n;i++) a[i]=read();
		for(int i=1;i<=n;i++) b[i]=read();
		pre(1,1,n);
		q=read();
		int op,x,y;
		while(q--){
			op=read();x=read();y=read();
			if(op==1) change(1,1,n,x,y);
			else{
				ans.sum=0,ans.minn=ans.maxx=inf;
				ans.lmax.clear();
				ans.rmax.clear();
				query(1,1,n,x,y);
				if(ans.minn==inf) printf("-1 ");
				else printf("%d ",ans.minn);
			}
		}
		puts("");
	}
	return 0;
}
2024/3/19 13:37
加载中...