首页 > 其他分享 >【题解】CF1854E Game Bundles

【题解】CF1854E Game Bundles

时间:2023-09-08 20:12:36浏览次数:38  
标签:NN int 题解 ll 30 Bundles 60 Game res

你考虑我们需要构造出一组解,显然地这样的解有很多很多种(\({60^{60}}\) 显然是及其地大)。

那关键是我们如何进行构造。

我们很容易知道每个集合里面 \(> 30\) 的数只有一个。

所以我们可以在 \([1,30]\) 中随机 \(a_i\),直到满足的组数恰好小于等于 \(a_i\),添加的时候维护数组 \(f_i\) 表示和为 \(i\) 的集合 \(S\) 的个数。

我们可以发现,有些时候小的 \(a_i\) 如果很多,那么我们的答案增涨速度会很快,所以我们可以进行一个优化,每次随机一个 \(len\),然后让 \(a_i\) 在 \([1,len]\) 中随机。

然后我们最后差的答案怎么补上呢?我们显然可以在序列中添加 \(> 30\) 的数,添加 \(i\) 这个数,显然会让 \(f_{60} = f_{60} + f_{60-i}\) 然后我们按 \(f_{60-i}\) 从大到小加入 \(i\) 这个数即可。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int NN = 2e5 + 8; 
mt19937 rnd(time(0));
int T,n,m;
ll a[NN],b[NN],p[NN];
ll f[NN];
int rdbt(int l,int r){return l + rnd() % (r-l+1);}
ll K,res;

int main(){
	scanf("%lld",&K);
	if(K <= 60){
		printf("%lld\n",K);
		for(int i = 1; i <= K; ++i) printf("60 ");
		puts("");
		return 0;
	}
	for(int i = 31; i <= 60; ++i) p[i] = i;
	while(1){
		for(int i = f[0] = 1; i <= 60; ++i) f[i] = 0;
		int k = rdbt(1,29);
		for(int i = 1; i <= n; ++i){
			a[i] = rdbt(1,k);
			if(f[60] + f[60-a[i]] > K){n=i-1;break;}
			for(int j = 60; j >= a[i]; --j) f[j] += f[j-a[i]];
		}
		res = K - f[60];
        sort(p+31 , p+61,[&](int x,int y){
            return f[60-x]>f[60-y];
        });
        if(res < 0) assert(0);
        for(int i = 31; i <= 60; ++i)
            while(n < 60 && res >= f[60-p[i]]) res -= f[60-p[i]], a[++n] = p[i];
        if(!res){
            printf("%d\n",n);
            for(int i = 1; i <= n; ++i) printf("%d ",a[i]);
            puts("");
            return 0;
        }
	}
}

标签:NN,int,题解,ll,30,Bundles,60,Game,res
From: https://www.cnblogs.com/rickylin/p/17688448.html

相关文章

  • 【题解】CF1854D Michael and Hotel
    交互题。考虑题意即为找到\(1\)所在内向基环树上的所有点。我们考虑我们怎么找到环上的点,我们考虑我们可以\(O(\logn)\)询问到一个环上的点,方法即为将\(k\)定为一个大数,然后二分点集。然后我们便可以在\(O(n\logn)\)的时间复杂度内找到所有环上的点(我们一会儿再讲怎......
  • 【题解】CF1854C Expected Destruction
    你考虑,我们如果没有重合就将元素删去的操作,我们就有答案:\(n\times(m+1)-\sum\limits_{i=1}^na_i\)但是,我们显然最后的答案是小于这个的,如果有两个数在\(i\)相撞,那么我们的答案就会减少\((m-i+1)\)我们设\(f_{i,j}\)表示两个数分别在\(i\)和\(j\)的概率\((i\leqj......
  • 【疑难解决】运行EasyRTSPSever组件提示程序无法启动问题解决
    RTSP协议以客户服务器方式工作,它是一个多媒体播放控制协议,用来使用户在播放从因特网下载的实时数据时能够进行控制,如:暂停/继续、后退、前进等。因此RTSP又称为“因特网录像机遥控协议”。我们的RTSP-Sever组件EasyRTSPSever就是一款比较便捷的组件。我们有开发者在测试EasyRTSPS......
  • live555作为RTSP流媒体服务器时Server端多track而客户端仅请求一个track,当客户端关闭
    当我们使用live555作为流媒体服务器时,某个通道对应的所有客户端断开后,不能正常回调关闭。某一通道同时支持视频和音频输出,即video和audio两个trackVLC和EasyPlayer播放库来中的RTSPClient则都会请求(所以不存在问题);而某些客户端则只请求了一个track,比如video;此时再关闭......
  • live555做流媒体服务器时解决rtp over udp模式下, 客户端没有发送teardown时直接关闭
    在我们使用live555作为RTSP服务器时,客户端在rtpoverudp模式下,rtsp客户端没有发送teardown而直接断开连接时需要等待65秒才回调关闭的问题。分析问题在RTSPClientConnection中没有保存相应的session值,所以在RTSPClientConnection断开时,并没有删除相应的RTSPClientSession;解......
  • 【题解】CF1854B Earn or Unlock
    你考虑,我们很容易地可以构造一个\(n^2\)的DP:\(f_{i,j}\)表示当前在\(i\)张牌,还可以摸\(j\)张牌的最大分数。转移也很好转移,你考虑一眼就会。但是我们显然要缩减复杂度,我们看到数据范围\(10^5\),想到了根号。分块???显然不行。莫队???都没有区间查询,怎么行呢?然后你苦思冥想......
  • 【题解】AtCoder Regular Contest 161
    评价:感觉这场题目质量不咋地啊,都是一些乱搞题A.MakeM题目描述:\(N\)是一个正奇数。我们称一个长度为\(N\)的序列\(S\)是M型序列,当前仅当对于所有的\(i=2,4,6,\dots,N-1\)(即偶数位),都有\(S_{i-1}<S_{i}\)且\(S_{i}>S_{i+1}\)。现在给定你一个长度为\(N\)的序列\(A......
  • CF613D 题解
    一、题目描述:给你一颗$n$个点的树,有$m$组询问。一个点如果被攻占,那么这个点就不能通行了。第$i$次询问给出$k_i$个关键点,关键点不能被攻占。求最少攻占多少个点可以使得关键点两两不连通。若不可能,输出$-1$。数据范围:$1\len,m\le1\times10^5......
  • 9月杂题题解
    arc124_e一种方案的权值为\(\prod\limits_{1\leqi\leqn}b_i\),考虑其组合意义,就是每个人在自己最终的球中选一个。可以发现要么拿自己原来的球,要么拿上一个人传来的球。定义状态:\(f(i,0)\)为第\(i\)个人拿自己的球,考虑前\(i-1\)个人的答案。\(f(i,1)\)为第\(i\)个......
  • nvm有下载版本,切换版本成功,node -v还是切换前的版本问题解决
    是因为在下载nvm之前,电脑中的node版本已经存在了,所以需要将之前的node版本全部清楚干净!卸载node之前请node-v查看一下现在的版本,记住这个版本,切记切记!!!!!控制面板中卸载node.;卸载已安装过的NVM;没装过NVM的就仅仅卸载node去环境变量里面看一下有没有跟nvm和node相关的东西了,有的话全......