# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
802007 | guagua0407 | Group Photo (JOI21_ho_t3) | C++17 | 1 ms | 332 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
//#pragma GCC optimize("O3")
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int,int>
#define f first
#define s second
#define all(x) x.begin(),x.end()
#define _ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
void setIO(string s) {
freopen((s + ".in").c_str(), "r", stdin);
freopen((s + ".out").c_str(), "w", stdout);
}
const int mxn=5005;
int pos[mxn];
int num[mxn];
ll dp[mxn];
int bit[mxn];
void update(int pos,int val){
for(;pos<mxn;pos+=(pos&-pos)){
bit[pos]+=val;
}
}
int query(int pos){
int ans=0;
for(;pos;pos-=(pos&-pos)){
ans+=bit[pos];
}
return ans;
}
int main() {_
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>num[i];
pos[num[i]]=i;
}
for(int i=1;i<=n;i++){
memset(bit,0,sizeof(bit));
ll cur=0;
dp[i]=(ll)1e18;
for(int j=i;j>=1;j--){
if(num[j]>i or num[j]<j) cur+=i-j;
if(pos[j]>i) cur+=pos[j]-i;
else{
int ord=query(n)-query(pos[j]);
cur+=ord;
}
//cout<<j<<' '<<i<<' '<<cur<<'\n';
dp[i]=min(dp[i],dp[j-1]+cur);
update(pos[j],1);
}
}
cout<<dp[n];
return 0;
}
//maybe its multiset not set
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |