社区讨论

样例过不了求助玄关

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

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@lqhhao6l
此快照首次捕获于
2023/12/23 11:06
2 年前
此快照最后确认于
2023/12/23 13:46
2 年前
查看原帖
变量 oo 就是通常所写的 pp
CPP
#include<cstdio>
#include<algorithm>
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)
#define int long long
using namespace std;
int n,ss,r,ll,rr,xx;
int a[1919810],s[8989110],tag[8989110];
void update(int,int,int,int,int,int);//o,l,r,x,y,k
int query(int,int,int,int,int);//o,l,r,x,y
void addtag(int,int,int,int);
void downtag(int,int,int,int);
void push_up(int);
void build(int,int,int);
signed main(){
	scanf("%lld%lld%lld",&n,&ss,&r);
	for(int i=1;i<=n;++i){
		a[i]=ss;
	}
	build(1,1,n);
	while(r--){
		scanf("%lld%lld%lld",&ll,&rr,&xx);
		if(query(1,1,n,ll,rr-1)>=xx){
			printf("T\n");
			update(1,1,n,ll,rr-1,-xx);
		}else
			printf("N\n");
		printf("%lld\n",query(1,1,n,ll,rr-1));
	}
}
int query(int o,int l,int r,int x,int y){
	int v1,v2;
	if(x>r||y<l)
		return -2e9;
	if(x<=l&&r<=y)
		return s[o];
	int mid=(l+r)>>1;
	downtag(o,l,r,mid);
	v1=query(ls(o),l,mid,x,y);
	v2=query(rs(o),mid+1,r,x,y);
	return min(v1,v2);
}
void build(int o,int l,int r){
	tag[o]=0;
	if(l==r){
		s[o]=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(ls(o),l,mid);
	build(rs(o),mid+1,r);
	push_up(o);
}
void update(int o,int l,int r,int x,int y,int k){
	if(l>y||r<x)
		return;
	if(x<=l&&r<=y){
		addtag(o,l,r,k);
		return;
	}
	int mid=(l+r)>>1;
	downtag(o,l,r,mid);
	update(ls(o),l,mid,x,y,k);
	update(rs(o),mid+1,r,x,y,k);
	push_up(o);
}
void downtag(int o,int l,int r,int mid){
	if(tag[o]==0)
		return;
	addtag(ls(o),l,mid,tag[o]);
	addtag(rs(o),mid+1,r,tag[o]);
	tag[o]=0;
}
void addtag(int o,int l,int r,int k){
	s[o]+=k;
	tag[o]+=k;
}
void push_up(int o){
	s[o]=min(s[ls(o)],s[rs(o)]);
}

回复

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

正在加载回复...