Submission #995596

#TimeUsernameProblemLanguageResultExecution timeMemory
995596asdasdqwerDiversity (CEOI21_diversity)C++14
64 / 100
244 ms46160 KiB
#include <bits/stdc++.h> using namespace std; #define int int64_t #define pii array<int,2> struct Segtree { vector<int> seg, lz; int n; Segtree(int sz) { n=1; while (n<sz)n*=2; seg.assign(2*n,0); lz.assign(2*n,0); } void pushdown(int x, int l) { if (lz[x] == 0) return; lz[2*x+1] += lz[x]; lz[2*x+2] += lz[x]; seg[2*x+1] += (l/2) * lz[x]; seg[2*x+2] += (l/2) * lz[x]; lz[x]=0; } void inc(int l, int r, int v, int x, int lx, int rx) { if (lx >= r || rx <= l) return; if (lx >= l && rx <= r) { seg[x] += (rx-lx) * v; lz[x] += v; return; } pushdown(x, rx-lx); int m=(lx+rx)/2; inc(l, r, v, 2*x+1, lx, m); inc(l, r, v, 2*x+2, m, rx); seg[x] = seg[2*x+1] + seg[2*x+2]; } void inc(int l, int r, int v) { inc(l, r, v, 0, 0, n); } int get(int l, int r, int x, int lx, int rx) { if (lx >= r || rx <= l) return 0; if (lx >= l && rx <= r) { return seg[x]; } pushdown(x, rx-lx); int m=(lx+rx)/2; return get(l, r, 2*x+1, lx, m) + get(l, r, 2*x+2, m, rx); } int get(int l, int r) { return get(l, r, 0, 0, n); } }; signed main() { ios::sync_with_stdio(false); cin.tie(0); int n,q;cin>>n>>q; vector<int> a(n); for (int &x:a)cin>>x; sort(a.begin(), a.end()); vector<int> b = a; b.erase(unique(b.begin(), b.end()), b.end()); // coordinate compression map<int,int> mp; for (int i=0;i<(int)b.size();i++) { mp[b[i]]=i; } for (int &x:a) { x = mp[x]; } vector<int> cnt(b.size()); for (int i=0;i<n;i++) { cnt[a[i]]++; } sort(cnt.begin(), cnt.end()); vector<int> newarr(n); deque<int> idx; for (int i=0;i<n;i++) idx.push_back(i); for (int i=0;i<(int)cnt.size();i++) { if (i % 2 == 0) { for (int j=0;j<cnt[i];j++) { int id = idx.back();idx.pop_back(); newarr[id] = i; } } else { for (int j=0;j<cnt[i];j++) { int id = idx.front();idx.pop_front(); newarr[id] = i; } } } int res = n; Segtree sg(n); for (int i=0;i<n;i++) { if (i != 0 && newarr[i] != newarr[i-1]) { sg.inc(0, i, 1); } res += sg.seg[0]; sg.inc(i, i+1, 1); } cout<<res<<"\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...
#Verdict Execution timeMemoryGrader output
Fetching results...