80分 整体二分求助
查看原帖
80分 整体二分求助
551803
BPG_ning楼主2023/8/16 16:40
#include<bits/stdc++.h>
using namespace std; 
typedef long long LL;
const int N=1e6+10,inf=(1<<30)+10;
int a[N],T[N<<2],lazy[N<<2];
inline int rd(){
	int x=0; char o=getchar();
	while(!isdigit(o))o=getchar();
	while(isdigit(o))x=x*10+o-'0',o=getchar();
	return x;
}
inline void wr(int x){
	if(x<0) putchar('-'),x=-x;
	if(x>=10) wr(x/10);
	putchar(x%10+'0'); 
}
inline void build(int x,int l,int r){
// 	lazy[x]=0;
	if(l==r){T[x]=a[l];return ;}
	int mid=(l+r)>>1;
	build(x<<1,l,mid);
	build(x<<1|1,mid+1,r);
	T[x]=(T[x<<1]&T[x<<1|1]);
} 
inline void pushdown(int x){
	if(lazy[x]){
		T[x]|=lazy[x];
		lazy[x<<1]|=lazy[x];
		lazy[x<<1|1]|=lazy[x];
		lazy[x]=0;
	}
}
inline void update(int x,int L,int R,int l,int r,int w){
	if((T[x]|w)==T[x]) return ;
	if(l<=L&&R<=r){
		lazy[x]|=w;
		pushdown(x);
		return ;
	}
	pushdown(x);
	int mid=(L+R)>>1;
	if(mid>=l) update(x<<1,L,mid,l,r,w);
	if(mid+1<=r) update(x<<1|1,mid+1,R,l,r,w);
	T[x]=(T[x<<1]&T[x<<1|1]);
	return ;
}
inline int query(int x,int L,int R,int k){
	if(L==R){
		pushdown(x);
		return T[x];
	}
	pushdown(x);
	int mid=(L+R)>>1;
	if(mid>=k) return query(x<<1,L,mid,k);
	else return query(x<<1|1,mid+1,R,k);
}
struct node{int l,r,id;}b[N];
inline bool cmp(node a,node b){return a.l<b.l;}
inline bool cmp_id(node a,node b){return a.id<b.id;}
int n,m,p,L[N],R[N],v[N];
int main(){
    ios::sync_with_stdio(false);
    std::cin.tie(0);
    std::cout.tie(0); 
  	freopen("nzq.in","r",stdin);
  	freopen("nzq.out","w",stdout);
 	n=rd(),m=rd(),p=rd();
 	for(int i=1;i<=n;i++) a[i]=rd(),b[i].id=i,b[i].l=1,b[i].r=m+1;
 	for(int i=1;i<=m;i++) L[i]=rd(),R[i]=rd(),v[i]=rd();
// 	L[m+1]=1,R[m+1]=n,v[m+1]=inf;
 	int j,mid,x;
	for(int cnt=0,c=1;cnt<n&&c<=23;c++){
// 		memset(T,0,sizeof(T));
		memset(lazy,0,sizeof(lazy));
		build(1,1,n);
		sort(b+1,b+1+n,cmp);
		j=1;
		for(int i=1;i<=n;i++){
			if(b[i].l==b[i].r)continue;
			mid=(b[i].l+b[i].r)>>1;
			while(j<=mid){
				update(1,1,n,L[j],R[j],v[j]);
				j++;
			}
			x=query(1,1,n,b[i].id);
			if(x>p) b[i].r=mid;
			else b[i].l=mid+1;
//			cout<<b[i].id<<' '<<mid<<' '<<b[i].l<<' '<<b[i].r<<' '<<x<<endl;
			if(b[i].l==b[i].r){
				cnt++;
			}
		}
//		cout<<endl;
	} 
//	build(1,1,n);
//	for(int i=1;i<=m;i++) update(1,1,n,L[i],R[i],v[i]);
//	for(int i=1;i<=n;i++) if(query(1,1,n,i)<=p) b[i].l=b[i].r=-1;
	sort(b+1,b+1+n,cmp_id);
	for(int i=1;i<=n;i++) wr(b[i].l==m+1?-1:b[i].l),putchar(' ');
    return 0;
}

做法为整体二分,O2后WA第9,10点

2023/8/16 16:40
加载中...