省选前题目整理
第一遍:过题目,想解法.
第二遍:敲模板,背代码
Bzoj4872 [Shoi2017]分手是祝愿:找出问题关键+期望dp. 利用数学方法将需要高斯消元的式子变成能够递推的式子. 因为边界问题,将需要顺推的式子变成逆推的式子.
bzoj4873 [Shoi2017]寿司餐厅:最大权闭合子图模型. 需要将区间看作“点”才能看出这一模型.
省选模拟赛 LYK loves rabbits(rabbits):将3只兔子的位置看作一个状态.然后脑洞大开把它和树上两个点经过k条边的路径数联系起来. 根据树上两个点之间的路径只与LCA和两个点有关设状态并转移.
省选模拟赛 LYK loves graph(graph):概率算法+斯坦纳树. random_shuffle函数.
省选模拟赛 LYK loves string(string):搜索+排列数. 主要是看复杂度想解法.
bzoj4870 [Shoi2017]组合数问题:组合式子,看其表示的组合意义,不要化简式子.
bzoj4869 [Shoi2017]相逢是问候:和区间开方一样的套路.多次取幂并且模一个数,最后一定会变成一个常数. 线段树维护一段区间所有元素是否都变成了常数,没有就暴力修改.
bzoj4868 [Shoi2017]期末考试:答案与取值有关,可以通过枚举取值+判定可行性的方法来求解. 二分/三分比直接枚举更快.
bzoj3527 [Zjoi2014]力:分式型看作分母的倒数与分子相乘. 如果下标与答案下标之间有规律,则可以利用FFT. 注意下标的转换: 如果已知原式子中下标的规律:x - y = z. 则需要将式子x + y = z等价变形为原式子. 变形的过程就是对序列操作的过程. 常用的方法是将某一个序列取反.
bzoj4827 [Hnoi2017]礼物:将所求的写成一个完整的式子,对这个式子进行化简,分别求出每个部分的值即可.
bzoj2194 快速傅立叶之二:FFT基本形式,反转一个序列即可.
bzoj2179 FFT快速傅立叶:模板题.
bzoj2694 Lcm:莫比乌斯反演改变求和顺序的时候别忘了约数/倍数制约关系. 有时候因为约数是成对出现的,所以可以互相转化,有时候则不行.
网络流练习题 比特板:补集转化+最小割. 将序列取反来满足最小割的意义. 分奇偶讨论保证最小割的正确性(赋予其方向).
网络流练习题 猜测:“匹配问题”,最小费用最大流.
网络流练习题 染色:看出模型:每个点的儿子之间的最小权匹配. 那么对每个点以及它的儿子做最小费用最大流即可.怎么看出是匹配问题的?因为每个点只能和另外一个点配对.
bzoj3876 [Ahoi2014&Jsoi2014]支线剧情:有源汇的有上下界的最小费用最大流.
bzoj3698 XWW的难题:网格模型.行列之间互相有影响. 用一个点流出的流量和一个点流进的流量来代表“和”.第i行影响第j列的格子是(i,j),利用影响关系来建图.
bzoj2055 80人环游世界:有上下界的最小费用最大流,注意多加一个源点表示流量限制.
bzoj2502 清理雪道:有上下界的最小流.
ctsc2009 移民站选址:选择与选择之间会产生代价,所以利用最小割求解,变成一次割掉许多条边的模型.利用拆点+“中间”连边.
Topcoder SRM590 Fox And City:最短路问题+最小割表限制(离散变量模型).
bzoj3144 [Hnoi2013]切糕:离散变量模型.
Topcoder SRM570 D1L3 CurvyonRails:综合性好题,拆点+染色分组+容量表示限制模型.
bzoj3171 [Tjoi2013]循环格:容量表示限制模型.
bzoj2597 [Wc2007]剪刀石头布:补集转化.费用递增模型.
bzoj1070 [SCOI2007]修车:哲学转化,从整体上考虑个体的贡献.
bzoj1449 [JSOI2009]球队收益:假定最坏局面+费用递增.
bzoj2007 [Noi2010]海拔:有向图的平面图转对偶图,将边逆时针旋转90°即可.
bzoj1001 [BeiJing2006]狼抓兔子:最裸的平面图转对偶图.
Codeforces 311.E Biologist:将黑白两种颜色的点分组.一组与源点相连,一组与汇点相连,将条件也分组. 条件与颜色有“联系”和限制,所以就是最大权闭合子图模型了.
bzoj1391 [Ceoi2008]order:最大权闭合子图模型.将工作与机器之间的连边从inf变成租用机器的费用.
poj2391 Ombrophobic Bovines:二分+最大流. 流量表示一个方案. 显然不能表示时间. 最后的答案只与时间有关,所以二分时间.
bzoj3110 [Zjoi2013]K大数查询:整体二分. 取权值区间[l,r]的mid.如果l==r了,则更新当前操作区间的询问操作的答案. 如果是修改操作,看其修改的值是否>mid了. 然后对操作进行分组.
bzoj2527 [Poi2011]Meteors:整体二分在每一层修改操作进行后要还原哦!
bzoj2738 矩阵乘法:整体二分+二维树状数组. 涉及二维意义上的修改时,如果用线段树,则必须要枚举每一行然后进行修改,复杂度很高,二维树状数组可以很好地避免这一问题.
bzoj3757 苹果树:树上莫队.把两种颜色视为相同的,如果最后两种颜色的数量都不为0,那么就将答案--
bzoj4540 [Hnoi2016]序列:莫队+增量法. 或者直接维护前缀+前缀和,后缀+后缀和,利用维护的这些信息统计答案. 如何统计答案?每次找到区间中最小的一个数. 一个区间的子区间可以划分为:左右端点跨过这个数的区间,左右端点全在这个数左边/右边的区间.
bzoj3052 [wc2013]糖果公园:树上带修改的莫队.
bzoj1086 [SCOI2005]王室联邦:树分块.
bzoj2120 数颜色:带修改的莫队
bzoj2724 [Violet 6]蒲公英:区间众数,分块即可.众数一定是整块的众数或者是块外的.
Loj#6284. 数列分块入门 8:对每一个块维护一个覆盖标记,有完整覆盖标记的就直接统计,否则暴力统计.
Loj#6281. 数列分块入门 5:区间开方,有限次操作后就会变成一个常数,维护一个标记,看每个块里的元素是不是全是0/1了.
bzoj4199 [Noi2015]品酒大会:后缀数组+并查集. 读入的是a[rk[i]]!
Poj3415:后缀数组+单调栈. 对height数组进行分组.
spoj694 DISUBSTR - Distinct Substrings:子串的总个数-ht数组所有元素的值.
poj3261 Milk Patterns:二分+后缀数组+ht数组分组.
bzoj3779 重组病毒:LCT+分类讨论. 每次access操作进行子树加/子树减. 换根操作只需要分类讨论换根后点x的子树是谁即可.
bzoj3514 Codechef MARCH14 GERALD07加强版:LCT+主席树. 一个经典套路. 加入一条边的时候如果两个点已经连通,则找到它们路径上编号最小的那条边,删掉它,并加入这条边,记录id. 最后答案是n - [L,R]中id小于L的边的数量.主席树来维护.
Codeforces 950.E Data Center Maintenance:建图+tarjan缩点求解. (很多有向图建出图来都要缩点).
bzoj2594 [Wc2006]水管局长数据加强版:LCT+时光倒流维护最小生成树. 不要将题目中的删边操作和LCT中的删边操作弄混了.
bzoj3091 城市旅行:LCT+splay维护区间信息. 维护的信息要能够推出答案. 采用差值法确定要维护的东西.即分析两个子树合并时答案的表达式的变化.
bzoj3669 [Noi2014]魔法森林:一样的套路,对一维排序,然后LCT维护最小生成树.
bzoj2002 [Hnoi2010]Bounce 弹飞绵羊(LCT):裸的LCT.以n+1为根,将x转上去后看它的左子树有多少个点.
bzoj2049 [Sdoi2008]Cave 洞穴勘测:找两个点splay上的根节点即可.
bzoj1095 [ZJOI2007]Hide 捉迷藏:超级复杂的点分树,维护3个堆,魔改优先队列,使其支持删除一个数.
bzoj3697 采药人的路径:点分治+前缀思想. 将前面处理过的子树合并成一棵子树,统计当前子树与之前的子树对答案的贡献.
Codeforces 931.F Teodor is not a liar!:最长单峰子序列
Codeforces 932.F Escape Through Leaf:dsu on tree+标记永久化+dp.
bzoj2325 [ZJOI2011]道馆之战:树链剖分+线段树维护连通性.
bzoj3611 [Heoi2014]大工程:虚树dp.统计代价和就是统计每个点的贡献和,求最值可以利用前缀,即采药人的路径中的方法.
bzoj3991 [SDOI2015]寻宝游戏:set动态维护生成树的边权和.
bzoj3572 [Hnoi2014]世界树:挺难的,维护虚树,虚树上的每一条边都对应着实树上的很多个点,所以看虚树上的每一条边归哪一个点管. 如果被两个点管,则二分找出分界点.
bzoj2286 [Sdoi2011]消耗战:虚树+dp.
Hdu4352 XHXJ's LIS:数位dp+状压.利用LIS的O(nlogn)做法来保存状态.注意前导0.
51nod 1684 子集价值:展开式子,二进制数求和技巧:2^i * 第i位是1方案数,dp即可.
bzoj3900 交换茸角:一类特殊的状压dp,先确定上界,然后通过状压dp求出不必要的操作.
bzoj4069 [Apio2015]巴厘岛的雕塑:dp状态的转化+二进制求最值+贪心. 如果限制有下界,就必须被加到状态中. 否则一维状态即可.
bzoj3668 [Noi2014]起床困难综合症:对每一维贪心判定.
Hdu3022 Sum of Digits:两个数组dp,比较数字大小的方法:先是位数,再是从前往后比较大小,依此来设计状态.
bzoj2448 挖油:决策型dp,最小化最大值. 考虑方式:区间中随机选一个点,然后一定会往坏的方向发展. 用单调队列优化区间dp. 内层最大值只是决定了该点从哪里转移.所以单调队列维护最小值即可.
poj3783 Balls:和上一题不一样,有蛋数的限制. 二维dp即可. 因为有蛋数的限制,所以上一题不能用本题的dp. Why? 鹰蛋这一维实际上是给点标号了,如果没有鹰蛋这一维. f[i] 和f[i]是一样的,但是表示的意义不一样,这就矛盾了.
bzoj3802 Vocabulary:预处理转移的方案数来进行转移,适用于用dp求方案数的题目.
Hdu5181 numbers:dp先考虑没有限制的情况,然后将不满足要求的区间给标记上.发现被标记的区间可以变成一个矩形的样子,二维差分即可.
Hdu5693 D Game:删数问题-->区间dp. 如果直接f数组表示最优解,无法转移. 改成可行性状态表示则能够转移. 最后利用求出的可行性信息来求最优值.
斜率优化:
如果要求最小值,那么队首的比较符号就是≥,否则是≤.
如果斜率随着 i 的增大而递减,那么队尾的比较符号与队首的相同,否
则就相反.
bzoj1911 [Apio2010]特别行动队:斜率优化模板题.
bzoj4518 [Sdoi2016]征途:带入m^2,化简式子. 千万不要被提示给迷惑了. 说什么乘上什么东西后会变成整数,乘上的这些东西一般都是有用的.
bzoj1492 [NOI2007]货币兑换Cash:斜率优化+cdq分治+维护凸包+dp. Cdq要先分治左边哦!
Codeforces 937.D Sleepy Game:巧妙利用二维vis数组找奇环. 要注意特殊情况!加上vis = 2判断即可.
bzoj1010 [HNOI2008]玩具装箱toy:四边形不等式优化. w[i,j] + w[i + 1,j + 1] ≤ w[i + 1,j] + w[i,j + 1].
bzoj1597 [Usaco2008 Mar]土地购买:将处理二元组(x,y)的方法全都用上了.先对x进行排序,发现x’ <= x并且y’ <= y的点(x’,y’)是没有存在的意义的,然后y也就有序了.四边形不等式也就成立了.
bzoj3329 Xorequ:数据小可以用数位dp解决,数据大就只能找规律了.
bzoj1009 [HNOI2008]GT考试:矩阵转移dp+KMP.
bzoj3195 [Jxoi2012]奇怪的道路:伴随类的状压dp. 因为第i个点的连边情况不清楚,所以再开一维来表示它的连边(这样阶段性就很明显了).
bzoj2064 分裂:奇怪的状压......和bzoj3900差不多的,分析理论上界然后把不必要的操作给减掉. 状压求子集和还是挺厉害的.
poj3254 Corn Fields:状压dp,预处理出所有合法的状态即可.
Hdu5115 Dire Wolf:区间dp,枚举最后一个被杀死的狼.
bzoj1090 [SCOI2003]字符串折叠:区间dp,两种转移.
bzoj1068 [SCOI2007]压缩:默认字符串左边有一个’M’,三维区间dp.
bzoj1030 [JSOI2007]文本生成器:AC自动机上dp. 一维是匹配到文章的第几位,一维是匹配到trie树上的哪个节点. 不能经过有结尾标记的点和fail指针指向的点有结尾标记的点.
bzoj1040 [ZJOI2008]骑士:环+外向树dp. 断掉环上的任意一条边做树形dp.
Codeforces 939.E Maximize!:三分法.
Codeforces 193.D Two Segments:转到值域上去做.找到本质:值域为[l,r]的数至多被分成2段. 从小到大插入数,看它旁边的两个数是否比它小.
Hdu5385 The path:从两边向中间构造.
Hdu2433 Travel:从每个点出发建最短路树. 讨论删的边是否在最短路树上即可. 如何判断?Pre[s][v] == u.
Codeforces 938.D Buy a Ticket:将每个点看作终点,向外扩展.
Codeforces 938.C Constructing Tests:列出式子解方程.
Codeforces 19.E Fairy:破坏所有奇环交集上的边. 这条边不能属于任何偶环. 找环千万不能用dfs+栈直接找,那样只能找到不重叠的环. 正确的方法是记录每个点第一条连向它的边的编号,每次找到一条边指向的点的编号不是这条边时,就找到了一个环. 有什么好处呢?可以很方便地用树链剖分来维护.
Codeforces 600.E Lomsat gelral:dsu on tree裸题.
Codeforces 741.D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths:对路径进行分类,dsu on tree统计. 统计第i棵轻子树的时候,将前i-1棵轻子树合并成一个子树.路径的端点在这两棵子树中. 或者一端在当前递归到的点u中.
Codeforces 932.E Team Work:求一个式子的值. 不太好求,用一个相似的公式去套. 求导后乘x,进行n次即可得到答案. 可以发现一个式子经过一次操作后可以变成两个结构与原式子相似的式子,那么记忆化搜索下去即可.
Codeforces 932.D Tree:挺有意思的一道题. 倍增的妙用. 这时fa数组不再记录i的第2^j个祖先. 而是记录i的第2^j个权值递增的祖先. 即fa数组保存的点的权值是单调递增的.(往上跳的话),找到入口很关键(fa[i][0]),边界也很重要(sum[i][0]).
bzoj3205 [Apio2013]机器人:边权为1的spfa优化 + 计数排序 + 斯坦纳树. 开两个队列,先把排好序的放到第二个中,每次从两个队列中取队首值较小的那一个,扩展完了以后就放到队列1中.
bzoj2595 [Wc2008]游览计划:斯坦纳树记录路径.在结构体里存图即可. 注意:结构体使用是一定要清空!
Codeforces 934.C A Twisty Movement:利用前缀/后缀信息维护.用线段树维护会改变的量的最值即可. 关键是要把相同结构的部分放在一起.
Hdu4903 The only survival:枚举每个点是什么-->枚举是什么的分别有多少个. 这种转化适用于值域比较小而n比较大的计数题. 统计方案数采取的方法是分布计算(乘法原理),这样不容易错.最后不要忘了最短路大于k的情况.
hdu6166 Senior Pan:多组点对求最短路,如果这些点有编号,则采用二进制分组的方法.利用dijkstra优先扩展短边的性质.
bzoj1486 [HNOI2009]最小圈:二分答案+dfs版spfa判负环. 注意,这里的负环的含义并不是所有边权都是负数的环,而是边权和为负数的环. 需要对每个点都调用一次spfa.
Codeforces 295.B Greg and Graph:时光倒流+floyd的妙用. 最外层枚举的k就是当前加进来的点,不需要每次加一个点再做一次floyd.
bzoj2143 飞飞侠:巧妙建图+dijkstra优化算法.给状态添加一维“能量”.这样每个点就只用向四周的点连边了.并增加“收费充能”和“原地不动”两种决策. dijkstra算法是为了访问到3个飞飞侠后立即退出,继续搜索下去是无用的. 还是利用了dijkstra算法的原理.
Codeforces 543.B Destroying Roads:有关多条最短路的问题.枚举最短路的交是一种方法.
注意:一定要考虑交换(s1,t1)的情况. 枚举的交的两端与s,t不一定只有一种对应方式..
bzoj2329 [HNOI2011]括号修复:括号序列+splay. 关键就是把左括号看作-1,右括号看作1这种转化. 那么左边的)))就是左子树的最小连续和. 右边的(((就是右子树的最大连续和.
注意:一定要及时应用标记!
bzoj1014 [JSOI2008]火星人prefix:二分+自然溢出hash+splay. 注意提取区间是l,r+2,先pushup子节点,再pushup父节点.
bzoj2653 middle:有关中位数问题的常见套路:小于x的标记为-1,大于x的标记为1. 二分+主席树即可. 多个可能的区间怎么处理? 中间这一段的和+左边的最大右子段和+右边的最大左子段和,看是否≥0,来及时调整二分的值.
bzoj2588 Spoj 10628. Count on a tree:树上的主席树. 回答询问的时候用4棵主席树来统计.
bzoj2223 [Coci 2009]PATULJCI:主席树,不断缩小考虑的权值区间的范围.
bzoj1568 [JSOI2008]Blue Mary开公司:标记永久化模板题.
bzoj3938 Robot:标记永久化,求最大值和最小值比较一下即可. 这道题的数据处理有点困难,利用两条直线列方程来求得第二条直线的截距.
bzoj2962 序列操作:线段树维护比较少的数据,分开维护即可.注意标记间的影响.
bzoj1018 [SHOI2008]堵塞的交通traffic:线段树维护连通性套路题.
bzoj2333 [SCOI2011]棘手的操作:链表+并查集+线段树. 加边不会破坏图的结构,先加边.维护好连通块以后对点进行重编号即可. 重编号的过程非常妙!当两个连通块之间右边相连时,前一个连通块末尾的指针指向第二个连通块的起点.
bzoj1499 [NOI2005]瑰丽华尔兹:单调队列优化dp.
bzoj2561 最小生成树:两次最小割.
bzoj2002 [Hnoi2010]Bounce 弹飞绵羊:分块.维护点i能跳到块外的哪个点,要跳几次.
bzoj3589 动态树:线段树. 求链并部分,对要统计的部分打上标记,只统计有标记的部分.
bzoj4034 [HAOI2015]树上操作:树链剖分+dfs序+线段树
bzoj4774 修路:斯坦纳树+子集更新.
Cf922e:套路背包dp. 状态表示和答案互换.
bzoj1304 [CQOI2009]叶子的染色:树形dp的换根操作. 分析得到换根对答案没有影响.
bzoj1023 [SHOI2008]cactus仙人掌图:无向图上的tarjan找环+单调队列优化dp.
poj2373 Dividing the Path:单调队列优化dp. 伴随关系,注意每次加入队尾的是什么.
bzoj1901 Zju2112 Dynamic Rankings:树状数组+主席树 = 带修改的主席树. 每个主席树不再是前缀而是树状数组中的点.
bzoj3932 [CQOI2015]任务查询系统:差分+主席树.
bzoj1861 [Zjoi2006]Book 书架:splay. 插入不再按权值插入,而是按照size插入.
spoj FTOUR2 - Free tour II:有点难度的点分治. 按照子树阶段性求解(合并前i-1棵子树与第i棵子树求解).每次贪心扫描.
bzoj2152 聪聪可可:点分治裸题
Codeforces 480.E Parking Lot:几个要点:1.时光倒流. 2.答案是单调不减的. 3.更优的正方形一定包括加入的这个点. 利用悬线法,维护每个点向上向下最多扩展多少.
bzoj2458 [BeiJing2011]最小三角形:经典题型:分治求最近点对.
Codeforces 97.B Superset:平面上的分治,构造题. 每次从其他点向中心点所在的竖线作一条垂线.
Hdu5696 区间的价值:好题一道!单调栈+线段树不可行.正确做法是分治. 因为最后的答案只取决于最小值和最大值.固定住最小值,来求最大值即可. 因为要求所有的区间,所以要用到分治. 最后,小区间-->大区间(更新).
poj2549 Sumsets:meet in the middle裸题. hash表,为了保证选的数不同,还要记录选的数是啥.
Codeforces 585.D Lizard Era: Beginning:指数级别的复杂度. 搜索,发现指数降一半才行,meet in the middle. 并不需要知道最后的值是多少,只需要知道3个点的变化量是多少.
poj2724 Purifying Machine:判断两位数是否只差一位的方法:c = a ^ b,c & (c - 1) = 0. 二分图匹配有时候不好分组,按照无向图的方式连,最后得到的匹配数要除2.
poj1486 Sorting Slides:求最大匹配中一定存在的边. 将最大匹配中的每一条边删掉后,看最大匹配数是否改变即可.
Codeforces 25.E Test:关键是两个字符串连接处重复的长度不好算.一个一个枚举的话复杂度是O(n^2)的,比较好的方法是hash. 利用hash的计算公式来快速得到一个子串的hash值.
poj3690 Constellations:寻找元素在集合中是否出现过. 方法肯定是在集合正找这个元素的特征值有没有出现过. hash正好就是这种原理.二维hash,先处理行,再处理列.
Codeforces 578.C Weakness and Poorness:裸的三分. 最后要求最大的 连续子段和的绝对值,先dp一波,然后所有数取反,再dp一波,两次的结果取max即可.
poj2175 Evacuation Plan:消圈定理. 如果题目(最小费用流)给出了一种方案,让你给出一种更优的方案.那么找费用的负环.将这个负环上的所有边都增广1即可.
poj3422 Kaka's Matrix Travels:最大费用最大流,spfa改成求最长路即可.
poj2135 Farm Tour:限制次数,边只能走一次,用容量限制即可.
poj2987 Firing:最大权闭合子图并不是只有被“关联”的点点权为负时才连向T. 所有点点权为负时都连向T.
poj3469 Dual Core CPU:代价之间互相有关联的肯定是最小割. 如果有两种分类.类似cf311E(黑点白点)本题中的A核和B核. 就把它们一个放在源点,一个放在汇点.
poj2079 Triangle:凸包的单调性.只用枚举一维即可.
bzoj1185 [HNOI2007]最小矩形覆盖:凸包+旋转卡壳. 利用单调性,left和right都不用清零.
bzoj1043 下落的圆盘:极角+余弦定理.
poj1228 Grandpa's Estate:要将凸包上所有的点都保留,利用水平排序. 注意求答案时的细致性!
poj2187 Beauty Contest:旋转卡壳一定要特判只有2个点的情况!
poj1039 Pipe:结论:光一定经过一个最低点和一个最高点.
poj3304 Segments:结论题. 判断直线与线段是否相交. 利用跨立法.
poj2318 TOYS:二分+叉积判断点的方位.
poj3907 Build Your Home:叉积计算面积,最后要取fabs /2.
poj1269 Intersecting Lines:直线间的三种关系判断.
zoj1081 Points Within:射线法判断点是否在多边形内. 先判断在边上的情况. 统计与边的交点时如果交点正好是顶点,要看到底是统计边的上端点还是下端点.
CodeChef DGCD:数学结论题. gcd(a,b,c,d,.....) = gcd(a,b - a,c - b,......). 注意gcd为负数和空区间的情况.
Codeforces 717.F Heroes of Making Magic III:从操作分析得到要求的东西. 对奇偶分类来求.
bzoj2243 [SDOI2011]染色:线段树+树链剖分. 重链交界处要特判.开两个全局变量ans1和ans2分别记录操作的上一条链的左端点的颜色和右端点的颜色. 交换x,y时,一定要交换ans1和ans2.
Hdu3223 Decrypt Messages:N次剩余. 求原根,bsgs,扩展欧几里得. bsgs判无解:g % p == 0.
扩展欧几里得判无解:C % d == 0. 做扩展欧几里得的时候p已经变成φ(p).
bzoj2809 [Apio2012]dispatching:左偏树的应用+贪心. 注意:左偏树的任何操作都必须要用id[u].也就是说,如果要在左偏树上操作,就必须用对应的id.
bzoj1367 [Baltic2004]sequence:左偏树神级应用. 先处理简化版本(不严格递增)即,如果原序列的一部分已经是递增的,则照着它填,否则这一部分填中位数. 如果前一部分中位数比后一部分中位数要大,则要合并这两部分,求出新的中位数. 中位数用大根堆维护.每次比较堆的元素个数*2与元素个数. 严格递增的话一开始所有数减去其下标即可(偏序)
poj1284 Primitive Roots:原根个数=φ(φ(x)).
poj2720 Last Digits:欧拉函数,丧心病狂卡时题,预处理+记忆化即可.
Codeforces 449.C Jzzhu and Apples:分组方法.想让gcd不为1,每个质数就必须要和它的倍数分为一组. 那么分组方法就出来了,每个质数和它的倍数为一大组. 剩下的数就都是2的倍数了,单独分为一大组.
poj2115 C Looooops:扩展欧几里得解决.
poj3421 X-factor Chains:第一问每次除掉一个质因子. 第二问是可重复的排列数.
poj2689 Prime Distance:分步筛素数. 先筛出范围小的素数,然后将其在要求区间内的倍数标记上. 倍数太大,无法标记? 区间偏移即可!即将区间整体向左移l.
bzoj2565 最长双回文串:manacher经典套路:将manacher表示的值移到两端. 记录点i向左能延伸的最长回文串和向右延伸的最大值. 统计答案不能统计插入的特殊字符的答案.
Codeforces 17.E Palisection:还是manacher的套路.统计相交的串比较麻烦,遇到统计比较麻烦的题,考虑反向思考.差分修改.将插入字符的答案转移到实际字符上. 最后统计实际字符的答案.
poj4052 Hrinity:AC自动机. fail找后缀,fa找前缀.
Hdu3065 病毒侵袭持续中:和上一题差不多嘛,跳后缀即可.
poj1204 Word Puzzles:一个字符串匹配多个字符串,将多个字符串丢到Trie上. dfs每个方向在ac自动机上匹配. 实际上只需要在第1行/1列/n行/m列的格子上dfs8个方向即可.
Codeforce 633.C Spy Syndrome 2:将所有需要匹配的字符串翻转,并转换成小写形式.对主串进行搜索.搜的是起点,每次枚举下次终点.在trie上移动.如果碰到了结尾标记,则递归到下一层.
poj1816 Wild Words:Trie上的模糊匹配.考虑匹配到trie上的哪一个节点和当前匹配串的哪一位.
poj3630 Phone List:考虑多种情况:自身是前缀,其它字符串是前缀.
Codeforces 526.D Om Nom and Necklace:KMP求最小循环节. 将AB看作整体,任何一个循环节的长度都是最小循环节长度的整数倍.
Codeforces 895.E Eyes Closed:利用期望的线性性.求每个元素对答案的贡献.
Codeforces 895.D String Mark:数字个数有限的数位dp. 套路还是一样的,令另外两维状态表示是否到达上界/下界. 枚举这一位选哪一个数字,记忆化搜索. 无上下界时,直接套可重复的全排列公式.
Codeforces 895.C Square Subsets:dp状态的转化:状态表示从序列长度n到值域范围.
Codeforces 895.B XK Segments:求所有区间的答案,固定一个端点,二分另一个端点的位置.
poj3648 Wedding:2-SAT输出方案. 将缩点后的图反向连边.做拓扑排序. 先到达的强联通分量的点的真值为真,对立的强联通分量的点的真值为假.
poj1523 SPF:求出所有割点和删掉割点后的连通块个数. 分割点是不是根两种情况.在!pre[v]的情况下统计.如果u是根,则没有low[v] >= pre[u]这个要求.
poj3177 Redundant Paths:缩点(双连通分量),统计缩点后叶子节点的个数.答案为(cnt + 1) / 2.具体实现需要注意:1.判断桥和割点不同,是>而不是≥. 2.记录到这个点的边的编号.利用并查集维护双连通分量.
poj1236 Network of Schools:结论题.第一问是缩点求入度为0的点的个数. 第二问是求max{入度为0的点数,出度为0的点数}
poj2186 Popular Cows:结论题.答案为出度为0的强连通分量的点的数量.
Codeforces 894.E Ralph and Mushrooms:缩点+最长路.难点是数学式子的推导. 补集转化.
Hdu5215 Cycle:找奇/偶环,线段树打打标记搞搞就好了.或者求出双连通分量,在每个双连通分量上找. 注意,当一个点的后继节点都递归完后,这个点一定要打上标记(不能再被统计进入环中)
Codeforces 894.C Marco and GCD Sequence:gcd序列与原序列的关系.
Codeforces 894.D Ralph And His Tour in Binary Country:瞎搞题. vector维护每个点子树中的点到该点的距离.(不需要知道具体是哪个点).每次左右子树的vector合并即可. 统计答案的时候不断往根上跳,再统计另外一个分叉的答案即可.
Codeforces 894.B Ralph And His Magic Field:行列之间的影响可以消除. 所以决定因素就是最后一行和最后一列的数.
poj1659 Frogs' Neighborhood:度数序列问题. 将度数排好序,每个点向后面的du[i]个点连一条边.然后再排序,不断重复这个工作.
Codeforces 395 D.Pair of Numbers:统计所有区间的答案. 还是老套路:二分+枚举+ST.
Hdu1542 Atlantis:扫描线.几个要点:1.离散化. 2.找到的右端点要-1. 3.如果x <= l && r <= y,还是要pushup这个点. 3.线段要分上下. 4.pushup的时候如果[l,r]被覆盖了,直接维护答案:sum[o] = X[r + 1] - X[l],否则如果l == r了,sum[o] = 0,否则c[o] = c[o * 2] + c[o * 2 + 1].
Hdu1828 Picture:扫描线求周长. 维护一个num数组表示当前有多少条不重合的横线.每条横线有两个端点能向上扩展. 分为横竖线两类进行统计.扫一次即可.
Hdu1255 覆盖的面积:扫描线求面积的应用. 求覆盖两次的面积,维护两个数组:sum1和sum2.分别表示覆盖了一次的面积和覆盖了两次的面积. 根据标记,sum2可以从sum1处更新.
bzoj2111 [ZJOI2010]Perm 排列计数:一个变量和另外两个变量有关,要看出这可以转化成一棵二叉树来做.一个点的左右子树不会影响. 那么它们的取值也是没有影响的,组合数弄一弄就好了. n ≥ p时,要用lucas定理!
bzoj1951 [Sdoi2010]古代猪文:综合了各种数学知识. 欧拉定理降幂. 快速计算组合数:Lucas定理. 模数是合数:分别求答案然后用中国剩余定理合并.
Hdu3037 Saving Beans:组合数,在杨辉三角上找规律.
Hdu5226 Tom and matrix:杨辉三角+容斥原理+Lucas定理. 杨辉三角每一列的和可以用一个组合数来表示,根据这一点快速计算每一列即可.
【模板】盒子与球:两种决策.要么新开一个盒子,要么放在原来的盒子里.
poj1850 Code:和数位dp有点像.分有上限和无上限的统计.
SGU179 Brackets light:求下一个合法的括号序列.每次从后往前找第一个单调上升的位置,那么后面的就都是单调下降的了.把这个位置的数和它前面的那一个数互换,再把它后面的所有数翻转,一直操作,直到合法. 如何判断是否有解呢?()()()这样的就是无解的.
bzoj1601 [Usaco2008 Oct]灌水:最小生成树.增加超级源来用边权代表点权.
Codeforces243A The Brand New Function:预处理ST表以便实现O(1)查询. or操作具有不可还原性,也就是说0-->1后不能继续or其它的数变成0.根据这一性质来实现右端点的跳转.
51nod1379 索函数:打表找规律. 利用特征方程求斐波那契数列通项公式. 当n非常大的时候可以忽略后面一项.
hihocoder 1509异或排序:对每一位单独考虑限制.最后乘法原理搞一搞.
Codeforces 892 C.Pride:一段区间内的数的gcd = 1.st表即可!还有一种做法:枚举中间点,往两边延伸,每次延伸记录最值.
poj2406 Power Strings:最小循环节. 如果n - next[n] 不整除 n,则无循环节.
洛谷P1290 欧几里得的游戏:找规律,或者sg函数直接秒杀.
bzoj2242 [SDOI2011]计算器:数学方法合集. bsgs一定要注意判断无解情况:底数%模数 = 0.
块的大小是ceil(sqrt(n)).
bzoj1467 Pku3243 clever Y:扩展bsgs算法.如果b = 1,直接返回0. 否则不断取a与p的gcd.当gcd不整除b时,返回-1.然后b,p同时除以gcd.直到取的gcd = 1.
vijos 小三学算术:玄学数论. 将阶乘分组,发现最多只用删3个数.
poj2142 The Balance:二元一次不定方程. 先让其中一个变量取最小值,看另一个变量的值.两种情况取min.
poj3252 Round Numbers:数位dp.考虑前导0的情况.
洛谷P2563 [AHOI2001]质数和分解:直接dp就可以,也可以用生成函数.
Hdu2065 红色病毒问题:指数型母函数. 先用泰勒公式表示,对式子进行化简,然后展开.
X^n / n!前的系数即为所求.