关于线段树连样例都过不了这件事
查看原帖
关于线段树连样例都过不了这件事
541916
RiceFruit楼主2022/7/8 08:51

本蒟蒻写了个线段树,结果最后一个输出挂了,有大佬帮调吗?

#include<bits/stdc++.h>
using namespace std;
#define lid (id<<1)
#define rid (id<<1|1)
#define ll long long
#define ull unsigned long long
const int N=2e5+5,mod=1e9+7;
inline void sleep(int p);
inline int read();
inline int read(int mod);
int n,m;
struct sa{
	int l,r,mlr,lr;
	int lmax,rmax,smax;
	int tag;
}tree[N<<1];
void print(int id){
	printf("%d:%d~%dlm:%drm:%dsm:%dlz:%d\n",id,tree[id].l,tree[id].r,tree[id].lmax,tree[id].rmax,tree[id].smax,tree[id].tag);
	return;
}
void pushup(int id){
	tree[id].lmax=tree[lid].lmax,tree[id].rmax=tree[rid].rmax;
	if(tree[lid].lmax==tree[lid].lr)tree[id].lmax=tree[lid].lr+tree[rid].lmax;
	if(tree[rid].rmax==tree[rid].lr)tree[id].rmax=tree[rid].lr+tree[lid].rmax;
	tree[id].smax=max(max(tree[lid].smax,tree[rid].smax),tree[lid].rmax+tree[rid].lmax);
	return;
}
void pushdown(int id){
	if(tree[id].tag==0||tree[id].lr==1)return ;
	if(tree[id].tag==1){//搬空 
		tree[lid].lmax=tree[lid].rmax=tree[lid].smax=tree[lid].lr;
		tree[rid].lmax=tree[rid].rmax=tree[rid].smax=tree[rid].lr;
		tree[id].tag=0;
		tree[lid].tag=tree[rid].tag=1;
	}
	else{
		tree[lid].lmax=tree[lid].rmax=tree[lid].smax=0;
		tree[rid].lmax=tree[rid].rmax=tree[rid].smax=0;
		tree[id].tag=0;
		tree[lid].tag=tree[rid].tag=2;
	}
	return;
}
void build(int id,int l,int r){
	tree[id].l=l,tree[id].r=r,tree[id].lr=r-l+1,tree[id].mlr=l+r>>1;
	if(l==r){
		tree[id].lmax=tree[id].rmax=tree[id].smax=1;
		return;
	}
	build(lid,l,tree[id].mlr);
	build(rid,tree[id].mlr+1,r);
	pushup(id);
	return;
}
void update(int id,int l,int r,int op){
	pushdown(id);
	if(tree[id].l>r||tree[id].r<l)return;
	if(tree[id].l>=l&&tree[id].r<=r){
		tree[id].lmax=tree[id].rmax=tree[id].smax=tree[id].lr*(op-1);
		tree[id].tag=op;
		return;
	}
	if(l<=tree[id].mlr)update(lid,l,r,op);
	if(tree[id].mlr+1<=r)update(rid,l,r,op);
	pushup(id);
	return;
}
int query(int id,int len){
	pushdown(id);
	if(tree[id].l==tree[id].r)return tree[id].l;
	if(tree[lid].smax>=len)return query(lid,len);
	if(tree[lid].rmax+tree[rid].lmax)return tree[id].mlr-tree[lid].rmax+1;
	return query(rid,len);
}
int main(){
	n=read(),m=read();
	build(1,1,n);
	while(m--){
		int op;
		op=read();
		if(op==1){
			int len=read();
			if(tree[1].smax<len)printf("0\n");
			else {
				int l=query(1,len);
				update(1,l,l+len-1,1);
				printf("%d\n",l);
			}
		}
		else{
			int l=read(),r=read();r=l+r-1;
			update(1,l,r,2);
		}
	}
	return 0;
}
inline void sleep(int p){for(int i=1;i<=100000*p;i++)int x;return;}
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;}
inline int read(int p){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();x=x%p;}return x*f;}
2022/7/8 08:51
加载中...