TLE#1#10线段树求调
查看原帖
TLE#1#10线段树求调
921880
2022xsj楼主2024/7/16 19:40

提交记录在这里

#include<iostream>
#define ll long long
using namespace std;
ll c,s,r;
struct node{
	ll l;
	ll r;
	node* lc;
	node* rc;
	ll minn;
	ll crazycat;
} tr;
void build(node& rt,ll l,ll r){
	rt.l=l;rt.r=r;rt.minn=s;rt.crazycat=0;
	if(l==r) return;
	ll mid=(l+r)>>1;
	rt.lc=new node;
	rt.rc=new node;
	build(*rt.lc,l,mid);
	build(*rt.rc,mid+1,r);
	return;
}
void pushdown(node& rt){
	node &lc=*(rt.lc),&rc=*(rt.rc);
	lc.crazycat+=rt.crazycat;
	rc.crazycat+=rt.crazycat;
	lc.minn-=rt.crazycat;
	rc.minn-=rt.crazycat;
	rt.crazycat=0;
	return;
}
void reduce(node &rt,ll l,ll r,ll k){
	if(rt.r<l||r<rt.l) return;
	if(l<=rt.l&&rt.r<=r){
		rt.crazycat+=k;
		rt.minn-=k;
		return;
	}
	pushdown(rt);
	reduce(*(rt.lc),l,r,k);
	reduce(*(rt.rc),l,r,k);
	rt.minn=min(rt.lc->minn,rt.rc->minn);
	return;
}
ll visit(node &rt,ll l,ll r){
	if(rt.r<l||r<rt.l) return s;
	if(l<=rt.l&&rt.r<=r) return rt.minn;
	pushdown(rt);
	rt.minn=min(rt.lc->minn,rt.rc->minn);
	int a=visit(*(rt.lc),l,r),b=visit(*(rt.rc),l,r);
	return min(a,b);
}
int main(void){
	cin>>c>>s>>r;
	build(tr,1,c);
	for(int i=0;i<r;i++){
		int o,d,n,l;cin>>o>>d>>n;
		if(visit(tr,o,d-1)>=n){
			cout<<"T\n";
			reduce(tr,o,d-1,n);
		}else{
			cout<<"N\n";
		}
	}
	return 0;
} 
2024/7/16 19:40
加载中...