社区讨论
样例过不了求助玄关
P8856[POI 2002] 火车线路参与者 1已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @lqhhao6l
- 此快照首次捕获于
- 2023/12/23 11:06 2 年前
- 此快照最后确认于
- 2023/12/23 13:46 2 年前
变量 就是通常所写的 。
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 条回复,欢迎继续交流。
正在加载回复...