社区讨论
万红丛中一点绿?
P1083[NOIP 2012 提高组] 借教室参与者 4已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mi867gqo
- 此快照首次捕获于
- 2025/11/21 09:17 4 个月前
- 此快照最后确认于
- 2025/11/21 09:17 4 个月前
RT,就过一个点:
CPP#include<bits/stdc++.h>
using namespace std;
int n,m;
int x,y,data;
struct tree{
int w;
int f;
int l,r;
}t[4*1000001];
bool neg=0;
void init(int k,int l,int r)
{
t[k].l=l,t[k].r=r;
if(l==r){
cin>>t[k].w;
return ;
}
int m=(l+r)/2;
init(2*k,l,m);
init(2*k+1,m+1,r);
t[k].w=t[2*k].w+t[2*k+1].w;
}
void down(int k)
{
t[2*k].w=t[2*k].w-t[k].f;
t[2*k+1].w-=t[k].f;
t[2*k].f=t[k].f;
t[2*k+1].f=t[k].f;
t[k].f=0;
if(t[2*k].w<0||t[2*k+1].w<0) neg=1;
}
void occ(int k)
{
int l=t[k].l,r=t[k].r;
if(l<=x&&r<=y){
t[k].w-=data;
t[k].f+=data;
if(t[k].w<0) neg=1;
return ;
}
down(k);
int m=(l+r)/2;
if(x<=m) occ(2*k);
if(y>m) occ(2*k+1);
}
int main()
{
cin>>n>>m;
init(1,1,n);
int i;
for(i=1;i<=m;i++){
cin>>data>>x>>y;
occ(1);
if(neg){
cout<<"-1\n"<<i;
return 0;
}
}
cout<<0;
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...