QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#438292 | #8718. 保区间最小值一次回归问题 | as_lyr | WA | 465ms | 23704kb | C++14 | 2.1kb | 2024-06-10 15:11:59 | 2024-06-10 15:11:59 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=510000;
const ll INF=1e18;
int n,m;
int a[N];
ll sum[N];
struct node{
int l,r,x;
}b[N];
int f[N];
int find(int x){
return f[x]==x?x:f[x]=find(f[x]);
}
int g[N];
inline int as(int x){
return x<0?-x:x;
}
ll dp[N];
void solve(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=m;i++)
scanf("%d%d%d",&b[i].l,&b[i].r,&b[i].x);
sort(b+1,b+m+1,[](const node x,const node y){
return x.x>y.x;
});
for(int i=1;i<=n+1;i++)
f[i]=i;
ll ans=0;
for(int i=1,j;i<=m;i=j+1){
j=i;
while(j<m&&b[i].x==b[j+1].x)
j++;
vector <int> v;
for(int k=i;k<=j;k++)
for(int x=find(b[k].l);x<=b[k].r;x=find(x+1)){
v.push_back(x);
f[x]=x+1;
}
sort(v.begin(),v.end());
sort(b+i,b+j+1,[](const node x,const node y){
return x.r<y.r;
});
if(v.empty()){
puts("-1");
return ;
}
for(int k=i;k<=j;k++)
if(lower_bound(v.begin(),v.end(),b[k].l)==upper_bound(v.begin(),v.end(),b[k].r)){
puts("-1");
return ;
}
for(int k=0;k<(int)v.size();k++)
g[k]=0;
for(int k=i;k<=j;k++){
int x=lower_bound(v.begin(),v.end(),b[k].l)-v.begin();
int y=upper_bound(v.begin(),v.end(),b[k].r)-v.begin()-1;
g[y]=max(g[y],x);
}
for(int k=1;k<(int)v.size();k++)
g[k]=max(g[k],g[k-1]);
deque <pair<int,int>> q;
q.push_back(make_pair(-1,0));
sum[0]=(a[v[0]]<b[i].x?b[i].x-a[v[0]]:0);
for(int k=1;k<(int)v.size();k++)
sum[k]=sum[k-1]+(a[v[k]]<b[i].x?b[i].x-a[v[k]]:0);
for(int k=0;k<(int)v.size();k++){
if(q.empty()==0&&q.front().first<g[k]-1)
q.pop_front();
dp[k]=q.front().second+sum[k-1]+as(a[v[k]]-b[i].x);
while(q.empty()==0&&q.back().second>=dp[k]-sum[k])
q.pop_back();
q.push_back(make_pair(k,dp[k]-sum[k]));
}
ll res=INF;
for(int k=g[(int)v.size()-1];k<(int)v.size();k++)
res=min(res,dp[k]+sum[(int)v.size()-1]-sum[k]);
ans+=res;
}
printf("%lld\n",ans);
}
int main(){
int T;
scanf("%d",&T);
while(T--)
solve();
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 2ms
memory: 14008kb
input:
1 3 2 2023 40 41 1 1 2022 2 3 39
output:
2
result:
ok 1 number(s): "2"
Test #2:
score: -100
Wrong Answer
time: 465ms
memory: 23704kb
input:
1000 100 100 1 35141686 84105222 84105220 7273527 178494861 178494861 112519027 77833654 77833656 261586535 278472336 278472336 261586536 416361017 416361017 426649080 323519513 278472337 420127821 420127823 420127823 482516531 434108818 420127821 631535744 615930922 546346921 546346920 546346920 70...
output:
49 43 43 39 51 47 50 46 46 50 45 57 953 54 52 56 48 61 53 47 50 53 41 56 51 57 49 44 40 45 40 50 56 43 58 44 45 42 37 49 45 51 43 50 915 939 49 51 52 49 46 43 55 50 44 46 51 52 49 46 38 47 45 42 55 41 48 48 40 49 51 46 44 47 46 48 43 47 39 45 45 35 41 47 52 47 49 44 43 46 50 39 47 53 45 41 45 48 47 ...
result:
wrong answer 2nd numbers differ - expected: '46', found: '43'