QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#578051#9322. Segments RemovalAfterlife#WA 3ms17892kbC++202.5kb2024-09-20 16:12:222024-09-20 16:12:23

Judging History

你现在查看的是最新测评结果

  • [2024-09-20 16:12:23]
  • 评测
  • 测评结果:WA
  • 用时:3ms
  • 内存:17892kb
  • [2024-09-20 16:12:22]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll inf=1e18;
const int N=500050;
int n,m,c[N];
ll s[N],dp[N];
struct Range{
    int l,r,p,w;
}a[N];
vector<int> v[N];
multiset<int> S;
inline int lowbit(int x){
    return x&(-x);
}
struct BIT2{
    ll b[N];
    void init(int n,ll o){
        for(int i=1;i<=n;++i){
            b[i]=o;
        }
    }
    inline void Add(int x,ll d){
        while(x<=m){
            b[x]+=d,x+=lowbit(x);
        }
    }
    inline ll Ask(int x){
        ll ans=0;
        while(x){
            ans+=b[x],x-=lowbit(x);
        }
        return ans;
    }
}C,D;
struct BIT1{
    ll b[N];
    void init(int n,ll o){
        for(int i=1;i<=n;++i){
            b[i]=o;
        }
    }
    inline void Add(int x,ll d){
        while(x<=m){
            b[x]=max(b[x],d),x+=lowbit(x);
        }
    }
    inline ll Ask(int x){
        ll ans=-inf;
        while(x){
            ans=max(ans,b[x]),x-=lowbit(x);
        }
        return ans;
    }
}A,B;

void Solve(){
    cin>>n>>m;
    for(int i=1;i<=m+1;++i)v[i].clear();
    for(int i=1;i<=n;++i){
        cin>>a[i].l>>a[i].r>>a[i].w>>a[i].p;
        v[a[i].l].push_back(i);
        v[a[i].r+1].push_back(i);
    }
    S.clear();
    for(int i=1;i<=m;++i){
        for(auto id:v[i]){
            if(a[id].l==i){
                S.insert(a[id].w);
            }
            else{
                S.erase(S.find(a[id].w));
            }
        }
        c[i]=S.empty()?0:*S.rbegin();
    }
    for(int i=1;i<=m;++i){
        s[i]=s[i-1]+c[i];
    }
    ll ans=0;
    sort(a+1,a+n+1,[&](Range x,Range y){
        return x.r==y.r?x.l>y.l:x.r<y.r;
    });
    A.init(m,-inf),B.init(m,-inf),C.init(m,0);
    D.init(m,0);
    ll now=0;
    for(int i=1;i<=n;++i){
        now+=a[i].p;
        ll W=now-C.Ask(a[i].l-1);
        dp[i]=-(s[a[i].r]-s[a[i].l-1]);
        dp[i]=max(dp[i],A.Ask(a[i].l-1)-s[a[i].r]+D.Ask(a[i].l-1));
        dp[i]=max(dp[i],B.Ask(a[i].l-1)-(s[a[i].r]-s[a[i].l-1]));
        dp[i]+=W;
        A.Add(a[i].l,dp[i]+s[a[i].r]-D.Ask(a[i].r));
        B.Add(a[i].r,dp[i]);
        ans=max(ans,dp[i]);
        C.Add(a[i].l,a[i].p);
      //  D.Add(a[i].l,-a[i].p);
        D.Add(a[i].r,a[i].p);
    }
    for(int i=1;i<=n;++i){
        ans-=a[i].p;
    }
    ans+=s[m];
    cout<<ans<<'\n';
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int T;
    cin>>T;
    while(T--)Solve();
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 3ms
memory: 17852kb

input:

2
3 8
3 7 3 2
5 8 2 1
1 3 2 2
2 5
1 3 2 7
3 5 3 4

output:

16
2

result:

ok 2 number(s): "16 2"

Test #2:

score: -100
Wrong Answer
time: 0ms
memory: 17892kb

input:

5
3 7
3 7 8 6
2 4 6 8
3 3 8 3
3 6
1 3 7 6
2 2 6 6
4 5 4 6
4 6
2 4 7 4
2 6 5 3
2 3 4 6
1 1 3 6
4 7
1 3 2 5
1 6 3 3
5 5 8 5
1 6 5 1
1 4
2 2 8 8

output:

29
13
18
19
0

result:

wrong answer 2nd numbers differ - expected: '11', found: '13'