Submission #1001077

#TimeUsernameProblemLanguageResultExecution timeMemory
1001077OtalpRope (JOI17_rope)C++14
80 / 100
2349 ms241332 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 map<ll, int> dp[2]; int cnt[5001]; int a[1000001]; unordered_map<int, vector<int>> d; 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]] ++; } vector<pii> g; for(int i=1; i<=m; i++){ g.pb({cnt[i], i}); } sort(g.begin(), g.end(), greater<pii>()); 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(g.size() == 0 or g.size() > 1e6) 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 = 0; for(int j: d[i]){ while(ls < g.size() and g[ls].ss == 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 < g.size()) ans = min(ans, n-cnt[i]-g[ls].ff); cout<<ans<<'\n'; } } signed main(){ ios_base::sync_with_stdio(NULL), cin.tie(NULL), cout.tie(NULL); solve(); }

Compilation message (stderr)

rope.cpp: In function 'void solve()':
rope.cpp:64:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   64 |             while(ls < g.size() and g[ls].ss == j) ls++;
      |                   ~~~^~~~~~~~~~
rope.cpp:70:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   70 |         if(ls < g.size()) ans = min(ans, n-cnt[i]-g[ls].ff);
      |            ~~~^~~~~~~~~~
#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...