제출 #1149955

#제출 시각아이디문제언어결과실행 시간메모리
1149955Zero_OPDiversity (CEOI21_diversity)C++20
64 / 100
7057 ms6332 KiB
#include <bits/stdc++.h> using namespace std; //loops (warning : long long) #define FOR(i, l, r) for(int i = (l); i < (r); ++i) #define ROF(i, r, l) for(int i = (r - 1); i >= l; --i) //pairs, tuples #define mp make_pair #define mt make_tuple #define ff first #define ss second //vectors #define all(v) begin(v), end(v) #define rall(v) rbegin(v), rend(v) #define pb push_back #define eb emplace_back #define sum_of(v) accumulate(all(v), 0ll) #define sz(v) (int)v.size() #define compact(v) v.erase(unique(all(v)), end(v)) //binary search #define lwb lower_bound #define upb upper_bound //other stuffs #define dbg(x) "[" #x " = " << (x) << "]" #define file(task) if(fopen(task".inp", "r")){ freopen(task".inp", "r", stdin); freopen(task".out", "w", stdout); } template<typename T> bool minimize(T& a, const T& b){ if(a > b) return a = b, true; return false; } template<typename T> bool maximize(T& a, const T& b){ if(a < b) return a = b, true; return false; } using ll = long long; using ull = unsigned long long; using ld = long double; using db = double; using pi = pair<int, int>; using pl = pair<ll, ll>; using vi = vector<int>; using vb = vector<bool>; using vl = vector<ll>; using vpi = vector<pi>; using vpl = vector<pl>; mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count()); int f(const vi& a, int max_value){ //a[i] \in [0, max_value) int cnt = 0; vi check(max_value); FOR(i, 0, sz(a)){ int cur = 0; stack<int> st; FOR(j, i, sz(a)){ if(!check[a[j]]) ++cur, check[a[j]] = true, st.push(a[j]); cnt += cur; } while(!st.empty()){ check[st.top()] = false; st.pop(); } } return cnt; } int g(const vi& a){ //cnt array int sum = 0; FOR(i, 0, sz(a)){ int x = a[i]; sum += x * (x + 1) / 2; FOR(j, i + 1, sz(a)){ sum += x * a[j] * (j - i + 1); } } return sum; } void gen(){ vi trick = {1, 1, 2}; int best = 1e9; vector<vi> all_ok; do{ int cur = g(trick); if(minimize(best, cur)) all_ok = {trick}; else if(best == cur) all_ok.pb(trick); } while(next_permutation(all(trick))); cout << best << '\n'; for(auto vec : all_ok){ for(auto it : vec) cout << it << ' '; cout << '\n'; } return; // // vi a = {1, 2, 1, 3, 2, 3, 1, 3, 3}; // vi a = {3, 3, 3, 4, 4, 4, 4, 2, 2, 1}; // vi perm(sz(a)); iota(all(perm), 0); // int cur = 1e9; // vector<vi> lst; // do{ // vi ex(sz(a)); // FOR(i, 0, sz(a)) ex[i] = a[perm[i]]; // int tmp = f(ex, 4); // if(minimize(cur, tmp)){ // lst = {ex}; // } else if(cur == tmp) lst.pb(ex); // } while(next_permutation(all(perm))); // cout << cur << '\n'; // sort(all(lst)); compact(lst); // cout << sz(lst) << '\n'; // for(auto it : lst) { // for(auto i : it) cout << i << ' '; cout << '\n'; // } } ll calc_fast(const vi& cnt){ ll sum_product = 0, sum = 0; FOR(i, 0, sz(cnt)){ sum_product += 1LL * (i + 1) * cnt[i]; sum += cnt[i]; } // for(auto u : cnt) cout << u << ' '; cout << '\n'; ll result = 0; FOR(i, 0, sz(cnt)){ result += 1LL * cnt[i] * (cnt[i] + 1) / 2; sum_product -= 1LL * (i + 1) * cnt[i]; sum -= cnt[i]; result += 1LL * cnt[i] * (sum_product - sum * i); } return result; } void testcase(int ntestcase){ int N, Q; cin >> N >> Q; vi a(N); FOR(i, 0, N){ cin >> a[i]; } vi b = a; sort(all(b)); compact(b); FOR(i, 0, N) a[i] = lower_bound(all(b), a[i]) - b.begin(); FOR(_, 0, Q){ int l, r; cin >> l >> r; --l; vi cnt(sz(b)); FOR(i, l, r){ ++cnt[a[i]]; } sort(all(cnt)); vi odd, even; FOR(i, 0, sz(cnt)){ if(i & 1){ if(cnt[i]) odd.pb(cnt[i]); } else{ if(cnt[i]) even.pb(cnt[i]); } } reverse(all(even)); vi result = odd; result.insert(result.end(), all(even)); cout << calc_fast(result) << '\n'; } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); #ifdef LOCAL freopen("in.txt", "r", stdin); #endif // LOCAL // gen(); // return 0; int T = 1; // cin >> T; FOR(i, 0, T) testcase(i); return 0; }
#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...