社区讨论

8分,求助!

P8856[POI 2002] 火车线路参与者 2已保存回复 9

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
9 条
当前快照
1 份
快照标识符
@lo1x10t5
此快照首次捕获于
2023/10/23 04:22
2 年前
此快照最后确认于
2023/11/03 04:49
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int MAXN=1e4+10;

int C,S,R;
struct node
{
	int l,r;
	int maxn;
} tr[MAXN*24];

void Pushup(node &u,node &l,node &r)
{
	u.maxn=max(l.maxn,r.maxn);
}

void pushup(int u)
{
	Pushup(tr[u],tr[u<<1],tr[u<<1|1]);
}

void build(int u,int l,int r)
{
	if(l==r)
	{
		tr[u]= {l,r,0};
	}
	else
	{
		tr[u].l=l,tr[u].r=r;
		int mid=l+r>>1;
		build(u<<1,l,mid);
		build(u<<1|1,mid+1,r);
		pushup(u);
	}
}

void change(int u,int x,int v)
{
	if(tr[u].l==x && tr[u].r==x)
	{
		tr[u]= {x,x,tr[u].maxn+v};
	}
	else
	{
		int mid=tr[u].l+tr[u].r>>1;
		if(x<=mid) change(u<<1,x,v);
		else change(u<<1|1,x,v);
		pushup(u);
	}
}

node query(int u,int l,int r)
{
	if(tr[u].l>=l && tr[u].r<=r) return tr[u];
	else
	{
		int mid=tr[u].l+tr[u].r>>1;
		if(r<=mid) return query(u<<1,l,r);
		else if(l>mid) return query(u<<1|1,l,r);
		else
		{
			auto left=query(u<<1,l,r);
			auto right=query(u<<1|1,l,r);
			node res;
			Pushup(res,left,right);
			return res;
		}
	}
}

int main()
{
	cin>>C>>S>>R;
	build(1,1,C);
	for(int i=1; i<=R; i++)
	{
		int l,r,d;
		cin>>l>>r>>d;
		if(S-query(1,l,r).maxn>=d)
		{
			change(1,l,d);
			if(r+1<=R)change(1,r+1,-d);
			cout<<"T"<<endl;
		}
		else
		{
			cout<<"N"<<endl;
		}
	}
	return 0;
}

回复

9 条回复,欢迎继续交流。

正在加载回复...