Submission #1001093

#TimeUsernameProblemLanguageResultExecution timeMemory
1001093OtalpRope (JOI17_rope)C++17
80 / 100
2547 ms245188 KiB
#include<bits/stdc++.h> using namespace std; #define ll long long #define pii pair<int, int> #define ff first #define ss second #define pb push_back #define h(a, b) (ll)a * 1e7 + b unordered_map<ll, int> dp[2]; int cnt[1000001]; int a[1000001]; vector<int> d[1000001]; int g[1000001]; bool cmp(int a, int b){ if(cnt[a] == cnt[b]) return a > b; return cnt[a] > cnt[b]; } //ll h(ll a, ll b){ //hynya // return a * 1e7 + b; //} void solve(){ int n, m; cin>>n>>m; for(int i=1; i<=n; i++){ cin>>a[i]; cnt[a[i]] ++; } for(int i=1; i<=m; i++){ g[i] = i; } sort(g + 1, g + 1 + m, cmp); for(int i=1; i+1<=n; i+=2){ int l=a[i], r=a[i + 1]; dp[1][h(l, r)] ++; dp[1][h(r, l)] ++; d[l].pb(r); d[r].pb(l); } for(int i=2; i+1<=n; i+=2){ int l=a[i], r=a[i + 1]; dp[0][h(l, r)] ++; dp[0][h(r, l)] ++; d[l].pb(r); d[r].pb(l); } ll dd = 0; for(int i=1; i<=m; i++) dd += d[i].size(); if(dd > 2e6) return; if(dp[0].size() + dp[1].size() > 2e6) return; for(int i=1; i<=m; i++){ d[i].pb(i); sort(d[i].begin(), d[i].end(), cmp); } for(int i=1; i<=m; i++){ int ans = n - cnt[i]; int ls = 1; for(int j: d[i]){ while(ls <= m and g[ls] == j) ls++; if(j == i) continue; for(int k=0; k<2; k++){ ans = min(ans, n-cnt[i]-cnt[j]+dp[k][h(i, j)]); } } if(ls <= m) ans = min(ans, n-cnt[i]-cnt[g[ls]]); cout<<ans<<'\n'; } } signed main(){ ios_base::sync_with_stdio(NULL), cin.tie(NULL), cout.tie(NULL); solve(); }
#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...