蒟蒻不知道为什么RE了,第四个操作用的是线段树,求助!
查看原帖
蒟蒻不知道为什么RE了,第四个操作用的是线段树,求助!
648772
Liyuqiao11楼主2023/8/28 20:53
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
int c,q,l=1,r,sum[N];
struct Q{
	int s;
	int e;
}a[N];
struct T{
	int l;
	int r;
	int maxn;
}t[N*4];
void pushup(int i){
	t[i].maxn=max(t[i*2].maxn,t[i*2+1].maxn);
}
void build(int i,int l,int r){
	t[i].l=l;
	t[i].r=r;
	if(l==r){
		t[i].maxn=0;
		return;
	}
	int mid=(l+r)/2;
	build(i*2,l,mid);
	build(i*2+1,mid+1,r);
	pushup(i);
}
void update(int x,int i,int y){
	if(t[i].l==y&&t[i].r==y){
		t[i].maxn=x;
		return;
	}
	int mid=(t[i].l+t[i].r)/2;
	if(y<=mid){
		update(x,i*2,y);
	} 
	else{
		update(x,i*2+1,y);
	}
	pushup(i);
}
int query(int i,int l,int r){
	if(t[i].l>=l&&t[i].r<=r){
		return t[i].maxn;
	} 
	int ans=0;
	if(t[i*2].r>=l){
		ans=max(ans,query(i*2,l,r));
	}
	if(t[i*2+1].l<=r){
		ans=max(ans,query(i*2+1,l,r));
	}
	return ans;
}
int main(){
	cin>>c>>q;
	build(1,1,q);
	for(int i=1;i<=q;i++){
		int op;
		cin>>op;
		if(op==1){
			int x;
			cin>>x;
			r++;
			a[r].s=1;
			a[r].e=x;
			sum[r]=sum[r-1]+x;
			update(x,l,r);
		}
		if(op==2){
			int y,m=a[l].e-a[l].s+1;
			cin>>y;
			if(y<=m){
				a[l].s=a[l].s+y;
				continue;
			}
			int x=lower_bound(sum+l+1,sum+r+1,y+sum[l]-m)-sum;
			int dc=sum[x]-sum[l];
			int tmp=dc+m-y;
			a[x].s=a[x].e-tmp+1;
			l=x; 
		}
		if(op==3){
			int z,m=a[l].e-a[l].s+1;
			cin>>z;
			if(z<=m){
				cout<<a[l].s+z-1<<endl;
				continue;
			}
			int x=lower_bound(sum+l+1,sum+r+1,z+sum[l]-m)-sum;
			int dc=sum[x]-sum[l];
			int tmp=dc+m-z;
			cout<<a[x].e-tmp<<endl;
		}
		if(op==4){
			cout<<query(1,l,r)<<endl;
		}
	}
	return 0;
}
2023/8/28 20:53
加载中...