
常见OJ题解专栏
这里会收录一些常见的OJ网站题解
linkfqy
A link to FQY.
展开
-
【LCT维护生成树】BZOJ3669 [Noi2014]魔法森林
题面在这里考虑枚举a的最大值那么只需要让1→n1→n1\rightarrow n的最大值最小即可这样其实就是在做生成树,若当前构成环,则删去环中的最大边如果1到n联通就更新答案了具体实现可以按a排序,枚举每条边作为最大边用LCT维护生成树,其中最大值信息需要保存边的标号然后因为这道题是边权,所以要将边转化为点处理示例程序:#include<cstdio&g...原创 2018-02-12 12:21:39 · 466 阅读 · 0 评论 -
【LCT】BZOJ2843 极地旅行社
题面在这里直接LCT就好了示例程序:#include<cstdio>#include<algorithm>using namespace std;inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+fre...原创 2018-02-11 16:02:35 · 373 阅读 · 0 评论 -
【LCT】BZOJ2049 [Sdoi2008]Cave 洞穴勘测
题面在这里LCT模板题,没什么好说的判断是否联通只需要判断根是否相同即可暴力往上找根是可行的,因为树的均摊深度是lognlognlogn示例程序:#include<cstdio>#include<algorithm>using namespace std;inline char nc(){ static char buf[100000],*...原创 2018-02-11 14:19:39 · 289 阅读 · 0 评论 -
【LCT】BZOJ2002 [Hnoi2010]Bounce 弹飞绵羊
题面在这里LCT模板题,支持join,cutjoin,cut\text {join,cut}操作即可示例程序:#include<cstdio>#include<algorithm>using namespace std;inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; re...原创 2018-02-10 14:40:51 · 399 阅读 · 0 评论 -
【斜率优化DP】BZOJ4518 [Sdoi2016]征途
题面在这里把m2m^2乘进去,答案其实就是m∑a2i−S2nm\sum a_i^2-S_n^2其中aia_i是第i天走的路程那么就是一个最显然的平方和模型,直接斜率优化DP示例程序:#include#include#include#define cl(x,y) memset(x,y,sizeof(x))using namespace std;typedef long原创 2018-01-04 20:53:29 · 552 阅读 · 0 评论 -
【拓扑】BZOJ4010 [HNOI2015]菜肴制作
题面在这里首先要明确,题意不等价于求最小字典序例如:n=4,3→1,2→4n=4,3\rightarrow 1,2\rightarrow 4此时应输出31243124因为题目要求的是在保证1…i1\dots i先完成的情况下,再考虑i+1i+1所以求反图的最大拓扑字典序即可示例程序:原创 2018-01-04 18:48:51 · 575 阅读 · 0 评论 -
【组合数学】BZOJ3505 [Cqoi2014]数三角形
题面在这里首先会发现直接算很难算那么就考虑计算三点共线的方案吧由于两直角边分别为a,ba,b的三角形,斜边上整点数为gcd(a,b)+1gcd(a,b)+1然后中间点要共线就只有gcd(a,b)−1gcd(a,b)-1种可能然后把斜边遍历整个网格图(n−a+1)⋅(n−b+1)(n-a+1)\cdot(n-b+1)最后注意一下这个斜边是可以对称翻转的示例程序:原创 2018-01-02 18:43:31 · 718 阅读 · 0 评论 -
【二分+线段树】BZOJ4552 [Tjoi2016&Heoi2016]排序
题面在这里首先想到二分然后就可以把整个序列转化成01序列(0比mid小,1比mid大)这样排序的操作就可以用线段树区间覆盖来实现最后判断KK这个位置是0还是1,就完成了二分的验证竟然1A了,好高兴示例程序:原创 2017-12-26 20:33:34 · 566 阅读 · 0 评论 -
【水】BZOJ1121 [POI2008]激光发射器SZK
题面在这里由于从一个顶点出发,最后一定会到另一个顶点所以答案就是n2\frac n2 示例程序:原创 2017-12-26 18:11:05 · 433 阅读 · 0 评论 -
【贪心】BZOJ3668 [Noi2014]起床困难综合症
题面在这里按位贪心就好了示例程序:原创 2017-12-14 20:43:58 · 280 阅读 · 0 评论 -
【带限制最短路】BZOJ1922 [Sdoi2010]大陆争霸
题面在这里设摧毁x城市的时间为dst(x)dst(x),则有: dst(x)=max(Max{dst(y)},Max{dst(s)+ws,x})dst(x)=max(Max\{ dst(y) \},Max\{ dst(s)+w_{s,x} \}) 其中yy是保护xx的点,ss是连向xx的点那么就可以直接刷DijstraDijstra了注意为了使dst(y)dst(y)在dst(x)dst(x原创 2017-12-17 20:13:24 · 466 阅读 · 0 评论 -
【分数规划+DFS序上DP】BZOJ4753 [Jsoi2016]最佳团体
题面在这里这个题一看就要二分吧……然后可以用DP验证其实就是树上取最大和但是如果定义不好的话会被卡常……可以DFS序上DP,常数较小fi,jf_{i,j}表示DFS序上前i-1个点,取了j个的最大值然后fi,j→fi+1,j+1 (取i)f_{i,j} \rightarrow f_{i+1,j+1} \text{ } \tag {取i} fi,j→fout(i),j (不取i)f_原创 2017-12-24 19:25:28 · 667 阅读 · 0 评论 -
【边双联通分量】hihoCoder#1184 连通性二·边的双连通分量
题面在这里其实就是边双的裸题示例程序:原创 2017-10-27 21:14:49 · 756 阅读 · 0 评论 -
【最大生成树+倍增】NOIP 2013 货车运输
题面在这里考虑每次都应该走尽可能大的路对于任意两个联通块也是如此,可以只保留边权最大的那条边来连接这两个联通块那么就是最大生成树了每次询问就是在树上询问最小的边权,倍增一发就好了示例程序:原创 2017-10-17 15:55:40 · 734 阅读 · 0 评论 -
【状压DP】UOJ#265 【NOIP2016】愤怒的小鸟
题面在这里其实就是一个简单的状压DP如果你直接O(2n⋅n3)O(2^n\cdot n^3)暴搞肯定是不行的那么就预处理一下gi,jg_{i,j}表示经过i,j两头猪的抛物线经过的猪然后……就好了示例程序:原创 2017-10-25 20:39:32 · 964 阅读 · 0 评论 -
【二分+曼哈顿距离】51Nod 1671 货物运输
题面在这里首先想到二分,设当前答案为SS,传送门的两个端点为x,yx,y则对于ti−si>St_i-s_i>S的路径,必须满足: |x−si|+|y−ti|≤S\left| x-s_i \right|+\left| y-t_i \right|\le S 这个可以理解为曼哈顿距离而到某个定点(si,ti)(s_i,t_i)的曼哈顿距离相等的点构成的集合是一个正方形相当于判断所有正方形是否有交示原创 2017-10-23 07:19:23 · 702 阅读 · 2 评论 -
【树形DP】51Nod 1500 苹果曼和树
题面在这里定义fi,0/1f_{i,0/1}表示处理到i子树,i所在的块是否含有黑色点那么对于fi,1f_{i,1},可以由fi,1f_{i,1}和fi,0f_{i,0}得到对于fi,0f_{i,0},只能由fi,0f_{i,0}得到示例程序:原创 2017-10-23 20:11:44 · 818 阅读 · 0 评论 -
【二分+Two Pointers】51Nod 1686 第K大区间
题面在这里首先需要知道这样一个性质:给一个区间加入元素,众数的个数只会变多不会变少然后就可以想到二分答案只需要验证众数的个数大于等于mid的区间的个数是否大于等于K就好了这个可以用Two Pointers\text{Two Pointers}算法来实现:对于区间的起点i,若有终点j满足该区间众数的个数大于等于mid,则更大的j也满足而i往右枚举,只会使j更往右示例程序:原创 2017-10-24 07:54:40 · 618 阅读 · 0 评论 -
【二分+正序对】51Nod 1711 平均数
题面在这里考虑二分答案,其实就是求平均值大于等于mid的区间个数写出来就是∑air−l+1≥mid\frac {\sum a_i} {r-l+1}\ge mid所以每一项减去mid,写成前缀和就是Sr−Sl−1≥0S_r-S_{l-1}\ge 0然后就是求正序对了示例程序:原创 2017-10-25 15:28:13 · 719 阅读 · 0 评论 -
【组合数】51Nod 1627 瞬间移动
题面在这里考虑枚举移动的步数ii那么答案就是 ∑i=1i<min(n,m)Ci−1n−2⋅Ci−1m−2\sum_{i=1}^{i<min(n,m)}C_{n-2}^{i-1}\cdot C_{m-2}^{i-1}示例程序:原创 2017-10-25 16:42:07 · 828 阅读 · 0 评论 -
【单调栈】51Nod 1423 最大二“货”
题面在这里考虑枚举区间的次大值。那么可以维护一个递减的单调栈,里面都是可能的最大值然后第一个比当前大的值就是区间的最大值,更新答案就好了倒过来再做一次示例程序:原创 2017-10-27 20:34:45 · 697 阅读 · 0 评论 -
【容斥】51Nod 1829 函数
题面在这里其实很简单……我太菜了……想了好久……因为题目要求B中所有元素都至少被覆盖一次所以枚举有几个元素没有被覆盖(这是容斥的基本套路)答案就是: ∑i=0mCim⋅(m−i)n⋅(−1)i+1\sum_{i=0}^m C_m^i\cdot (m-i)^n\cdot (-1)^{i+1}示例程序:原创 2017-10-28 19:04:45 · 809 阅读 · 0 评论 -
【单调栈】51Nod 1349 最大值
题面在这里最大值相关题目求控制区间已经是很明显的套路了啊喂枚举当前点为区间的最大值,用单调栈求出范围,两边一乘就好了示例程序:原创 2017-10-28 21:15:47 · 795 阅读 · 0 评论 -
【乱搞】51Nod 1622 集合对
题面在这里数学题,看懂了就很好做。下面给出证明:首先,集合的异或操作是可以类比位运算的异或操作的。对于一个集合AA,可以给全集的每个元素赋一个01变量,表示是否在集合AA中出现过这样A xor BA\text{ xor }B其实就是两个二进制数异或了然后这个东西是满足交换律和结合律的然后: (P xor A) xor (Q xor B)=A xor B(P xor Q) xor (A xor B)原创 2017-10-29 20:41:37 · 731 阅读 · 0 评论 -
【贪心+优先队列】51Nod 1053 最大M子段和 V2
题面在这里其实很简单……首先有一个贪心想法就是把所有的正数都取来但是这样子段数可能会超过m那么有以下两种方法减少子段数:删去一个正的子段取一个负的子段,并将相邻两个正子段合并然后把这两种操作都扔到优先队列里,每次取就好了示例程序:原创 2017-10-30 15:26:14 · 915 阅读 · 0 评论 -
【主席树】51Nod 1175 区间中第K大的数
题面在这里主席树裸题……联赛快来了还是练练手速吧示例程序原创 2017-10-30 16:46:01 · 875 阅读 · 0 评论 -
【DFS序+树状数组】51Nod 1681 公共祖先
题面在这里稍稍转化一下题面就可以得到,其实是求 ∑x=1nC2s\sum_{x=1}^n C_s^2 其中s是在两棵树中都是x的后代的节点个数如何统计s呢?其实也很简单先对一棵树处理出DFS序,然后遍历另一棵树时,不断插入当前节点,统计子树区间内的个数即可示例程序:原创 2017-10-30 19:52:32 · 778 阅读 · 0 评论 -
【状压DP】51Nod 1779 逆序对统计
题面在这里很水的状压DP……fsf_s表示s这个状态的最大逆序对数显然按照顺序去处理M个数,用于修正后面的转移的权值其实就是算有几个比当前大的示例程序:原创 2017-10-31 09:32:01 · 1146 阅读 · 0 评论 -
【概率DP】51Nod 1398 等公交
题面在这里考虑fif_i表示用了i时间,用了任意辆车概率之和然后就好了示例程序:原创 2017-11-04 16:17:01 · 591 阅读 · 0 评论 -
【莫比乌斯反演】51Nod 1678 lyk与gcd
题面在这里一开始不会做,在Lynstery大佬的点拨下秒懂了……首先推柿子: ∑j=1n[gcd(i,j)=1]aj⇒∑j=1naj∑d|(i,j)μ(d)⇒∑d|iμ(d)∑d|jaj\sum_{j=1}^n[gcd(i,j)=1]a_j \\\Rightarrow \sum_{j=1}^n a_j \sum_{d|(i,j)} \mu(d) \\\Rightarrow \sum_{d原创 2017-11-28 20:18:23 · 821 阅读 · 0 评论 -
【期望DP】HDU3853 LOOPS
题面在这里显然直接倒推就好了示例程序:原创 2017-11-08 21:46:22 · 274 阅读 · 0 评论 -
【期望DP】HDU4405 Aeroplane chess
题面在这里还是期望DP的老套路……从后往前DP,fif_i表示i到终点的期望值,然后XJB转移就好了还有题意貌似是能飞就必须飞?没讲清楚啊示例程序:原创 2017-11-09 20:17:24 · 284 阅读 · 0 评论 -
【欧拉筛+主席树】CodeChef PRMQ Chef and Prime Queries
题面在这里其实非常傻逼……一看就知道是主席树了吧……重点在如何快速对每个aia_i拆分质因子其实可以在欧拉筛的同时记录nxt[x]nxt[x]表示xx除以最小的质因子后得到的数(因为欧拉筛对每个合数仅标记一次)然后对aia_i分解质因子就是O(log ai)O(log\space a_i)的了所以总复杂度为O(nlogn⋅log ai)O(nlogn\cdot log\space a_i)勉强可以过原创 2017-10-28 15:42:27 · 561 阅读 · 0 评论 -
【思路题】AtCoder agc013_c Ants on a Circle
题面在这里如果是在一条直线上的就非常好做。直接把蚂蚁看作可以穿透,然后把所有距离排序就好了因为无论怎么爬,蚂蚁的相对位置是不会变的那么对于这题,只需要知道原来的第一个蚂蚁到了哪里就好了其实就是求穿过(L−1,0)(L-1,0)这条线的蚂蚁的个数这个就很好求了,直接搞示例程序:原创 2017-10-28 20:01:48 · 770 阅读 · 0 评论 -
【扫描线+贪心+线段树】Codeforces 458C Elections
题面在这里考虑暴枚dd表示所有的对手选票不大于dd那么选票大于dd的对手都需要抢选票,如果这样自己的票数还是不够就从选票小于等于dd的对手哪里抢选票这个可以用线段树维护前K小示例程序:原创 2017-10-24 19:02:30 · 922 阅读 · 0 评论 -
【字符串+乱搞】Codeforces 762C Two strings
题面在这里一开始题目看错了……还以为是求LCA\text {LCA}……其实很简单:对A串的每个位置求能匹配到B串的最长前/后缀然后就是在A串上枚举一个位置ii,把[1,i][1,i]能匹配的前缀 和(i,n](i,n]能匹配的后缀拼起来就好了答案在这里面求最优示例程序:原创 2017-10-25 09:58:20 · 649 阅读 · 0 评论 -
【贪心+线段树】Codeforces 557C Arthur and Table
题面在这里其实很简单……暴枚最长桌脚的长度ll,然后长度比ll长的桌脚全部都要砍掉长度比ll短的桌脚选择代价前kk小的砍掉用线段树维护……示例程序 :原创 2017-10-25 12:50:01 · 939 阅读 · 0 评论 -
【分数规划,最优比率生成树】POJ 2728 Desert King
题面在这里分数规划经典题目啊……考虑二分答案midmid则只需验证: ∑cost∑dist≤mid∑cost≤mid∗∑dist∑(costi−mid∗disti)\frac {\sum cost} {\sum dist}\le mid \\\sum cost\le mid*\sum dist \\\sum (cost_i-mid*dist_i) 然后就直接最小生成树了示例程序:原创 2017-10-29 17:22:17 · 689 阅读 · 0 评论 -
【树状数组+二分】BZOJ2028 [SHOI2009]会场预约
题面在这里考虑到每个预约只可能被删除一次所以可以把与当前冲突的预约一个一个删除其实就是不断取某位置前面第一个比自己小的端点这个用树状数组+二分维护就好了(其实也是第K大问题)然后这样就O(nlog2n)O(nlog^2n)示例程序:原创 2017-10-26 15:33:21 · 838 阅读 · 0 评论 -
【乱搞】BZOJ5074 [Lydsy十月月赛]小B的数字
题面在这里可以感觉到当N很大时,基本都是输出NO的如何证明呢?设bi=2ci,∑ci=Sb_i=2^{c_i},\sum c_i=S则有:∀i满足S≤ai⋅ci,即Sai≤ci\forall i \text{满足}S\le a_i\cdot c_i,\text{即} \frac S {a_i}\le c_i考虑这个式子:Sn≤ci\frac S n\le c_i这个显然不能对所有的i成立(除非所有c原创 2017-10-27 20:45:59 · 999 阅读 · 0 评论