2018石中大集训测试总结

                             810测试总结 谢鹏宇

第一题:三堆石子tristone

题目描述:

       有三堆石子,两个人轮流从其中一堆取1到任意颗石子,并约定取走所有三堆中最后一颗石子的人胜利。

       现给定石子数量,问先手有没有必胜策略?

输入:

       一行,三个正整数a,b,c表示石子数量,用空格隔开。

输入:

       若先手必胜,输出2个整数x,y,表示先手第一步从第x堆石子取y颗,如果有多种方案致胜,输出所有方案,每行一个,按照取的石子的编号从小到大排序。

否则输出一行no。

总结:这是一道Nim游戏的题目,它的原版因该是有n堆石子,然后问最后先手有没有必胜策略。考试的时候有几个同学翻书,说是全部异或一遍,非0就是必胜,是0就必败。然后因为(1)我觉得这不是我想出来的,(2)这是作弊的行为,等于白做。所以当时打了输出“no”看看能不能骗到分,结果是0分。。。考试完了后,我最大的不懂的地方,还是为什么要用异或,用其他的不行吗,然后在叶师兄的解释和网上的资料下,终于懂了。其实异或只是一个工具,因为它之间的状态和必败态必胜态之间的关系恰好联系上了,也就只是用异或去实现罢了,为什么这么和说呢?

我们先依题而言,必胜态和必败态的关系,最后的结局一定是到必败态,为什么呢,因为在最后一步的上一步先手一定能把石头取完,也就是先手的必胜态,所以无论如何最后一步是必败,在异或里面就用0表示必败,用非0表示必胜。我们先看看一下几个对Nim游戏中必胜,必败的定义:1所有的必胜态一定能转换到必败态  2所有的必败态只能转换到必胜态。先证明2吧,貌似它简单一点,对于n个数,如果a1^a2^a3……an=0的话,从堆石头拿走一些石子最后的异或和一定不是0,先从两个数看起,如果a^b=0那么可以易证a一定等于b如果,逆命题就是只有a异或自己才能等于0,所以当a或者b堆拿走一些石头的时候,a肯定!=b所以经过逆命题,就可以推出a^b!=0其实n个数也是一样的,如果全部的异或和=0,一定能够使得某些的异或和等于剩下的数的异或和(分成两堆)无论拿走多少颗头,有一边的石头一定不等于另一边,所以就保证结果!=0所以就是必胜态了,结论就是无论你如何操作,必败态只能转换成必胜态。我们再看2吧,所有的必胜态一定能转换成必败态,假使a1^a2^a3^a4^……^an=k(k!=0),如果要使她变成必败态就是等式右边要为0,那就是a1^a2^a3^a4^……^an^k=k^k  ->   a1^a2^a3^a4^……^an^k=0对吧。我当时是想到这样去证明:当只有两堆石头的时候假设一堆是7另一堆是12  7^12=11现在是必胜态,如何转换到必败态呢?把12那堆石头去掉5颗石头,使得7=(12-5)那么就等于0 了,如果是三堆石头假设多一堆是31,那么7^12^31=20,所以因为7^12=11 只有31等于11的是时候才能达到结果为0 ,所以就从31堆里取出20个石子,所以我推测至少会有一堆石头>剩下的石头的异或和。也就是一定有一个数x>=x^k,可以简单证明一下吧,三个数a,b,c如果a<a^k,b<b^k,c<c^k,那么也就是a<a^a^b^c  ,b<a^b^b^c  ,c<a^b^c^c  然后又可以变成 a<b^c  b<a^c  c<a^b  把a<b^c中的c直接用a^b代替(因为c<a^b答案放大一点没有什么问题)所以a<b^a^b  a<a 这显然产生矛盾(我自己的证明方法,不知道对不对啊)所以也得到答案必胜态一定能够转换成必败态。所以这道题目就解决出来了,先判断所有的异或和是否=0,是的话就是必败态,输出no否则判断每个x是否x>= x^k。

 

第二题:牺牲 sacrifice

题目描述:

       神鸟局是一个训练有素的政府组织,有一天他们来到了膜法城,解决当地的暴恐问题。

经过调查,他们已经掌握了恐怖分子老巢的位置,于是神鸟局决定派出n个人的小分队端掉恐怖分子老巢。

但是当这支小分队来到恐怖分子老巢的时候,他们发现了一个更为严重的问题,那就是这座城的人民是拥戴恐怖分子的,拖延对他们十分不利。为了端掉老巢,他们决定快速突入,干掉恐怖分子的首领。

幸好之前调查时在老巢安插的间谍,已经掌握了这个老巢的建筑结构及人员安排:老巢由m层地下室组成,相邻两层之间有一支武力值为ti的部队把守,这些部队可能经过境外势力专业训练,也可能是周边的民众自发加入,但是整个老巢的抵抗力量只有这m支部队。

为了迅速解决战斗,小分队不可能消灭每层楼的所有部队,他们也知道这一战会令他们全灭,无论任务完成与否。他们决定每层楼安排一个能力值为xi的不怕死的人分散每层部队的注意力。

一个人显然是敌不过整支部队的,所以如果派能力值为x的人去引开武力值为y的部队,会有2种情况出现,当x<=y的时候,派去的人会立即被杀死,甚至无法为小分队拖延时间,否则派去的人在被杀死之前,可以恰好为整支部队争取时间往下爬x-y层,以及如果这个人被杀死,整个小分队将腹背受敌,立刻全灭。

值得注意的是,在爬到最底层之后,还要花爬下一层的时间找到首领。例如,这使得引开最后一支部队的人需要争取足以爬2层的时间,剩余的人才能杀死首领。

如果能够杀死首领,即便之后小分队全灭了(必然),也在所不惜!

现在给出小队每个人的能力值,以及每一层部队的武力值,问这支部队能否杀死首领?

输入:

       2组数据,每组数据具有以下格式。

       第一行 n和m,表示小分队的人数和老巢的层数,保证n>m,即小分队在抽出m个人分散每一层部队的注意力以后,还能有人负责干掉首领。

       第二行 n个数,表示小分队的每个人的能力值,已从小到大排好序。

       第三行m个数,表示从最表层到最底层的m支部队的武力值。

输出

       如果能够杀死首领,输出yes,否则输出no。

 

数据范围:

分数

n(max)

m(max)

20

10

10

20

100

100

30

2000

1000

30

100000

50000

ai为正整数,总和小于等于10^9

 

时间限制:1s

 

样例数据:

输入

输出

5 3

1 5 7 10 13

9 4 8

13 7 10

7 10 13

5 3

1 5 7 10 13

9 5 8

8 10 13

yes

no

 

样例解释:

第一组数据中,令13对付第一层,能争取爬4层的时间。令7对付第2层,能争取爬3层的时间,刚好足够杀死首领。(往下爬2层,然后杀死首领)令10对付第3层,能争取爬2层的时间。

第二组数据中,第2层的部队更为强力,使得7只能拖延2层时间,之后小分队会在往下爬2层到达首领所在楼层以后,在有机会杀死首领之前,全灭。

总结:这道题目其实很简单,我们可以简单想出每层楼选择的人之和它的层有关,并不会影响后面的选择,粗略的来说,你选人的顺序,就是第一层选谁,第二层选谁,都是无后效性的。我们刚开始想到的是一层一层看,能否在数列(小分队)中找到第一个比这层侍卫的能力值+到达首领房间以及杀死它的时间的人。为什么要第一个呢,因为要把更大的留给后面,才能让后面的尽可能地走的更远。然而我们发现它的顺序和策略是无关的,只要对每层的侍卫的能力值排序(大的在前),在小分队里面倒着选(也就是小分队也是从大到小,因为本来是从小到大就不一一排序了)然后一个一个匹配,看看是否某个队员>=侍卫的能力值+到达首领房间以及杀死它的时间,这样就完工了。其实也挺简单的,但是很多人写了二分,炸了。

第三题:变幻莫测的风车rosewind

题目描述:

       Sherry有一架非常神奇的飞机,名字叫做玫瑰风车。

       今天她很高兴,决定用飞机往自家飞机专用的跑道抛洒染料,使得跑道染上五颜六色。

       飞机跑道可以看作是n个单位格子组成的,这个世界的涂料有奇怪的特性,就是每种颜色都有编号,然后在颜色为d的格子上涂上颜色r会使得该格子的颜色变为d xor r。

       Sherry每次染色,首先会俯冲到某个位置,然后保持高度向地面喷洒颜料并行驶一段距离,然后起飞并停止喷洒,故每次涂上颜色的格子是连续的。

       给出每次染色的区间以及喷洒的颜色,求最终跑道上颜色的种类数。

每个格子一开始都是颜色0。

输入:

第一行两个数字n,m表示跑道的长度和染色的次数。

之后n行,每行2个整数l,r,d表示这次喷洒从第l个格子喷到第r个格子,喷洒颜色d。

 

输出:

一个数字,跑道上颜色的种类数。

 

数据范围:

编号

max(n,m)

1

n=1,m<=10

2-8

10

9-14

1000

15-20

100000

样例数据:

输入

输出

解释

4 2

1 2 3

2 3 5

4

第一次,格子1和格子2染上颜色3,第二次,格子2变为颜色3 xor 5=6,而格子3变为颜色5。加上未染色的格子4(颜色0),一共有4种颜色。

 

总结:这道题目,当时就没想拿满分,因为19个点都是可以用线段树实现的了,拿95分和100分之差5分,何况当时时间可能也不算充分,还是打了熟记于心的线段树,直接对区间进行异或覆盖。。。后来因为老师改数据,最后一个点也可以用线段树实现,所以这道题满分。。那还是讲讲正解吧,差分,加标记a[l-1]^=v,    a[r]^=x   然后扫一遍,sum^=a[i]如果sum没出现过就ans++

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值