求助,线段树此题80分,WA+RE
查看原帖
求助,线段树此题80分,WA+RE
305891
Eraine楼主2022/1/25 20:52

话说为什么WA了……

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
struct segTree{
	int l,r;
	int val;
	int lz;//lazy_tag
}tree[400005];
struct node{
	int val;
	int id;
	friend bool operator<(node x,node y){
		return x.val<y.val;
	}
}num[100005];
struct Question{
	int opt;
	int l,r;
}Q[100005];
int n,m,a[100005],k;
void build(int id,int l,int r){
	tree[id].l=l;
	tree[id].r=r;
	tree[id].lz=-1;
	if(l==r){
		tree[id].val=a[l];
		return;
	}
	int mid,lc,rc;
	mid=(l+r)/2;
	lc=2*id,rc=2*id+1;
	build(lc,l,mid);
	build(rc,mid+1,r);
	tree[id].val=tree[lc].val+tree[rc].val;
}
void lazy(int id,int val){
	tree[id].val=val*(tree[id].r-tree[id].l+1);
	tree[id].lz=val;
}
void pushup(int id,int val){
	lazy(2*id,val);
	lazy(2*id+1,val);
	tree[id].lz=-1;
}
void update(int id,int l,int r,int val){
	if(l<=tree[id].l&&r>=tree[id].r)
		return lazy(id,val);
	if(tree[id].lz!=-1)
		pushup(id,tree[id].lz);
	int mid,lc,rc;
	mid=(tree[id].l+tree[id].r)/2;
	lc=2*id,rc=2*id+1;
	if(l<=mid)
		update(lc,l,r,val);
	if(r>mid)
		update(rc,l,r,val);
	tree[id].val=tree[lc].val+tree[rc].val;
}
int query(int id,int l,int r){
	if(l<=tree[id].l&&r>=tree[id].r)
		return tree[id].val;
	if(tree[id].lz!=-1)
		pushup(id,tree[id].lz);
	int mid,lc,rc,sum=0;
	mid=(tree[id].l+tree[id].r)/2;
	lc=2*id,rc=2*id+1;
	if(l<=mid)
		sum+=query(lc,l,r);
	if(r>mid)
		sum+=query(rc,l,r);
	return sum;
}
int check(int x){
	memset(tree,0,sizeof(tree));
	memset(a,0,sizeof(a));
	for(int i=x+1;i<=n;i++)
		a[num[i].id]=1;
	build(1,1,n);
	for(int i=1;i<=m;i++){
		int opt=Q[i].opt;
		int l=Q[i].l,r=Q[i].r;
		int sum=query(1,l,r),mid;
		if(opt){
			mid=l+sum-1;
			update(1,l,mid,1);
			update(1,mid+1,r,0);
		}else{
			mid=r-sum;
			update(1,l,mid,0);
			update(1,mid+1,r,1);
		}
	}
	return query(1,k,k);
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		scanf("%d",&num[i].val);
	for(int i=1;i<=n;i++)
		num[i].id=i;
	sort(num+1,num+n+1);
	for(int i=1;i<=m;i++)
		scanf("%d%d%d",&Q[i].opt,&Q[i].l,&Q[i].r);
	scanf("%d",&k);
	int l=1,r=n,ans=0;
	while(l<=r){
		int mid=(l+r)/2;
		if(check(mid))
			l=mid+1,ans=mid;
		else
			r=mid-1;
	}
	printf("%d\n",num[ans].val+1);
	return 0;
}
2022/1/25 20:52
加载中...