제출 #1315821

#제출 시각아이디문제언어결과실행 시간메모리
1315821WH8Group Photo (JOI21_ho_t3)C++20
100 / 100
630 ms196636 KiB
#include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace __gnu_pbds; #include <bits/stdc++.h> using namespace std; #define int long long #define pll pair<long long, long long> #define mp make_pair #define pb push_back #define f first #define s second #define endl '\n' #define ld long double #define sz(x) static_cast<int>((x).size()) #define i5 tuple<int,int,int,int,int> #define all(x) x.begin(), x.end() #define iiii tuple<int, int,int,int> #define ld long double #define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update> const int maxn=5005; int fw[3][maxn]; void upd(int t, int x, int v){ while(x <= maxn){ fw[t][x]+=v; x+=(x&(-x)); } } int qry(int t, int x){ int ret=0; while(x > 0){ ret += fw[t][x]; x-=(x&(-x)); } return ret; } signed main(){ int n;cin>>n; vector<int> v(n+1), pos(n+1); for(int i=1;i<=n;i++){ cin>>v[i]; pos[v[i]]=i; } vector<vector<int>> cost(n+1, vector<int>(n+1, 0)); for(int i=1;i<=n;i++){ upd(1, i, 1); } /*cout<<pos[1]<<endl; cout<<qry(1, pos[1]-1); return 0;*/ vector<int> rb; for(int j=1;j<=n;j++){ for(auto it: rb){ upd(2, it, -1); } rb.clear(); int cc=0; for(int i=j;i<=n;i++){ int minus=qry(2, maxn) - qry(2, pos[i]); int mv=qry(1, pos[i]-1); cc += mv - minus; upd(2, pos[i], 1); rb.pb(pos[i]); cost[j][i] = cc; //printf("cost of %lld to %lld is %lld,mv %lld minused %lld\n", j, i, cc, mv, minus); } upd(1, pos[j], -1); //if(j==1)break; } vector<int> dp(n+1, 1e9); dp[0]=0; for(int i=1;i<=n;i++){ for(int j=1;j<=i;j++){ dp[i]=min(dp[i], dp[j-1] + cost[j][i]); } } cout<<dp[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...