题解:CF1612E Messages
TCY1234567 · · 题解
题外话
这题开始看错题了,以为大于
题解
观察数据范围,发现
其实发现整道题并没有什么好的转化空间,于是我们试着暴力做一做,发现没有问题,那么接下来证明一下。
设
对于
对于
我们发现不同的只有
因为贡献是从大到小排序,我们不妨放缩一下,将
代码就很好写了。
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int k[200005],m[200005];
struct node
{
int val,id;
bool operator < (const node x) const
{
return val>x.val;
}
}cnt[200005];
struct edge
{
vector<int> mp;
double x;
void clear()
{
x = 0;
mp.clear();
}
}ans,qwq;
signed main()
{
int n;
scanf("%lld",&n);
for(int i=1;i<=n;i++)
scanf("%lld%lld",&m[i],&k[i]);
for(int t=1;t<=20;t++)
{
for(int i=1;i<=200000;i++) cnt[i]={0,i};
for(int i=1;i<=n;i++) cnt[m[i]].val+=min(t,k[i]);
sort(cnt+1,cnt+200000+1);
qwq.clear();
for(int i=1;i<=t;i++)
{
qwq.x+=cnt[i].val;
qwq.mp.push_back(cnt[i].id);
}
qwq.x/=t;
if(qwq.x>ans.x) ans = qwq;
}
printf("%lld\n",ans.mp.size());
for(auto x:ans.mp)
printf("%lld ",x);
}