제출 #621047

#제출 시각아이디문제언어결과실행 시간메모리
621047dozerDiversity (CEOI21_diversity)C++14
64 / 100
7020 ms189396 KiB
#include <bits/stdc++.h> using namespace std; #define fastio() cin.tie(0), ios_base::sync_with_stdio(0) #define sp " " #define endl "\n" #define pb push_back #define pii pair<int, int> #define st first #define nd second #define N 300005 #define modulo 1000000007 #define int long long #define M 20000005 const int INF = 2e18 + 7; int arr[N], cnt[N], dp[M], pre[N]; int f(int sz, int n, int mask, int ind) { if (ind > sz) return 0; if (dp[mask] != -1) return dp[mask]; int ans = INF; for (int i = 0; i < n; i++) { if (mask & (1<<i)) continue; int fin = ind + cnt[i + 1] - 1; int tmp = (sz * (sz + 1)) / 2 - (((ind - 1) * ind) / 2 + ((sz - fin) * (sz - fin + 1)) / 2); ans = min(ans, tmp + f(sz, n, mask | (1<<i), fin + 1)); } return dp[mask] = ans; } void print(int sz, int n, int mask, int ind) { if (ind > sz) { cout<<endl; return; } int ans = INF; for (int i = 0; i < n; i++) { if (mask & (1<<i)) continue; int fin = ind + cnt[i + 1] - 1; int tmp = (sz * (sz + 1)) / 2 - (((ind - 1) * ind) / 2 + ((sz - fin) * (sz - fin + 1)) / 2); ans = min(ans, tmp + f(sz, n, mask | (1<<i), fin + 1)); } for (int i = 0; i < n; i++) { if (mask & (1<<i)) continue; int fin = ind + cnt[i + 1] - 1; int tmp = (sz * (sz + 1)) / 2 - (((ind - 1) * ind) / 2 + ((sz - fin) * (sz - fin + 1)) / 2); if (ans == tmp + f(sz, n, mask | (1<<i), fin + 1)) { cout<<cnt[i + 1]<<sp; print(sz, n, mask | (1<<i), fin + 1); return; } } } int32_t main() { fastio(); int n, q; cin>>n>>q; for (int i = 1; i <= n; i++) cin>>arr[i]; while(q--) { memset(cnt, 0, sizeof(cnt)); memset(dp, -1, sizeof(dp)); int l, r; cin>>l>>r; map<int, int> val; int counter = 1; for (int i = l; i <= r; i++) { if (val[arr[i]] == 0) { val[arr[i]] = counter; counter++; } cnt[val[arr[i]]]++; } /* int res = f(r - l + 1, counter - 1, 0, 1); print(r - l + 1, counter - 1, 0, 1); cout<<res<<endl; */ vector<int> sz; for (int i = 1; i < counter; i++) sz.pb(cnt[i]); sort(sz.begin(), sz.end()); vector<int> a, b; if (sz.size() % 2 == 1) { a.pb(sz.back()); sz.pop_back(); } while(!sz.empty()) { a.pb(sz.back()); sz.pop_back(); b.pb(sz.back()); sz.pop_back(); } reverse(a.begin(), a.end()); vector<int> res; for (auto i : a) res.pb(i); for (auto i : b) res.pb(i); for (int i = 0; i < res.size(); i++) pre[i + 1] = pre[i] + res[i]; int m = res.size(), ans = 0; for (int i = 0; i < res.size(); i++) { int tmp = pre[m] * (pre[m] + 1); tmp /= 2; tmp -= (pre[i] * (pre[i] + 1)) / 2; tmp -= ((pre[m] - pre[i + 1]) * (pre[m] - pre[i + 1] + 1)) / 2; ans += tmp; } cout<<ans<<endl; } }

컴파일 시 표준 에러 (stderr) 메시지

diversity.cpp: In function 'int32_t main()':
diversity.cpp:115:21: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  115 |   for (int i = 0; i < res.size(); i++)
      |                   ~~^~~~~~~~~~~~
diversity.cpp:118:21: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  118 |   for (int i = 0; i < res.size(); i++)
      |                   ~~^~~~~~~~~~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...