首页 > 其他分享 >CF1867C Salyg1n and the MEX Game

CF1867C Salyg1n and the MEX Game

时间:2023-09-12 12:26:25浏览次数:42  
标签:Salyg1n set 加入 int Game 答案 移除 Bob MEX

思路

看着无从下手,实际上又是一道诈骗题。

假设原数列不存在 \(0\),那么我们可以直接加入 \(0\),然后游戏结束,假设答案是 \(k\)。那么,如果我们选择加入 \(k\),来试图让答案变大,那么 Bob 就会移除一个数,最优的话是 \(1\),这样的话,你无论加入 \(1\) 还是 \(0\),答案都不会超过 \(1\),于是一手好牌就被你打没了,就算 Bob 不移除 \(1\),移除 \(x\),你的最终答案也不会超过 \(x\) 了。

(因为 Bob 只能移除比你加入的数还要小的数,所以如果你操作不好,Bob 甚至还没法让你)

那么,我们直接猜测最优的操作是每次加入目前集合中不存在的最小的数。

蒟蒻大概证明一下:

假设目前最小的不存在的数是 \(x\),那么 \([0,x)\) 都应该是存在的,那么加入以后 \([0,x]\) 都是存在的,答案为 \(x+1\),此时 Bob 会移除中间的某个数,那么我们再加回来,直到 Bob 移除了 \(0\),然后你添加了 \(0\),游戏结束。

但是如果你不加入 \(x\),那么,Bob 再随便移除一个数 \(y\),这时,如果你使用之前的策略,答案也只是 \(x\),不使用的话,Bob 再移除一个小于 \(y\) 的数,答案将会再次变小,你就会无力回天了。

所以想要答案尽可能的大,我们就只能每次选择最小的不存在的数。

蒟蒻在开始想的是拿个 set 存,但是,显然 set 的常数是接受不了的,可以想象,如果数据是 \([0,n-1]\),那么 Bob 就可以和你扯大约 \(n\) 次皮,加上 set \(\log n\) 的复杂度,轻松让你 TLE

当然,也可能是我操作 set 有问题,因为我是把前 \(10^5\) 都统计进了一个 set,然后再转一遍到另一个 set,并且赛后才发现给的是有序的,连最开始的 set 也不需要。(果然 OI 学多了,会掉视力)

然后蒟蒻转念一想,如果最开始加入 \(x\),那么 Bob 无论取走那个数,下一次最小的都一定是 Bob 取走的那个数。

原来这么简单,赛时交了一发 TLE 一定是我脑抽了。

AC code

#include<bits/stdc++.h>
using namespace std;
int T,n,a,p;
set<int>s;
int main()
{
	scanf("%d",&T);
	while(T--)
	{
		cin>>n,s.clear();
		for(int i=1;i<=n;++i) cin>>a,s.insert(a);
		for(int i=0;i<=100000;++i) if(!s.count(i)){p=i;break;}//这里只是为了方便找到第一次的答案,所以用了set
     //其实不需要的,因为给的本身就是有序的,但是赛时没看到,现在又懒得改了。。。
		while(1)
		{
			cout<<p<<endl;//上文是指这里用了set
			cin>>a;
			if(a==-1||a==-2) break;
			p=a;
		}
	}
	return 0;
}
 

标签:Salyg1n,set,加入,int,Game,答案,移除,Bob,MEX
From: https://www.cnblogs.com/One-JuRuo/p/17695826.html

相关文章

  • CF1867E2 Salyg1n and Array (hard version)
    其实如果你在做E1的时候想到正解了,这道题都甚至不需要改E1的代码,直接交就好,这大概也是E2的分还没E1的高的原因。因为一摸一样的思路,所以这里就不作介绍了,可以看看我的题解。在这里呢,主要是稍微证明一下询问次数不会超,如下:可以发现,有余数的情况,只会增加两次询问,而后面的......
  • CF1867E1 Salyg1n and Array (simple version)
    思路首先考虑,\(n\)是\(k\)的倍数的情况,直接枚举询问所有每一段就好,然后输出每一段的异或和的异或和。如上图,每次询问都没有重叠部分,颠转互不干扰。那么,\(n\)不是\(k\)的倍数的情况呢?可以看到,与第一种情况的区别就是末尾多了一小截,那么我们需要考虑如何计算这一小截的......
  • CF1864E Guess Game
    原题翻译非常好的一道题,不过前半部分的逻辑推理比较难理解,这很博弈由于或运算是有\(1\)就为\(1\),因此我们对于一对数\((a,b)\),我们不需要看\(a|b\)中为\(0\)的那些位,因此我们只需要考虑\(a|b\)全\(1\)的情况即可我们考虑一下如果\(Alice\)说"我不知道"说明什么?说明在\(a\)和\(......
  • [GAMES101] 我的结课打卡
    ......
  • debezium报错:Caused by: io.debezium.DebeziumException:whose schema isn‘t known t
    debezium报错:Causedby:io.debezium.DebeziumException:whoseschemaisn’tknowntothisconnector“trace”:"org.apache.kafka.connect.errors.ConnectException:Anexceptionoccurredinthechangeeventproducer.Thisconnectorwillbestopped.Causedby:io.......
  • 【CF1364C】Ehab and Prefix MEXs(构造)
    题目大意:给出长度为\(n(1\len\le10^5)\)的数组\(a\),构造数组\(b\)使得\(a_i=MEX\{b_1,b_2,...,b_1\}\)首先考虑当\(b_1,b_2,...,b_n\)为什么数时,\(a_n=MEX\{b_1,b_2,...,b_n\}\)。然后再考虑当\(b_1,b_2,...,b_{n-1}\)为什么数时,\(a_{n-1}=MEX\{b_1,b_2,...,b_{n-1}\}\)。......
  • 【刷题笔记】45. Jump Game II
    题目Givenanarrayofnon-negativeintegers nums,youareinitiallypositionedatthefirstindexofthearray.Eachelementinthearrayrepresentsyourmaximumjumplengthatthatposition.Yourgoalistoreachthelastindexintheminimumnumberofju......
  • 【题解】CF1854E Game Bundles
    你考虑我们需要构造出一组解,显然地这样的解有很多很多种(\({60^{60}}\)显然是及其地大)。那关键是我们如何进行构造。我们很容易知道每个集合里面\(>30\)的数只有一个。所以我们可以在\([1,30]\)中随机\(a_i\),直到满足的组数恰好小于等于\(a_i\),添加的时候维护数组\(f_i......
  • 无涯教程-JavaScript - IMEXP函数
    描述IMEXP函数以x+yi或x+yj文本格式返回复数的指数。复数的指数为-$$e^{((x+yi)}=e^xe^{yi}=e^x(\cosy+i\siny)$$语法IMEXP(inumber)争论Argument描述Required/OptionalInumberAcomplexnumberforwhichyouwanttheexponential.Requir......
  • 信息: org.jbpm.JbpmException: closed JbpmContext in different order then they we
    刚接触jbpm 刚才遇到这个错误:closedJbpmContextindifferentorderthentheywerecreated...checkyourtry-finally'saroundJbpmContextsblocks我百思不得其解,网上说是hibernate的session没关闭,在搜索也就是javaeye那几个。查看了源代码有这句话:if(jbpmContext!=......