萌新刚学OI,10pts请求DEBUG!
  • 板块学术版
  • 楼主Hisy
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/10/19 09:29
  • 上次更新2024/10/19 09:33:18
查看原帖
萌新刚学OI,10pts请求DEBUG!
922691
Hisy楼主2024/10/19 09:29

样例都没过,竟然能够拿 1010 分,这还是意想不到的。

提交记录

代码:

#include<bits/stdc++.h>
#define MAXN 1000010
using namespace std;
struct node{
	int l,r,w;
}que[MAXN];
struct Node{
	int val,lazy;
}tree[MAXN<<2];
int n,q,p,a[MAXN],b[MAXN],ans[MAXN],lson[MAXN],rson[MAXN];
inline void push_down(int root){
	const int lazy=tree[root].lazy;
	tree[root<<1].lazy|=lazy;
	tree[root<<1].val|=lazy;
	tree[root<<1|1].lazy|=lazy;
	tree[root<<1|1].val|=lazy;
	tree[root].lazy=0;
}
void change(int root,int l,int r,int L,int R,int val){
	if(L<=l&&r<=R){
		tree[root].lazy|=val;
		tree[root].val|=val;
		return;
	}
	int mid=(l+r)>>1;
	push_down(root);
	if(L<=mid){
		change(root<<1,l,mid,L,R,val);
	}
	if(mid<R){
		change(root<<1|1,mid+1,r,L,R,val);
	}
}
int query(int root,int l,int r,int Q){
	if(l==r){
		return tree[root].val;
	}
	int mid=(l+r)>>1;
	push_down(root);
	if(Q<=mid){
		return query(root<<1,l,mid,Q);
	}
	return query(root<<1|1,mid+1,r,Q); 
}
void modify(int root,int l,int r,int Q,int val){
	if(l==r){
		tree[root].val=val;
		return;
	}
	int mid=(l+r)>>1;
	push_down(root);
	if(Q<=mid){
		modify(root<<1,l,mid,Q,val);
	}else{
		modify(root<<1|1,mid+1,r,Q,val);
	}
}
void solve(int l,int r,int L,int R){
    if(l>r){
    	return;
	}
    if(L==R){
        for(int i=l;i<=r;++i){
        	ans[b[i]]=L;
		}
        return;
    }
    int mid=(L+R)>>1,ltop=0,rtop=0;
    for(int i=L;i<=mid;++i){
    	change(1,1,n,que[i].l,que[i].r,que[i].w);
	}
    for(int i=l;i<=r;++i){
        int sum=query(1,1,n,b[i]);
        if((sum|a[b[i]])<=p){
			rson[++rtop]=b[i];
			change(1,1,n,b[i],b[i],sum);
		}else{
			lson[++ltop]=b[i];
		}
    }
//    cout<<l<<" "<<r<<":"<<endl<<"lson:";
    for(int i=1;i<=ltop;++i){
    	b[i+l-1]=lson[i];
//    	cout<<lson[i]<<" ";
	}
//	cout<<endl<<"rson:";
    for(int i=1;i<=rtop;++i){
    	b[i+l+ltop-1]=rson[i];
//    	cout<<rson[i]<<" ";
	}
//	cout<<endl;
    solve(l,l+ltop-1,L,mid);
    solve(l+ltop,r,mid+1,R);
}
int main(){
	scanf("%d %d %d",&n,&q,&p);
	que[q+1]=((node){1,n,p});
	for(int i=1;i<=n;++i){
		scanf("%d",&a[i]);
		b[i]=i;
	}
	for(int i=1;i<=q;++i){
		scanf("%d %d %d",&que[i].l,&que[i].r,&que[i].w);
	}
	solve(1,n,1,q+1);
	for(int i=1;i<=n;++i){
		printf("%d ",ans[i]==q+1?-1:ans[i]);
	}
	return 0;
}
2024/10/19 09:29
加载中...