首页 > 其他分享 >CF1943E2 MEX Game 2 (Hard Version)

CF1943E2 MEX Game 2 (Hard Version)

时间:2024-03-25 15:22:41浏览次数:15  
标签:sum CF1943E2 Alice len mid Game Version Bob 200010

CF1943E2 MEX Game 2 (Hard Version)

更好的阅读体验

好难啊好难啊好难啊,完全想不到 QAQ。

显然满足单调性,进行二分答案 \(mid\),表示答案在双方最优策略下能否达到 \(mid\)。

Alice 的策略很简单,每次选取 \([0,mid-1]\) 中 \(f\) 最小的没有选过的元素即可。

而 Bob 应当尽量把操作平均摊到多个 \(f\) 上,不然一个 \(f_j\) 忽然减了太多被 Alice 直接叉掉看起来就很不优。如果把 \(i<mid\) 的 \(F\) 进行排序得到 \(H\),则 Bob 应当保证操作的过程中 \(H\) 的大小顺序不改变。因为如果改变了没有意义,可以改变操作的对象使得操作后的 \(H\) 仍然有序。

因此,Bob 的最优方案是游戏开始前选择一段 \(H\) 的前缀 \(H'\),然后每次操作的时候不断地对 \(H'\) 的最大的元素减一执行 \(K\) 次。Alice 每次删掉 \(H\) 中最小的元素。暴力模拟这个过程可以做到 \(\mathcal O(n^2\log n)\) 或者 \(\mathcal O(n^3\log n)\)。

考虑如何优化,二分答案不能丢,选取 \(H\) 的前缀这个操作也很难舍去。

考虑对于一个前缀,操作过程中 Alice 和 Bob 一定会相遇,即存在一个 \(j\) 使得在这个时刻 Alice 把 \([0,j-1]\) 全部删去了,Bob 把 \([j,i]\) 减成了 \(\{x\dots x,x+1\dots x+1\}\) 的形式。

接下来是 Alice “怼着” Bob 向后走,当前 \([j,i]\) 的区间,可以用 \((sum,len)\) 两个数来表示剩的数的总和和剩的数的个数。此时假设 Bob 先手,每个回合是:

\[ sum\rightarrow sum-K \]

然后

\[ sum\rightarrow sum-minn\\ len\rightarrow len-1 \]

其中 \(minn=\lfloor\frac{sum}{len}\rfloor\)。

现在需要知道的是 \(sum\) 和 \(len\) 哪个先变成非正数,如果 \(sum\) 先则 Bob 胜利,否则 Alice 胜。所以可以预处理 \(g_i\) 表示 \(len=i\) 时 \(sum\) 的最大值。需要满足:

\[f_i-K-\lfloor\frac{f_i-K}i\rfloor\leq f_{i-1}\\ f_i=\lfloor\frac{f_{i-1}\times i}{i-1}\rfloor+K \]

这样就做完了,代码还是比较好写的。复杂度是 \(\mathcal O(n\log^2n)\),瓶颈在于排序。好像可以用倍增做到一只 \(\log\)?

	int T,n,m,b[200010],f[200010],a[200010],s[200010],L,R,mid;
	inline bool chk(int x)
	{
		for(int i=0;i<=x;++i)b[i]=a[i];
		sort(b,b+x),s[0]=b[0];
		for(int i=1,j=1;i<x;++i)
		{
			s[i]=b[i]+s[i-1];
			while(s[i]-s[j-1]-b[j]*(i-j+1)>(j)*m)++j;
			if(s[i]-s[j-1]-(j-1)*m<=f[i-j+1])
			return 1;
		}
		return 0;
	}
	inline void mian()
	{
		read(T);
		while(T--)
		{
			read(n,m),L=0,R=n+1,f[1]=m;
			for(int i=2;i<=n+1;++i)f[i]=(ld)i*f[i-1]/(i-1)+m;
			for(int i=0;i<=n;++i)read(a[i]);
			while(L<R)
			{
				mid=L+((R-L)>>1);
				if(chk(mid))R=mid;
				else L=mid+1;
			}
			write(L-chk(L),'\n');
		}
	}

标签:sum,CF1943E2,Alice,len,mid,Game,Version,Bob,200010
From: https://www.cnblogs.com/WrongAnswer90-home/p/18094430

相关文章

  • 【WEEK4】 【DAY4】AJAX - Part One【English Version】
    2024.3.21ThursdayContents8.AJAX8.1.Introduction8.2.Simulatingajax8.2.1.Createanewmodule:springmvc-06-ajax8.2.2.Addwebsupport,importpomdependencies8.2.2.1.Modifyweb.xml8.2.2.2.Createajspfolder8.2.3.CreateapplicationContext.xml......
  • 托管在 CloudFlare 的域名出现 ERR_SSL_VERSION_OR_CIPHER_MISMATCH 的解决方案
    前言昨天托管在CF的域名突然没办法访问了,提示ERR_SSL_VERSION_OR_CIPHER_MISMATCH,用curl和一堆在线网站测速的发现都是sslhandshakefailed这种提示,一开始还以为是我自己的问题,百度一番无果后就睡了一觉,今天起来发现还是这样,顿时就感觉不对劲了,我的网站也没......
  • git tag -a v1.2.0 -m "version: 1.2.0" 这个是什么意思
    gittag-av1.2.0-m"version:1.2.0"这个是什么意思gittag-av1.2.0-m"version:1.2.0"是Git命令行中创建带有注解(annotated)标签的操作。具体含义和作用如下:gittag:基础命令,用于创建、列出、删除或校验Git标签。-a:选项指定创建一个带有注解的标签(annotate......
  • CF1628D1 Game on Sum (Easy Version) 题解
    题目传送门(EasyVersion)|题目传送门(HardVersion)前置知识博弈论解法CF1628D1GameonSum(EasyVersion)设\(x_{i}\)表示第\(i\)轮时Alice选择的数。设\(f_{i,j}\)表示已经进行了\(i\)轮,且使用了\(j\)次加法时的最大得分,状态转移方程为\(f_{i,j}=\ma......
  • No supported version of Visual Studio was found.
    问题描述:官网下载CUDAToolkit11.6.0安装包,然后安装CUDAToolkit11.6.0的过程中,出现下面的问题NosupportedversionofVisualStudiowasfound.SomecomponentsoftheCUDAToolkitwillnotworkproperly.PleaseinstallVSfirsttogetthefullfunctionality.......
  • CF1930D1 - Sum over all Substrings (Easy Version)
    对于每一个\(f(i,j)\),我们考虑如何计算。我们发现,\(\texttt{1010}\)式的字符串很有用,所以这启发我们如果遇到了一个模式\(p_i=\texttt{'1'}\),那么我们可以在\(i+1\)的位置放一个\(\texttt{'1'}\)。这样我们直接处理了\(i,i+1,i+2\)。容易证明这是最优的。#incl......
  • 一个pygame小练习
    如果不想看过程,可直接跳到结尾有完整代码游戏截图:第一部分代码#最开始的方框矩形代码importpygamepygame.init()win=pygame.display.set_mode((500,500))pygame.display.set_caption("FirstGame")x=50y=50width=40height=60vel=5isJump=False......
  • 「ABC221D」 Online games
    题意给\(n\)组整数\(a_i\)和\(b_i\),表示有一个人在\([a_i,a_i+b_i)\)登录。求\(\forallk\in[1,n]\),有\(k\)个玩家登录的天数。分析很明显的差分,但是因为\(a_i,b_i\le10^9\),不能直接开差分数组。注意到\(n\le2\times10^5\),所以可以用pair数组代替差分数组,......
  • SpringbootLogingApplication has been compiled by a more recent version of the Ja
    一、问题描述:        SpringbootLogingApplicationhasbeencompiledbyamorerecentversionoftheJavaRuntime(classfileversion61.0),thisversionoftheJavaRuntimeonlyrecognizesclassfileversionsupto55.0        更新版本的Ja......
  • This beta version of Typora is expired, please download and install a newer vers
    ThisbetaversionofTyporaisexpired,pleasedownloadandinstallanewerversion.实测最简单有效的方案一、问题突然想看看之前写的笔记,结果typora打不开了,提示ThisbetaversionofTyporaisexpired,pleasedownloadandinstallanewerversion.二、解决方法......