This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#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));
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;
}
}
Compilation message (stderr)
diversity.cpp: In function 'int32_t main()':
diversity.cpp:114: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]
114 | for (int i = 0; i < res.size(); i++)
| ~~^~~~~~~~~~~~
diversity.cpp:117: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]
117 | for (int i = 0; i < res.size(); i++)
| ~~^~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |