Submission #1183195

#TimeUsernameProblemLanguageResultExecution timeMemory
1183195PieArmyGroup Photo (JOI21_ho_t3)C++20
100 / 100
383 ms197160 KiB
#include<bits/stdc++.h> typedef long long ll; #define pb push_back #define fr first #define sc second using namespace std; const ll inf=1000000000; struct Fen{ int n; int sum=0; vector<int>tree; void init(int N){ n=N; sum=0; tree.resize(n+1,0); } void update(int tar,int x){ sum+=x; while(tar<=n){ tree[tar]+=x; tar+=(tar&-tar); } } int query(int tar){ int res=0; while(tar){ res+=tree[tar]; tar-=(tar&-tar); } return res; } }; int n; int arr[5023],loc[5023]; ll dp[5023][5023]; Fen fen; int pref[5023]; int main(){ ios_base::sync_with_stdio(false);cin.tie(NULL); cin>>n; fen.init(n); for(int i=1;i<=n;i++){ cin>>arr[i]; loc[arr[i]]=i; } for(int i=1;i<=n+1;i++){ for(int j=0;j<=n;j++){ dp[i][j]=inf; } } dp[1][0]=0; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ pref[j]=pref[j-1]+(arr[j]>i); } ll cos=0; for(int j=i-1;j>=0;j--){ cos+=fen.sum-fen.query(loc[j+1]); fen.update(loc[j+1],1); cos+=pref[loc[j+1]]; dp[i+1][i]=min(dp[i+1][i],dp[i][j]+cos); dp[i+1][j]=min(dp[i+1][j],dp[i][j]); } fen.tree.clear(); fen.init(n); } cout<<dp[n+1][n]; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...