线段树95ptsWA#8求调啊啊啊啊啊啊!!!!
查看原帖
线段树95ptsWA#8求调啊啊啊啊啊啊!!!!
177000
vicky2048_2楼主2023/3/9 10:50

讨论区那里有一组关于WA#8的代码的hack数据跑起来也是对的

因为数据下载次数用完了遂至谷寻求谷民帮助QwQ
#include<bits/stdc++.h>
#define M 1000005
#define int long long
using namespace std;
int n,m,d,st,en,c[M],bh;
struct node{
    int l,r,sum,la,minn;
}tr[M<<2];
void add(int,int,int,int),sp(int),build(int,int,int);
signed main(){
    scanf("%lld%lld",&n,&m);
    for(int i=1;i<=n;i++) scanf("%d",&c[i]);
    build(1,1,n);
    for(int i=1;i<=n;i++){
        scanf("%lld%lld%lld",&d,&st,&en);
        bh=i,add(1,st,en,-d);
    }
    printf("0");
    return 0;
}
void build(int pos,int l,int r){
    tr[pos].l=l,tr[pos].r=r;
    if(l==r){
        tr[pos].minn=tr[pos].sum=c[l];
        return ;
    }
    build(pos<<1,l,(l+r)>>1);
    build((pos<<1)+1,((l+r)>>1)+1,r);
    tr[pos].minn=min(tr[pos<<1].minn,tr[(pos<<1)+1].minn);
    tr[pos].sum=tr[pos<<1].sum+tr[(pos<<1)+1].sum;
}

void add(int pos,int st,int en,int k){
    int l=tr[pos].l,r=tr[pos].r,mi=(l+r)>>1;
    if(l>=st&&r<=en){
        tr[pos].sum+=(r-l+1)*k,tr[pos].la+=k,tr[pos].minn+=k;
        if(tr[pos].sum<0||tr[pos].minn<0){
            printf("-1\n%lld",bh);
            exit(0);
        }
        return ;
    }
    sp(pos);
    if(!(st>tr[pos<<1].r||en<tr[pos<<1].l))
        add(pos<<1,st,en,k);
    if(!(st>tr[(pos<<1)+1].r||en<tr[(pos<<1)+1].l))
        add((pos<<1)+1,st,en,k);
    tr[pos].minn=min(tr[pos<<1].minn,tr[(pos<<1)+1].minn);
}
void sp(int pos){
    int k=tr[pos].la,lc=pos<<1,rc=lc+1;
    if(k){
        tr[lc].la+=tr[pos].la,tr[rc].la+=tr[pos].la;
        tr[lc].sum+=k*(tr[lc].r-tr[lc].l+1),tr[rc].sum+=k*(tr[rc].r-tr[rc].l+1);
        tr[rc].minn+=k,tr[lc].minn+=k;
        tr[pos].la=0;
    }
}
2023/3/9 10:50
加载中...