Submission #1302388

#TimeUsernameProblemLanguageResultExecution timeMemory
1302388tkm_algorithmsDiversity (CEOI21_diversity)C++20
38 / 100
3242 ms10188 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;
using P = pair<int, int>;
#define int ll
#define all(x) x.begin(), x.end()
#define rep(i, l, n) for (int i = l; i < (n); ++i)
#define sz(x) (int)x.size()
const char nl = '\n';
const int mod = 1e9+7;

struct segtree {
	vector<P> tree;
	int size;
	
	void init(int n) {
		size = 1;
		while (size < n)size <<= 1;
		tree.assign(2*size-1, {0, 0});
	}
	
	void build(vector<int> &a, int x, int lx, int rx) {
		if (rx-lx==1) {
			if (lx < sz(a)) {
				//cout << "!" << x << nl;
				tree[x].first = a[lx]*(lx+1), tree[x].second = a[lx];
			}
			return;
		}
		
		int mid = lx+rx>>1;
		build(a, 2*x+1, lx, mid);
		build(a, 2*x+2, mid, rx);
		tree[x].first = tree[2*x+1].first +tree[2*x+2].first;
		tree[x].second = tree[2*x+1].second +tree[2*x+2].second;
	}
	
	void build(vector<int> &a) {
		init(sz(a)+3);
		build(a, 0, 0, size);
	}
	
	P get(int l, int r, int x, int lx, int rx) {
		if (l <= lx && rx <= r)return tree[x];
		if (rx <= l || r <= lx)return {0, 0};
		int mid = lx+rx>>1;
		P s1 = get(l, r, 2*x+1, lx, mid),
		s2 = get(l, r, 2*x+2, mid, rx);
		return {s1.first+s2.first, s2.second+s1.second};
	}
	
	P get(int l, int r) {
		return get(l, r, 0, 0, size);
	}
};

void solve() {
	int n, q; cin >> n >> q;
	//rep(i, 0, n)
	map<int, int> mp;
	rep(i, 0, n) {
		int x; cin >> x; 
		mp[x] += 1;
	}
	vector<int> a;
	for (auto i: mp)a.push_back(i.second);
	sort(all(a));
	vector<int> res;
	rep(i, 0, sz(a))
		if (i%2==0)res.push_back(a[i]);
	
	for (int i = sz(a)-1; i >= 0; --i)
		if (i&1)res.push_back(a[i]);
		
	//segtree st;
	//st.build(res);
		
	int ans = 0;
	for (auto i: res)
		ans += i*(i+1)/2;
		
	int l, r; cin >> l >> r;
	
	int m = sz(res);
	vector<int> p(m+3), p2(m+3);
	
	rep(i, 0, m)
		p[i] = i*res[i]+(i>0?p[i-1]:0),
		p2[i] = res[i]+(i>0?p2[i-1]:0);
	p[m] = p[m-1], p2[m] = p2[m-1];
	
	//cout << st.get(2, 3).second << nl;
	//for (auto i: res)cout << i << " ";
	//cout << nl;
	
	rep(i, 0, sz(res)) {
		P g = P(p[m]-p[i]+p2[m]-p2[i], p2[m]-p2[i]);
		int x = (g.first-g.second*i)*res[i];
		//assert(ans <= (ll)1e18);
		int y = 0;
		rep(j, i+1, sz(res))y += res[j]*j;
		ans += x;
		assert(p[m]-p[i]==y);
		//if (x != y) {
			//cout << g.second << " " << nl;
			//cout << i << " " << x << " " << y << nl;
		//}
	}
		
	cout << ans << nl;
}

int32_t main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    solve();
    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...