摘要:
今天的题还是挺有价值的,尽管思考难度比较大…… T1 题面 给定一棵树,有两个人轮流在树上取点,假设$A$表示第一个人选择的点中连通块的个数,$B$表示第二个人的 第一个人想让$A B$尽量大,第二个人反之 问都在最优策略的情况下,$A B$最后是多少 $n≤10^5$ 解法 挺妙的题 考虑这样一个 阅读全文
摘要:
题面 "题目传送门" 解法 思路很妙 参见 "hzwer的题解" ~~主席树+LCT……真是个毒瘤的组合~~ 时间复杂度:$O((m+q)\ log\ m)$ 代码 cpp include define N 400010 using namespace std; template void chkm 阅读全文
摘要:
题面 "题目传送门" 解法 显然是贪心题吧,dp感觉并不能做 如果某一个怪可以回血,那么一定先打伤害低的 对于不能回血的怪,先打恢复血量高的 我们考虑已经知道了最后的血量,然后反过来考虑,一定是尽量加比较小的,才能使最后的血量尽量大 那么就变成每一次尽量取剩下的怪中回血量最大的那个 模拟一遍即可 时 阅读全文
摘要:
题面 "题目传送门" 解法 特别基础的贪心题 就是问最多能选出多少个区间,使得这些区间两两没有交集 直接按照右端点排序,然后贪心取就可以了 时间复杂度:$O(n\ log\ n)$ 代码 cpp include define N 50010 using namespace std; template 阅读全文
摘要:
题面 "题目传送门" 解法 考虑将每一个单词翻转,就变成询问前缀了 显然,我们不能让1这种情况存在,否则答案不会更优 那么,对反转后的字符串建一棵Trie,然后父节点一定在子节点之前被选择 考虑如何使最后的代价最小 显然,子树小的应该先被选择,因为这样可以使$\sum x y$尽量小 那么就是一个简 阅读全文
摘要:
题面 "题目传送门" 解法 暴力显然是把每一行的情况枚举后得到的 但是对于$100×100$显然是不可取的 我们可以发现,每一行每一列最多只会有$2$个炮 那么我们可以设$f_{i,j,k}$表示第$i$行时$j$列放1个,$k$列放2个的方案数 分类讨论一下即可 我使用记忆化搜索,感觉比较直观 时 阅读全文
摘要:
题面 "题目传送门" 解法 显然答案不超过2 直接暴力枚举第一格到底是否有雷即可,后面的状态自然就可以确定了 时间复杂度:$O(n)$ 代码 cpp include define N 10010 using namespace std; template void read(node &x) { x 阅读全文
摘要:
题面 "题目传送门" 解法 本题解法十分精妙 构造矩阵,保证每一行是一个公比为3的数列,每一列是一个公比为2的数列 发现这个矩阵最多不超过17行11列 那么我们可以枚举不是2和3公倍数的数放在$(1,1)$的位置,然后构造出该矩阵 设$f_{i,j}$表示第$i$行选取方案为$j$的方案数 转移一下 阅读全文
摘要:
题面 "题目传送门" 解法 ~~可以考虑一种毒瘤方法:二分答案+树剖+BIT套线段树~~ 时间复杂度:$O(q\ log^4\ n)$ 这个写起来麻烦,而且非常丑陋 发现每一次修改只会对子树中的所有点产生影响,而子树的dfs序是连续的 所以考虑单点修改,区间询问,发现可以使用BIT 询问时记录一下所 阅读全文
摘要:
题面 "题目传送门" 解法 假设现在有一个和$S$,那么$1 S$中所有数都可以被表示 不断将$S$加上没有被加过且小于$S$的数 最坏情况为斐波那契数列的时候,但不超过$log\sum a_i$ 用主席树查询即可 时间复杂度:$O(q\ log\ n\ log\sum a_i)$ 代码 cpp i 阅读全文