
bzoj
文章平均质量分 63
Neo__Z
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
bzoj 1857 [SCOI2010]传送带【三分套三分】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1857解题报告容易发现,假设AB上的点已确定,那么CD上取点算出的时间应是一个单峰函数(感觉就行),反过来也一样,所以我们可以三分套三分,先三分AB上的点作为固定点,再三分CD上的点算出该固定点的最优值作为三分AB的依据即可。 注意两条直线要化成一般式Ax+By+C=0的形式,不能用y=k原创 2017-09-05 21:23:13 · 301 阅读 · 0 评论 -
bzoj2330 SCOI2011 糖果 【差分约束】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2330结题报告:裸的差分约束,本应建负边求最短路,但为了好处理建反图正边,再从0点向每个点建一条长度为1的边确保每个人都至少拿一个糖,最后求最长路即可。注意数据要卡建边方式,如果Te了可以参考我的建边方式。#include<iostream>#include<cstdio>#include原创 2017-09-15 20:46:22 · 346 阅读 · 0 评论 -
bzoj1370 团伙 【并查集】
题目描述在某城市里住着 n 个人,任何两个认识的人不是朋友就是敌人,而且满足: 1、我朋友的朋友是我的朋友; 2、我敌人的敌人是我的朋友; 所有是朋友的人组成一个团伙。告诉你关于这 n 个人的 m 条信息,即某两个人是朋友,或者某两个人是敌人,请你编写一个程序,计算出这个城市最多可能有多少个团伙?输入格式第 1 行为 n 和 m ,其中 1输出格式一个整数,表示这 n 个人最多可能有几个团伙。原创 2017-09-09 16:22:41 · 469 阅读 · 0 评论 -
bzoj2199 奶牛议会【2-sat】
解题思路设x,x^1互为反命题,那么对于一张投票(x,y),若不选x则一定选y,不选y一定选x,所以连x^1->y,y^1->x两条边。连出这个图之后,判断每一个点能不能选。也就是说,判断这个点所有能到达的点是否存在冲突(同一类的Y和N都选了),dfs就可以 。 如果某一个议案的Y和N都不能选,那么IMPOSSIBLE 否则的话,如果某一个点不能选,那么它同类不同项的那个点必须选;否则的话这两原创 2017-10-07 16:39:07 · 266 阅读 · 0 评论 -
bzoj2243 染色【树链剖分+线段树】
解题思路:先链剖。 维护线段树时每个节点维护三个值:lc(左端点颜色),rc(右端点颜色),cnt(区间中颜色段数量)。 注意每次合并区间时(详见代码中update,query,Query函数),若左区间rc等于右区间lc是结果要减1; 修改时打标记即可,注意tag初始要赋值为-1,因为有color为0的情况。#include<iostream>#include<cstdio>#inclu原创 2017-10-17 21:57:30 · 291 阅读 · 0 评论 -
bzoj3876 支线剧情【上下界最小费用可行流】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3876解题思路很明显是求上下界最小费用可行流做。 因为每条边都要走一次,所以将原图中的边下届设为1,费用即为边长; 又因为可以从任何点退出,所以从所有点向汇点连边,无上下界,费用为0; 基本图建立完毕,再建立有超级源,超级汇的图跑最小费用可行流。 记得最后还要加上原图中每条边下届(即是原创 2017-10-09 22:01:00 · 749 阅读 · 0 评论 -
bzoj2095 bridges 【网络流判欧拉回路】
题意: 给出一个n个点m条边的无向图,每个边有一正一反两个权值; 现要从点1出发,对每条边经过且仅经过一次; 求一种方案使经过的最大权值最小; (bzoj)输出这个权值即可;题解: 最小值最大显然二分; 二分之后就转化成了一个判定性问题; 判定性问题就是求这个图中是否存在欧拉回路; 而最糟糕的是。。这是混合图。。。 有向图的欧拉回路:每个点的入度=出度 无向图的欧拉回路:每个点的原创 2017-09-12 21:46:48 · 292 阅读 · 0 评论 -
bzoj2286 消耗战【虚树+树形dp】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2286解题思路: 假如只有一次询问,可以很好想到树形dp方程: 如果u是关键点,则f[u]=w(fa[u],u); 如果u不是关键点,则f[u]=min(w(fa[u],u),Σ\Sigma f[son[u]]); 但这样一次复杂度为O(n),则总复杂度为O(nm),显然超时。像这种每原创 2017-10-10 14:51:23 · 358 阅读 · 0 评论 -
bzoj1977 次小生成树【最小生成树+倍增】
解题思路:题目要求的是严格次小生成树。先说说不严格次小生成树怎么做。 要先求最小生成树。然后枚举每一条不最小生成树上的边(x,y,len),那么如果要把这条边压入树中,肯定要删除原树中的一条边。由于要是新树最小,所以删除的只能是原树中x到y路径上的最大边mx1,可以用倍增来求。那么新树大小即为totlen-mx1+len。对所有边进行该操作,取最小值就是答案。那如何求严格次小呢? 其实还是一样的原创 2017-10-28 16:13:16 · 400 阅读 · 0 评论 -
bzoj1084 最大子矩阵【轮廓线dp】
解题思路:虽说题目数据n≤\le100,k≤\le20,但其实可以用轮廓线O(kn)过。 m=1的情况就是最大M字段和问题,详见:http://blog.youkuaiyun.com/cdsszjj/article/details/78270332; 现在说m=2的情况,考虑dp覆盖部分边缘,共有四种情况: 分别记为0,1,2,3。 设f[i][j][k]表示用了i个矩阵,覆盖了j行,边缘情况为0,原创 2017-10-20 18:24:35 · 386 阅读 · 0 评论 -
bzoj1010 玩具装箱 【决策单调性优化dp】
算是一道模板题。 我们可以先得到朴素的dp方程:f[i]=min(f[j]+w(j,i)),j∈\in[0,i)。 w(j,i)表示将j+1~i打包运输的费用,时间复杂度为O(n2n^2)。 然后打表可发现满足决策单调性,所以就可以用单调队列维护决策点,二分查找每个点作为决策点的区间即可,时间复杂度为O(nlogn)。 不能在枚举时用直接判断j+1是否比j更优的方式移动决策点,如:f[0]=原创 2017-10-12 11:22:03 · 618 阅读 · 1 评论 -
bzoj 2120 数颜色 【带修改莫队模板】
解题思路:带修改莫队模板题,注意与普通莫队的区别: 1.块的大小为n23n^{\frac{2}{3}}。 2.询问排序时以左端点所在块为第一关键字,以右端点所在块为第二关键字,最后一次的修改为第三关键字。#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<algorithm>#inclu原创 2017-10-30 20:57:04 · 382 阅读 · 0 评论 -
bzoj 2143 飞飞侠【最短路】
解题思路:这道题点很少,但是边可能很多,直接建图做最短路显然不可行。 但是如果把弹射看成获得了可以走a[i][j]的能量。 这样就可以直接最短路了。 每走一格可看作消耗1的能量,f[i][j][k]表示在i,j这个点且有k的能量的最少费用。 每次只要向四个方向走,或者原地不动即可。 做三次最短路即可。#include<iostream>#include<cstdio>#include<原创 2017-10-31 17:19:32 · 376 阅读 · 0 评论 -
bzoj 1030 文本生成器【AC自动机+dp】
解题思路:题目要求至少含有一个单词的方案数,可以转化成总方案数(26m26^m)减去不含有单词的方案数。 接下来把单词插到AC自动机上进行dp。 f[i][j]表示走到AC自动机的j号结点当前单词长度为i的方案数。 转移就是枚举下一位的26个字母,看是否可行(如果下一位在j的子节点中出现,若被标记为单词的结尾,就不能转移)。#include<iostream>#include<cstdio>原创 2017-11-10 09:46:04 · 333 阅读 · 0 评论 -
bzoj4264 小c找朋友 【边集hash】
Description幼儿园里有N个小C,两个小C之间可能是朋友也可能不是。所有小C之间的朋友关系构成了一个无向图,这个无向图中有M条边。 园长ATM发现对于两个(不同的)小Ci和j,如果其他的所有小C要么同时是i,j的朋友,要么同时不是i,j朋友的话,这两个小C就很有可能一起去吃饭,成为一对好友。出于一些未知的原因,ATM需要你帮他求出可能成为好友的小C的对数。 Input第一行一个数N,原创 2017-10-16 14:54:09 · 386 阅读 · 0 评论 -
bzoj4446 小凸玩密室【树形dp】
知道如何设状态很重要。 设f[i][j]表示走完i为根的子树然后走到j的代价。很显然这样是过不了的。 考虑修改上面的状态。这要从如何求答案开始想。如果我已经求出了f数组,那么枚举起点,肯定是先走它的子树,然后走到它的父亲,接下来遍历它的父亲的另一个子树,然后走到父亲的父亲,以此类推。 那么可以发现很多状态是没用的。修改:f[i][j]表示走完i为根子树后走到深度为j的祖先的另一个儿子的代价(不包原创 2017-10-25 07:45:39 · 345 阅读 · 0 评论 -
bzoj1085 [SCOI2005]骑士精神 【迭代加深搜索】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1085解题思路很容易想到广搜,但空间会超,而深搜又会超时,所以我们用迭代加深搜索,它比广搜慢,比深搜快,但空间和深搜一样,所以可以接受。估价函数least(v)表示从当前状态v到目标状态所需的最小步数,显然是还未归位的棋子数减一;首先枚举所需步数dep,再dfs,若step(v)+least(原创 2017-09-06 21:35:49 · 443 阅读 · 0 评论 -
bzoj 1419 Red is good 【期望dp】
Description桌面上有R张红牌和B张黑牌,随机打乱顺序后放在桌面上,开始一张一张地翻牌,翻到红牌得到1美元,黑牌则付出1美元。可以随时停止翻牌,在最优策略下平均能得到多少钱。Input一行输入两个数R,B,其值在0到5000之间Output在最优策略下平均能得到多少钱。Sample Input5 1Sample Output4.166666HINT输出答案时,小数点后第六位后的全部去掉,不要原创 2017-10-26 18:40:12 · 351 阅读 · 0 评论 -
bzoj3564 信号增幅仪【最小圆覆盖+坐标变换】
解题思路:先把坐标系旋转a度,再把每个点的横坐标缩小p倍,求最小圆覆盖即可。 最小圆覆盖详见: https://wenku.baidu.com/view/584b6d3e5727a5e9856a610d.html 玄学O(n)算法。 这里附一张坐标旋转的图,一眼懂: #include<iostream>#include<cstdio>#include<cstring>#include原创 2017-11-24 21:22:05 · 321 阅读 · 0 评论 -
bzoj 1027 合金【凸包】
解题思路:由于a+b+c=1,所以确定了a,b,那么c就被确定了,所以c这一维可以无视。把一种合金(a,b)看做平面上的一个点。那对于两个点A(a1,b1),B(a2,b2),那么线段AB就是它们可组成的合金,因为线段AB上的每个点都可表示为(xa1+(1-x)a2,xb1+(1-x)b2)(可以用向量证明)。如果再加入一个点C,那线段AB上任意一点到C的线段上所表示的合金都可炼成,即三角形ABC中原创 2017-11-23 11:33:40 · 380 阅读 · 0 评论 -
bzoj1249 动态凸包【凸包+set】
解题思路:由于我用的是极角排序维护凸包,找极点要找初始凸包内部的点,所以用了double,然后就被无情卡精了……。 不过算法还是正确的。首先找一个初始凸包内部的点作为极点,然后按极角放入set,注意旋转超过180度的情况要特判。每加入一个点,就在set中找到它的前驱和后继(注意是环形的),先判断该点是否在已有凸包内,再判断它的前驱和后继是否在新的凸包上,不断删点直到满足为止,同时维护一下面积。贴一原创 2017-11-30 17:16:58 · 939 阅读 · 0 评论 -
bzoj1914 Triangle Counting 数三角形【极角排序】
解题思路:可以发现,对于一个不是黄金三角形的三角形,有且仅有两个顶点满足:另外两个顶点在其与原点连线同侧。所以我们可以用所有三角形个数(C3nC_n^3)减去不满足的个数得到答案。将所有点极角排序,枚举每个点,为了去重对于一个顶点只算在其与原点连线右侧的点数,那么不合法的三角形数就是C2nC_n^2,又注意到随着点的枚举,不合法的点也是随之单调旋转的,所以用两个指针即可。PS: 原来极角排序可以用原创 2017-11-30 20:00:13 · 337 阅读 · 0 评论 -
bzoj2049 洞穴勘探【LCT模板】
解题思路:LCT模板题,用Link,Cut,Findroot操作即可。#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<cmath>#include<algorithm>#include<ctime>#include<vector>#include<queue>#define ll原创 2017-11-22 15:07:14 · 324 阅读 · 0 评论 -
bzoj3261 最大异或和【可持久化trie树】
解题思路:题目要求的是a[p]^a[p+1]^……^a[n]^x的最大值。 而该式等于sum[p-1]^sum[n]^x,其中sum[i]表示a[1]^a[2]^……^a[i]。 sum[n]^x可以直接算出,所以我们相当于每次去区间[l-1,r-1]中贪心找异或(sum[n]^x)的最优值可以像建主席树一样建一棵可持久化trie树,每新加一个数字,就新开一条链,并把上面的cnt值加一。 查找原创 2017-12-19 17:14:32 · 263 阅读 · 0 评论 -
poj2104 K-th Number【主席树模板】
解题思路:主席树模板题。#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<cstdlib>#include<cmath>#include<ctime>#include<algorithm>#include<iomanip>#include<cctype>#include<queu原创 2017-12-19 18:06:05 · 233 阅读 · 0 评论 -
bzoj3707 圈地【计算几何】
解题思路:如果枚举了两个点a,b。如果以点a,b所在直线为y轴的话,可以看出面积最小的就是离这个坐标系y轴最近的一个点。如果我们能够快速的得知最近的点的话,就可以将复杂度降低到O(n2n^2)。把这些点两两之间求出一条直线,记录这条直线是哪两个点取到的,记录这条直线的斜率k。然后按照k排序,我们可以依次按照k递增连续变化的顺序处理这些直线。我们将点按x为第一关键字,y为第二关键字排序组成一个序列,可原创 2017-11-23 09:25:46 · 757 阅读 · 0 评论 -
bzoj1942 货币兑换【动态规划+CDQ分治】
解题思路:转自 www.cnblogs.com/zig-zag/archive/2013/04/24/3039418.html 稍稍加上个人见解(括号中)。经典的1D1D动态规划题目,标准做法是平衡树维护凸壳,但实际上还有更简洁的分治法。首先分析一下题目,对于任意一天,一定是贪心地买入所有货币或者卖出所有货币是最优的,因为有便宜我们就要尽量去占,有亏损就一点也不去碰。于是我们得到方程:f[i]=m原创 2017-12-19 21:24:37 · 510 阅读 · 0 评论 -
bzoj4559 成绩比较【动态规划+拉格朗日插值法】
解题思路:我们设f[i][j]f[i][j]表示前ii门课,共有jj个人没有被碾压的方案数,那么答案即为f[m][n−1−k]f[m][n-1-k]假设从f[i−1][w]转移到f[i][j](j≥w)f[i-1][w]转移到f[i][j](j\ge w) 没被碾压的人数本应增加Ri−1R_i-1人,但其中有一部分可能之前就没被碾压了。 则有t1=j−wt_1=j-w个人是新增的人数,要从n−1原创 2017-12-12 08:39:46 · 1100 阅读 · 0 评论 -
bzoj2342 双倍回文【manacher+set】
解题思路:开始以为只用r[i]是4的倍数的位置去检查其两侧是否也是回文就行了,但后面发现是错的,以为所求回文有可能在一个大回文内部,如aaabbaabbaaa;后面看了下题解,还是太天真了。 枚举对称轴x,考虑用len(x,y)*4更新答案,则必须满足y-r[y]<=x,其中y<=x+r[x]/2。 那么我们按照y-r[y]排序后,依次把y插入set,每次询问比x+p[x]/2小的最大值就可以了原创 2017-11-24 09:18:51 · 271 阅读 · 0 评论 -
bzoj2882 工艺【最小表示法】
解题思路:最小表示法模板题。 详解见http://blog.youkuaiyun.com/zy691357966/article/details/39854359#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<algorithm>#include<cmath>#include<ctime>#i原创 2017-11-24 10:05:25 · 293 阅读 · 0 评论 -
bzoj1597 土地购买【斜率优化dp】
解题思路:我们先将土地按xx值排序。 很容易得到一个O(n2)O(n^2)的dp方程: f[i]=min(f[j−1]+x[i]∗max(y[k]),1≤j≤i,j≤k≤if[i]=min(f[j-1]+x[i]*max(y[k]),1\le j\le i,j\le k \le i, 处理j时倒着循环,每次就可以O(1)得到max(y[k])max(y[k])了。其实我们可以把每块土地看做平面原创 2017-12-04 11:12:30 · 370 阅读 · 0 评论 -
bzoj1038 瞭望塔【半平面交】
解题思路:可以发现,可以看到所有区域的点都位于轮廓线的上半平面交内,如样例:yy一下,发现最优修建地点就在轮廓线或半平面交的转折点的垂线与另一条的交点所组成的线段,由于是交错递增的,可以O(n)处理出。这道题球半平面交时可以只用栈,因为后面的直线不可能与最前面的相交。#include<iostream>#include<cstdio>#include<cstring>#include<stri原创 2017-11-24 16:02:08 · 366 阅读 · 0 评论 -
bzoj2190 仪仗队【欧拉函数+线性筛】
解题思路:我们以左下角为原点,建立直角坐标系。 那么一个人(x,y)(x,y)能被看到,当且仅当x,yx,y互质。 也可以看做求从原点开始有多少个不共线的向量。如果d=gcd(x,y)≠1d=gcd(x,y)\ne 1,那么它会和(xd,yd)(\frac{x}{d},\frac{y}{d})共线。 如果我们以y=xy=x作为对称轴,那么两边情况相等,而(1,0),(0,1),(1,1)(1,原创 2017-12-04 15:16:04 · 374 阅读 · 0 评论 -
bzoj2391: Cirno的忧郁【三角剖分+Splay】
解题思路:我们先把所有点极角排序,固定点价值视为0,预处理出sum[i][j]表示极点O到点i(固定点)和极点到点j(固定点)所圈成的三角形内的青蛙价值,逆时针为正,顺时针为负,那对于一次询问,只需要像求多边形面积一样把相邻两点的sum加起来即可。那如何预处理出sum[i][j]呢?我们可以枚举i并以Oi为初始抽,逆时针加入j点,算出向量Oi与向量ij的cos值,若之前加入的一个点k在三角形Oij内原创 2017-11-25 16:25:37 · 549 阅读 · 1 评论 -
bzoj3667 Rabin-Miller算法【Rabin-Miller+pollard_rho】
解题思路:首先说一下Rabin-Miller素数判定算法。定理一:假如p是质数,且(a,p)=1,那么ap−1≡1(modp)。即假如p是质数,且a,p互质,那么a的(p−1)次方除以p的余数恒等于1。(费马小定理)定理一:假如p是质数,且(a,p)=1,那么a^{p-1}≡1(mod p)。即假如p是质数,且a,p互质,那么a的(p-1)次方除以p的余数恒等于1。(费马小定理)该定理的逆命题是不一原创 2017-12-05 11:30:53 · 513 阅读 · 1 评论 -
bzoj2395 Timeismoney【最小乘积生成树】
解题思路:题目即是求令∑ci∗∑ti\sum c_i*\sum t_i最小的生成树。我们把∑ci\sum c_i看做横坐标xx,∑ti\sum t_i看做纵坐标yy,要求k=xyk=xy最小,即是使得函数y=kxy=\frac{k}{x}最接近坐标轴。而一个点对应了一个函数,这些函数要么重合,要么不相交。 所以我们要找的点一定在一个左下部分的凸包上。看网上的题解求凸包左下部分都是用的分治法。1.首原创 2017-12-22 18:14:50 · 459 阅读 · 0 评论 -
bzoj 2178 圆的面积并【辛普森积分】
解题思路:辛普森积分可以求过三点(l,f(l)),(mid,f(mid)),(r,f(r))(l,f(l)),(mid,f(mid)),(r,f(r)),其中mid=(l+r)/2mid=(l+r)/2的抛物线在(l,r)(l,r)一段的积分。其公式为:∫rlf(x)=(r−l)6(f(l)+4f(mid)+f(r))\int _l^rf(x)=\frac{(r-l)}{6}(f(l)+4f(mid原创 2017-12-07 10:58:16 · 460 阅读 · 0 评论 -
bzoj4300 绝世好题【动态规划】
解题思路:注意只是bib_i&bi−1≠0b_{i-1}\ne 0,不是前缀与和为0。那么我们就可以按位dp,f[i]表示处理到当前数,第i位不为0的最优长度。转移就很轻松了,可以看代码。#include<bits/stdc++.h>#define ll long longusing namespace std;int getint(){ int i=0,f=1;char c;原创 2017-12-25 16:22:41 · 263 阅读 · 0 评论 -
bzoj2038 小Z的袜子【莫队算法模板+详解】
解题思路:莫队出的模板题。如果我们知道了询问区间中每种颜色的数量cnticnt_i,那么一种颜色的贡献就是C2cntiC_{cnt_i}^2,总方案数是C2r−l+1C_{r-l+1}^2,每种颜色贡献求和再与总方案数求gcd即可。关键是如何快速统计区间内每种颜色的数量,这就要用到莫队算法。考虑建立两个指针l,r,表示区间[l,r]内每种颜色的数量已知。 再将询问离线,按询问左端点所在块(块大小为原创 2017-12-25 19:05:45 · 374 阅读 · 0 评论 -
bzoj1006 神奇的国度【完美消除序列】
解题思路:题目要求的就是用最少的颜色,使相连两点颜色不相同。有结论如下: 最小染色数=最大团大小 Proof. 不可能比这个更小,只需证这个是可行的。考虑按完美消除序列倒序把所有点加进来,每个点只需和所有当前相邻的点不同颜色即可,而当前所有相邻的点最大是最大团大小。所以只需用最大势算法求出完美消除序列,倒着加点统计即可。#include<cstdio>#include<iostream>原创 2017-12-17 22:05:20 · 354 阅读 · 0 评论