社区讨论

万红丛中一点绿?

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 条回复,欢迎继续交流。

正在加载回复...