摘要:
选点问题 Description 陶陶和鹏鹏在玩一个十分有趣的游戏!已知平面上有n个不同的点(保证不存在任意3个点共线),陶陶首先任意选取其中2个不同的点a,b,并连线得到线段AB,之后鹏鹏从剩下的n-2个点中任意选取2个不同的点c,d,并同样连线得到线段CD。 对于陶陶选择的点a,b,鹏鹏可能有若 阅读全文
摘要:
题意:有个一维棋盘,两人轮流下棋,然后谁连成三个谁赢 记得去年fj夏令营有见过这题,但是太弱了, 不会做。 记忆化搜索,如果n<=3肯定先手必胜,递推即可。 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include< 阅读全文
摘要:
题意:n堆石子,两人轮流操作,每次操作只能选定其中一堆,并取走若干个(>=1个)。谁取走最后一个谁输。给定一个状态,问先取的赢还是后取的赢。 整个游戏反过来,如果sg为0先手必胜,不为0必败。(特殊情况:所有堆都是1,这时候奇数堆必胜,偶数必败) 1 #include<iostream> 2 #in 阅读全文
摘要:
题意:对于一个给定的取石子游戏,有多少种先手策略获胜? Ans:若无法获胜,则输出0。 若能获胜我们只要找到一堆石子,使得我们能取它的一部分让总和的异或和变为0。我们先将整个游戏的值异或起来为s 则a[i]^s就是除了第i堆以外的其他所有堆的异或和,如果这个异或和小于a[i],说明我们可以通过取这堆 阅读全文
摘要:
大意:有n堆石子,每堆石子个数已知,两人轮流从中取石子, 每次可取的石子数x满足x属于集合S(k) = {s1,s2,s3...sk-1},问先拿者是否有必胜策略? 裸nim,可以用记忆化搜索。 1 #include<iostream> 2 #include<cstdio> 3 #include<c 阅读全文
摘要:
题意:两个人轮流用2~9来乘n,使n不断扩大,n开始为1。当给一个固定值k,谁先使n超过k谁赢。 分析:能到达必败态的状态为必胜态,只能到达必胜态的状态为必败态。对于给定的k,n>=k时为必败态,所有能到达这些必败态的n为必胜态,这些必胜态中最小的是ceil(k/9.0)。凡是大于它的都可以直接到达 阅读全文
摘要:
题意:有若干个团体,每个团体有若干个元素,他们按次序来排队,如果队列中已经有同一团体的元素在,则可以插队到它后面,模拟这个过程 思路:用map存下元素与团体的关系,并开2个队列,一个存整体队伍的排列(毕竟同一个团体的元素会连在一起),另一个存每个团体内部的排列。 阅读全文
摘要:
题意:给定一棵有向图的树,有些节点上有石子,每次可以取一个石子向一个有向边移动,不能移动者负。 Ans:树上nim,叶子节点nim为0,父亲节点递归儿子得到sg值,答案就是每个石子所在点的sg值异或和。 1 #include<iostream> 2 #include<cstdio> 3 #inclu 阅读全文
摘要:
题目大意:n堆石子,可以任取一堆任意个数,不能不取,求先手是否必胜。 裸Nim 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<string> 6 #include<al 阅读全文
摘要:
题意:给你2n个人,两方各n个人,交叉坐,每个人可以取的石子有一个最大限制,总共有S颗石子,哪一方取了最后一颗石子就输了,问先取石子的这一方是否有必胜策略。 DP,dp[i][j]代表第i个人还有J个石子没有取得状态。记忆化搜索 1 #include<iostream> 2 #include<cst 阅读全文
摘要:
题意:对于n堆石子,每堆若干个,两人轮流操作,每次操作分两步,第一步从某堆中去掉至少一个,第二步(可省略)把该堆剩余石子的一部分分给其它的某些堆。 真是好♂题,代码不长就是好♂题。 首先考虑两堆相同的石子,先手一定必输,因为若是我操作第一堆,则后手也可以对第二堆做对称决策。 其实,其他情况,一定是先 阅读全文
摘要:
题目大意:n个石子,每次可以取一个石子向左移动,左边有边界限制,每个位置最多同时放一个石子,求先手必胜还是必败。 首先,我们将石子两两配对,每一对,若是先手可以将左边的向左移动一格,则可以用后手将右边的石子向左移动,则我们将每2个石子配成一对。注意若是奇数堆,最左边的一堆要和边界配对,将每对之间的空 阅读全文
摘要:
构建:像线性的莫队那样,依旧是按sqrt(n)为一块分块。 然后呢,我们可以发现一些树上莫队的性质: 用S(v, u)代表 v到u的路径上的结点的集合。 用root来代表根结点,用lca(v, u)来代表v、u的最近公共祖先。 那么 S(v, u) = S(root, v) xor S(root, 阅读全文
摘要:
俗话说:摩托再好,不如骡拉啊(好像不是骡) Manacher就是O(N)计算最长回文子串的算法。 其中我们需要在0位置加入字符“$",然后原字符串中每两个字符加入一个"#"。 算法中 id 为当前最长回文子串的中心 mx为当前最长回文子串的右侧位置。 每做到一个i,若mx>i,则p[i]=min(m 阅读全文
摘要:
bzoj2179 G_word:只要背模板就行了233 阅读全文
摘要:
题目大意:给定n个点坐标,m条有向边,要求最小树形图。 题解:直接上模板,前面打的 vis[v]=i一直把i打成1,一直TLE。 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #incl 阅读全文