QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#432934 | #8718. 保区间最小值一次回归问题 | Fesdrer | WA | 317ms | 16320kb | C++17 | 2.0kb | 2024-06-07 20:52:19 | 2024-06-07 20:52:20 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5;
int T,n,m,a[N],nxt[N];
long long ans,f[N];
struct Node{int l,r,v;}que[N];
vector<pair<int,int>> query;
vector<int> id;
deque<int> q;
int get(int x){
if(nxt[x]==x) return x;
return nxt[x]=get(nxt[x]);
}
void solve(int v){
while(q.size()) q.pop_back();
f[0]=0;
q.push_back(0);
query.insert(query.begin(),{0,0});
for(int i:id) ans+=max(0,v-a[i]);
id.insert(id.begin(),0);
long long mn=0x3f3f3f3f3f3f3f3f;
for(int i=1,j=0;i<=int(id.size())-1;i++){
while(j<int(query.size())-1&&query[j+1].second<i) j++;
while(q.size()&&q.front()<query[j].first) q.pop_front();
f[i]=f[q.front()]+max(v,a[id[i]])-v;
while(q.size()&&f[q.back()]>=f[i]) q.pop_back();
q.push_back(i);
if(i>=query.back().first&&i<=query.back().second) mn=min(mn,f[i]);
}
ans+=mn;
}
int main(){
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>T;
while(T--){
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=m;i++) cin>>que[i].l>>que[i].r>>que[i].v;
for(int i=1;i<=n+1;i++) nxt[i]=i;
sort(que+1,que+m+1,[&](const Node &x,const Node &y){
if(x.v==y.v) return (x.r==y.r?x.l>y.l:x.r<y.r);
return x.v>y.v;
});
bool flagg=1;
ans=0;
for(int i=1;i<=m;i++){
int l=i,r=i-1;
query.clear(),id.clear();
while(r<n&&que[l].v==que[r+1].v){
r++;
if(query.empty()||que[r].l>query.back().first) query.push_back({que[r].l,que[r].r});
}
i=r;
bool flag=1;
for(pair<int,int> it:query) if(get(it.first)>it.second) {flag=0;break;}
if(!flag){flagg=0;break;}
for(pair<int,int> it:query) for(int i=get(it.first);i<=it.second;i=get(i+1))
id.push_back(i),nxt[i]=get(i+1);
for(pair<int,int> &it:query){
it.first=lower_bound(id.begin(),id.end(),it.first)-id.begin()+1;
it.second=upper_bound(id.begin(),id.end(),it.second)-id.begin();
}
solve(que[i].v);
}
if(flagg) cout<<ans<<endl;
else cout<<-1<<endl;
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 2ms
memory: 9800kb
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: 317ms
memory: 16320kb
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:
44 40 40 36 46 47 44 45 41 46 39 53 900 52 43 50 45 59 57 43 47 39 39 54 47 57 48 40 36 40 39 52 52 39 56 42 44 42 36 47 43 46 42 46 879 854 40 46 42 46 41 39 50 46 38 42 50 49 50 46 37 48 42 37 47 40 44 47 35 49 47 42 41 45 43 43 41 47 37 44 42 34 42 41 47 45 37 42 40 41 46 40 49 51 42 40 42 47 44 ...
result:
wrong answer 1st numbers differ - expected: '49', found: '44'