QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#578051 | #9322. Segments Removal | Afterlife# | WA | 3ms | 17892kb | C++20 | 2.5kb | 2024-09-20 16:12:22 | 2024-09-20 16:12:23 |
Judging History
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'