题目链接:http://codeforces.com/gym/101147 2017/8/27日训练赛,题目情况9/11,Rank 4/79. A. The game of Osho 题意:定义一个子游戏,B,N可以从N减掉B^k要求B^k小于等于N,当N变成0,该哪个人选,哪个人就输了,给出G个这样的游戏,问最后的输赢情况. 解法:组合游戏,SG打表发现规律,然后求Nim和判断即可. #include <bits/stdc++.h> using namespace std; typedef…
A.The game of Osho(sg函数+二项展开) 题意: 一共有G个子游戏,一个子游戏有Bi, Ni两个数字.两名玩家开始玩游戏,每名玩家从N中减去B的任意幂次的数,直到不能操作判定为输.问谁最终能赢. 题解: GYM - 101147 A.The game of Osho #include <bits/stdc++.h> using namespace std; int t; int g; int b, n; int ans; int main() { freopen("…
A:Zero Array 题意:两种操作, 1 p v  将第p个位置的值改成v  2  查询最少的操作数使得所有数都变为0  操作为可以从原序列中选一个非0的数使得所有非0的数减去它,并且所有数不能变为负数 思路:考虑第二种操作,显然,最少的操作数肯定是不同数的个数 用map 记录,特殊注意0的存在 #include <bits/stdc++.h> using namespace std; #define N 100010 unordered_map <int, int> mp;…
Solution A:Careful Thief 题意:给出n个区间,每个区间的每个位置的权值都是v,然后找长度为k的区间,使得这个区间的所有位置的权值加起来最大,输出最大权值, 所有区间不重叠 思路:贪心的想法,长度为k的区间的起始点肯定是某个区间的起始点,或者长度为k的区间的结束点肯定是某个区间的结束点. 因为存在最优的答案,它的起点不在某个区间的起点,那么只有两种情况. 1° 不属于任何已知区间 2° 在某个已知区间的内部 首先考虑第一种情况  如果不属于任何已知区间,那么根据贪心,我肯定…
A.Arcade Game(康拓展开) 题意: 给出一个每个数位都不同的数n,进行一场游戏.每次游戏将n个数的每个数位重组.如果重组后的数比原来的数大则继续游戏,否则算输.如果重组后的数是最大的数则算赢,问赢的概率. 题解: 用康拓展开求出n是第几大的数,然后递推后面的概率. #include <bits/stdc++.h> using namespace std; typedef long long ll; int t; ]; double ans; ] = {, , , , , , , ,…
题意:有\(n\)个点,\(m\)条边,只有当你的智力值大于这条边的\(w\)才能走,问在花费不超过\(k\)的情况下,从\(1\)走到\(n\)的所需的最小智力值. 题解:这题比赛为什么没想出来呢?赛后看题解发现可以二分答案然后跑最短路来check,网上的题解全都是SPFA啊,我还是喜欢写dijkstra qwq. 代码: struct misaka{ int out; int val; int wis; }e; int t; int n,m,k; vector<misaka> v[N];…
题目链接:https://vjudge.net/contest/155219#overview. A题,用全排列来找出比当前这个数字字典序还大的排列有几个,然后前缀和dp即可.据说可以康拓展开来快速找出前面需要实现的要求. B题,水题. C题,感觉数据比较水.做法是dsu+lca,但是为了实现lca树的结构不被破坏,dsu::find()不能压缩路径.然后线性找lca没T也是有点神奇. D题,dfs即可. E题,dp[i][j][k],表示到了(i,j)并且已经吃了k个2,最多吃了几个3的状态.…
这题上次用的是线性求LCA过的,数据比较水,当时没有被T掉(不过线性的做法是在线的).现在重新的分析一下这个问题.在所有的操作都进行完毕以后,这个图形肯定会变成一棵树,而我们的要求是在这棵树上的一条链上求出边权值t的最大值,那么很显然的可以使用树链剖分来解决这个问题(在做这题之前我还不知道LCA也可以获得一条链上的最值).然后再看这个问题,因为不论是LCA还是树链剖分,都不能够动态的修改树的形状然后维护最值,因此,这样的做法只能够采用离线的做法.最后需要注意的一点是,因为最后求得的这棵树,在时间…
题目链接:https://codeforces.com/gym/101856 D. Dream Team 题意:n个点,让你连边成为一棵树,边权为顶点的GCD(u,v).求所有边权和的最大值. 思路:将每个数进行因数分解,从大的因子开始求最大生成树. #include<bits/stdc++.h> using namespace std; ; vector<int> G[maxn]; int far[maxn]; int n; int find(int x) { if(far[x]…
今日份的训练题解,今天写出来的题没有昨天多,可能是因为有些事吧... Gym100814B 这个题就是老师改卷子,忘带标准答案了,但是他改了一部分卷子,并且确定自己改的卷子没出错,他想从改过的卷子里把标准答案推出来. 因为是选择题,答案就是A,B,C,D里的一个,如果A,B,C,都不对,那就是D对.如果不确定就是?,就是这样的题目. 一开始写的忘记判断如果三个选项都不对,那么剩下的就是答案这个了... 代码写的很丑,想不到简单的写法... 代码: #include<iostream> #inc…