解题:SDOI 2011 消耗战】的更多相关文章

题面 本身求答案是简单的树上DP,只需要求出根到每个点路径上的最小值,然后考虑割连父亲的边还是割所有儿子即可,但是每次都这样做一次显然不能通过,考虑优化 用虚树来优化:虚树是针对树上一些点建出来的一棵树,上面只有这些点和它们的LCA.显然这样虚树的大小不会超过2*所选点数,这样在缩小了问题规模的同时还保留了原树的性质. 具体的建法: 0.预处理DFS序 1.将所选点按DFS序从小到大排序 2.用栈维护一条从根延伸下来的链,依次将排序后的点nde加入.若栈为空则直接入栈,否则设栈顶为top: 3.…
[bzoj2286]消耗战 标签: 虚树 DP 题目链接 题解 很容易找出\(O(mn)\)的做法. 只需要每次都dp一遍. 但是m和n是同阶的,所以这样肯定会T的. 注意到dp的时候有很多节点是不需要的,真正有用的只是被询问的那k个点和他们的lca. 所以对于每次询问,我们只需要对于其中的点建一颗虚树. 然后在虚数上面dp. Code #include<cstdio> #include<cstdlib> #include<cstring> #include<io…
Description 题库链接 给你一棵 \(n\) 个节点根节点为 \(1\) 的有根树,有边权. \(m\) 次询问,每次给出 \(k_i\) 个关键点.询问切断一些边,使这些点到根节点不连通,最小的边权和. \(2\leq n\leq 250000,1\leq m,\sum\limits_{i=1}^m k_i\leq 500000,1\leq k_i\leq n-1\) Solution 在原树做一遍前缀的边权最小值,建好虚树后,简易的树形 \(DP\) 即可. Code //It i…
题面 强行把序列问题通过树剖套在树上...算了算是回顾了一下树剖的思想=.= 每次树上跳的时候注意跳的同时维护当前拼出来的左右两条链的靠上的端点,然后拼起来的时候讨论一下拼接点,最后一下左右两边的端点都要考虑 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ; struct a { int cnt; int lc,rc; }; *N],lcol[*N],rcol[*N…
BSGS算法是meet in the middle思想的一种应用,参考Yveh的博客我学会了BSGS的模版和hash表模板,,, 现在才会hash是不是太弱了,,, #include<cmath> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; struct node{ static const int mo=100007; int a[100010],v…
题目链接:BZOJ - 2243 题目分析 树链剖分...写了200+行...Debug了整整一天+... 静态读代码读了 5 遍 ,没发现错误,自己做小数据也过了. 提交之后全 WA . ————————————— 杯具的分割线 ————————————————— 然后看了别人代码..然后发现.. 我写线段树区间修改竟然没打标记!!!!直接就修改上了!!!最裸的线段树都不会写了!!! Warning!Warning!Warning! 代码 #include <iostream> #inclu…
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2243 算法讨论: 树链剖分把树放到线段树上.然后线段树的每个节点要维护的东西有左端点的颜色,右端点的颜色,以及是否被改变过颜色,和颜色段数. 向上合并的过程中,要注意如果左孩子的右端点和右孩子的左端点颜色相同,那么就要把颜色段数减一. 然后我们考虑询问的问题: 对于一个询问,我们是按深度从下向上跳着计算的,所以每次统计一个路径的时候,我们要记录上一次的路径的两端点的颜色,如果本次路径计算…
Description 题库链接 给出一个 \(1\times n\) 的棋盘,棋盘上有 \(k\) 个棋子,一半是黑色,一半是白色.最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色不同. 小 \(A\) 可以移动白色棋子,小 \(B\) 可以移动黑色的棋子,他们每次操作可以移动 \(1\sim d\) 个棋子. 每当移动某一个棋子时,这个棋子不能跨越两边的棋子,当然也不可以出界.当谁不可以操作时,谁就失败了. 小 \(A\) 和小 \(B\) 轮流操作,现在小 \(A\) 先移动,问有多少种…
Description 题库链接 给定一棵有 \(n\) 个节点的无根树和 \(m\) 个操作,操作有 \(2\) 类: 将节点 \(a\) 到节点 \(b\) 路径上所有点都染成颜色 \(c\) : 询问节点 \(a\) 到节点 \(b\) 路径上的颜色段数量(连续相同颜色被认为是同一段) Solution 线段树苟题.因为没有下传 \(lazy\) 标记调了一上午. Code //It is made by Awson on 2018.3.4 #include <bits/stdc++.h>…
Description 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数: 3.给定y,z,p,计算满足Y^x ≡ Z ( mod P)的最小非负整数. Input 输入包含多组数据. 第一行包含两个正整数T,K分别表示数据组数和询问类型(对于一个测试点内的所有数据,询问类型相同). 以下行每行包含三个正整数y,z,p,描述一个询问. Output 对于每个询问,输出一行答案.对…