就是线段树维护区间的最小值 但是要注意 本题坑人的地方 是 a到b站 实际上是维护a到b-1 因为b站已经下车了 我勒个去呀


#include<iostream> #include<cstdio> #include<cmath> #include<vector> #include<algorithm> #define lson rt<<1 #define rson rt<<1|1 #define getmid int mid=(l+r)/2 using namespace std; const int maxn=4000000; int n,m,k,mins[maxn*4],tag[maxn*4]; void pushdown(int rt) { if(tag[rt]!=0) { mins[rt]+=tag[rt]; tag[lson]+=tag[rt]; tag[rson]+=tag[rt]; tag[rt]=0; } } void bud(int l,int r,int rt) { if(l==r) { mins[rt]=m; return; } getmid; bud(l,mid,lson); bud(mid+1,r,rson); mins[rt]=min(mins[lson],mins[rson]); } int query(int l,int r,int rt,int a,int b) { pushdown(rt); if(a<=l && b>=r) { return mins[rt]; } getmid; int ans=1<<30; if(a<=mid) ans=query(l,mid,lson,a,b); if(b>mid) ans=min(ans,query(mid+1,r,rson,a,b)); return ans; } void update(int l,int r,int rt,int a,int b,int c) { pushdown(rt); if(a<=l && b>=r) { tag[rt]+=c; return; } getmid; if(a<=mid) update(l,mid,lson,a,b,c); if(b>mid) update(mid+1,r,rson,a,b,c); mins[rt]=min(mins[lson]+tag[lson],mins[rson]+tag[rson]); } int main() { scanf("%d%d%d",&n,&m,&k); bud(1,n,1); for(int i=1,a,b,c;i<=k;i++) { scanf("%d%d%d",&a,&b,&c); int tt=query(1,n,1,a,b-1); if(tt>=c) { printf("T\n"); update(1,n,1,a,b-1,-c); } else { printf("N\n"); } } return 0; }