这是我的代码:
#include<iostream>
#include<cstdio>
#define INF 999999999
using namespace std;
const int maxn=200005;
int c,s,r;
struct wk{int a,b,lazy,minn;} tree[4*maxn];
void bd(int p,int x,int y)
{
tree[p].a=x;tree[p].b=y;
tree[p].minn=s;
if(x<y)
{
int mid=(x+y)>>1;
bd(p<<1,x,mid);
bd(p<<1|1,mid+1,y);
}
}
void putdown(int r)
{
tree[r<<1].minn-=tree[r].lazy;
tree[r<<1].lazy+=tree[r].lazy;
tree[r<<1|1].minn-=tree[r].lazy;
tree[r<<1|1].lazy+=tree[r].lazy;
tree[r].lazy=0;
}
int getnum(int r,int x,int y)
{
if(tree[r].lazy) printf("aqaaaa\n"),putdown(r);
if(x<=tree[r].a&&tree[r].b<=y)return tree[r].minn;
int ls=INF,lz=INF,mid=(tree[r].a+tree[r].b)>>1;
if(mid>=x) ls=getnum(r<<1,x,y);
if(y>mid) ls=getnum(r<<1|1,x,y);
return printf("%d\n",min(ls,lz)),min(ls,lz);
}
void add(int r,int x,int y,int z)
{
if(tree[r].lazy)putdown(r);
if(x<=tree[r].a&&tree[r].b<=y)
{
tree[r].minn-=z;
tree[r].lazy+=z;
return;
}
int mid=(tree[r].a+tree[r].b)>>1;
if(mid>=x) add(r<<1,x,y,z);
if(mid<y) add(r<<1|1,x,y,z);
tree[r].minn=min(tree[r<<1].minn,tree[r<<1|1].minn);
}
int main()
{
scanf("%d%d%d",&c,&s,&r);
bd(1,1,c);
for(int i=1;i<=r;i++)
{
int xx,yy,zz;
cin>>xx>>yy>>zz;
yy--;
int vd=getnum(1,xx,yy);
printf("%d\n",vd);
if(zz<=vd)
{
printf("T\n");
add(1,xx,yy,zz);
}
else printf("N\n");
}
return 0;
}
这是题解的:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <stdio.h>
using namespace std;
#define maxn 480000
#define inf 999999999
struct node{
int l,r,n,lazy;
};
node tree[maxn];
int c,s,r;
void bt(int p,int x,int y)
{
tree[p].l=x;tree[p].r=y;
tree[p].n=s;
if(x<y)
{
int mid=(x+y)>>1;
bt(p<<1,x,mid);
bt(p<<1|1,mid+1,y);
}
}
void pd(int k)
{
tree[k<<1].n-=tree[k].lazy;
tree[k<<1].lazy+=tree[k].lazy;;
tree[k<<1|1].n-=tree[k].lazy;
tree[k<<1|1].lazy+=tree[k].lazy;
tree[k].lazy=0;
}
int query(int k,int x,int y)
{
if(tree[k].lazy) printf("aqaaaa\n"),pd(k);
if(x<=tree[k].l&&tree[k].r<=y) return tree[k].n;
int lm=inf,rm=inf,mid=(tree[k].l+tree[k].r)>>1;
if(mid>=x) lm=query(k<<1,x,y);
if(y>mid) rm=query(k<<1|1,x,y);
return printf("%d\n",min(lm,rm)),min(lm,rm);
}
void change(int k,int x,int y,int z)
{
if(tree[k].lazy) pd(k);
if(x<=tree[k].l&&tree[k].r<=y)
{
tree[k].n-=z;
tree[k].lazy+=z;
return;
}
int mid=(tree[k].l+tree[k].r)>>1;
if(mid>=x) change(k<<1,x,y,z);
if(mid<y) change(k<<1|1,x,y,z);
tree[k].n=min(tree[k<<1].n,tree[k<<1|1].n);
}
int main()
{
scanf("%d%d%d",&c,&s,&r);
bt(1,1,c);
int i;
for(i=1;i<=r;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
y--;
int temp=query(1,x,y);
printf("%d\n",temp);
if(z<=temp){
cout<<"T"<<endl;
change(1,x,y,z);
}
else cout<<"N"<<endl;
}
}
(请忽略其中的调试语句)