连样例都过不掉,哪位Dalao帮忙看一下
查看原帖
连样例都过不掉,哪位Dalao帮忙看一下
136939
tanghairong楼主2021/8/25 10:47
#include<iostream>
using namespace std;
struct tree{
	int l,r,len,lsum,rsum,sum,lazy;
}a[200005];
void build(int k,int l,int r){
	a[k].l=l,a[k].r=r;
	a[k].len=a[k].lsum=a[k].rsum=a[k].sum=r-l+1;
	if(l==r)return;
	int mid=(l+r)/2;
	build(k*2,l,mid);
	build(k*2+1,mid+1,r);
}
void pushdown(int k){
	if(a[k].lazy==1){
		a[k*2].sum=a[k*2].lsum=a[k*2].rsum=0;
		a[k*2+1].sum=a[k*2+1].lsum=a[k*2+1].rsum=0;
		a[k*2].lazy=a[k*2+1].lazy=1;
		a[k].lazy=0;
	}
	if(a[k].lazy==2){
		a[k*2].sum=a[k*2].lsum=a[k*2].rsum=a[k*2].len;
		a[k*2+1].sum=a[k*2+1].lsum=a[k*2+1].rsum=a[k*2+1].len;
		a[k*2].lazy=a[k*2+1].lazy=2;
		a[k].lazy=0;
	}
}
void change(int k,int l,int r,int flag){
	if(l<=a[k].l&&r>=a[k].r){
		if(flag==1)a[k].lsum=a[k].rsum=a[k].sum=0;
		if(flag==2)a[k].lsum=a[k].rsum=a[k].sum=a[k].len;
		a[k].lazy=flag;
		return;
	}
	pushdown(k);
	if(l<=a[k*2].r)change(k*2,l,r,flag);
	if(r>=a[k*2+1].l)change(k*2+1,l,r,flag);
	if(a[k*2].sum=a[k*2].len)a[k].lsum=a[k*2].sum+a[k*2+1].lsum;
	else a[k].lsum=a[k*2].lsum;
	if(a[k*2+1].sum=a[k*2+1].len)a[k].rsum=a[k*2+1].sum+a[k*2].rsum;
	else a[k].rsum=a[k*2+1].rsum;
	a[k].sum=max(max(a[k*2].sum,a[k*2+1].sum),a[k*2].rsum+a[k*2+1].lsum);
}
int query(int k,int sum){
	pushdown(k);
	if(a[k].l==a[k].r)return a[k].l;
	if(a[k*2].sum>=sum)return query(k*2,sum);
	if(a[k*2].rsum+a[k*2+1].lsum>=sum)return (a[k].l+a[k].r)/2-a[k*2].rsum+1;
	if(a[k*2+1].sum>=sum)return query(k*2+1,sum);
}
int main(){
	int n,m;
	cin>>n>>m;
	build(1,1,n);
	for(int i=1;i<=m;i++){
		int flag,x,y;
		cin>>flag>>x;
		if(flag==1){
			if(a[1].sum<x){cout<<0<<endl;continue;}
			int k=query(1,x);
			cout<<k<<endl;
			change(1,k,k+x-1,1);
		}
		if(flag==2){
			cin>>y;
			change(1,x,x+y-1,2);
		}
	}
	return 0;
}

这个代码做了两三个小时了,调了半天,连样例都过不掉。请发现问题的Dalao们@我一下,感激不尽!!!

2021/8/25 10:47
加载中...