
bzoj
文章平均质量分 70
lych_cys
这是一只沙茶
展开
-
bzoj 3150: [Ctsc2013]猴子 高斯消元
范围N 显然我们可以令f[S]表示手上牌集合为S时的胜率,然后高斯消元或者多次迭代出解。 然后打表发现若A∩B=∅,则f[A∪B]=f[A]+f[B],如果这个成立,那我们就可以令f[i]表示手上牌为i的胜率然后高斯消元辣~\(≧▽≦)/~。 考虑另一个游戏:三个人a,b,c,手上的牌为A,B,C,然后任意选两张牌如果不在同一个人手中就和这道题目一样原创 2016-05-24 08:46:33 · 1228 阅读 · 1 评论 -
bzoj 3820: 虫逢 hash
假设我们按照某一种随机的规则在两个同源变形虫中取一个数,那么由于有l/2是相同的,因此概率为1/4。如果我们给每一个基因定一个值,然后定义一个变形虫的值就是它l个基因中的最小值,那么两个同源变形虫相同的概率就是1/3;两个不同源为1/l。如果取两个,就分别是1/9和1/l^2=1/n。 那么每次给每个基因随机定值,这样一次可以得到n/9对,不断操作即可。AC代码如下:#in原创 2016-05-13 13:26:56 · 1012 阅读 · 0 评论 -
bzoj 2125: 最短路 树链剖分
好吧实际上和树剖没什么关系。。只是用来求lca的。。。 对于点x,如果不在环中,定义它的父亲为dfs树;否则定义它的父亲为它所在环在dfs树中最高的点,同时距离为它到那个最高点的最短路。然后可以用树剖求出(x,y)的lca。然后分类讨论一下,因为如果x->lca和y->lca的路径上最后一部分在一个环中,那么可能可以有另一种走法。AC代码如下:#include#inclu原创 2016-05-12 21:03:01 · 1360 阅读 · 0 评论 -
bzoj 2124: 等差子序列 树状数组&hash
这道题太神了根本想不到QAQ。 题目就是求是否存在i 我们不妨枚举中间那个数为x,然后按照输入的顺序对x进行操作。如果x满足条件,也就是存在两个数y和z,x-y=z-x,并且y已经出现过了而z还没有出现,那么我们就可以直接输出'Y'了。 因此,我们构造一个辅助数组b,其中x如果出现过,那么b[x]=1;否则b[x]=0。因此如果x满足条件,那么必然存原创 2016-05-12 19:01:57 · 2032 阅读 · 0 评论 -
bzoj 3822: 文学 动态规划
题目等价于平面上一些点,然后给定某些半平面,选某一个半平面有代价,求最小的代价使得选出的半平面的并包含所有给定的点。 同样,也等价于另一些半平面,其中每个半平面都和题中给出的互补,然后求最小的代价使选出的半平面的交不包含任意一个点。 特判一个半平面包含所有点的情况;那么剩下的就是求一个凸包不包含任何点,N^2枚举凸包上的一个点作为基点,然后令dp[i]为基点到i不包原创 2016-05-12 14:38:34 · 1436 阅读 · 0 评论 -
bzoj 3811: 玛里苟斯 高斯消元&dfs
这道题目还要根据k来分类讨论。。。。 当k=1的时候,按位求贡献,然后发现答案就是所有数or起来再/2。 当k=2的时候,就真的要按位来了。。按照(x1+x2+...+xn)^2展开x1x1+x1x2+x1x3...+xnxn,枚举i,j表示后面式子的下标。然后一个数就变成(0/1,0/1)二元组,当选出的数二元组异或后为(1,1)的时候有2^(i+j)的贡献。显然原创 2016-05-09 18:17:22 · 2119 阅读 · 0 评论 -
bzoj 3817: Sum 类欧几里得算法
这道题目solution写了两种做法,都讲一下吧。 首先,令x=r^0.5,显然,如果x>2,则可以不断减2到小于二;如果x>1,那么变为2-x。因此此时必有x 题目等价于在数轴从0~n,以y长度为一个区间(左闭右开)黑白交替染色,求黑色部分覆盖的整点减去白色部分覆盖的整点。然后把最后面零散的部分暴力计算,如果最后一个是黑色的也暴力计算。那么这个时候黑白段数相等,且原创 2016-05-08 14:24:22 · 3717 阅读 · 0 评论 -
bzoj 3244: [Noi2013]树的计数 递推
这道题目bzoj上面真是丧心病狂,非要输出三个数(ans-0.001,ans,ans+0.001),mdzz。害的我还去抄了一发标程 首先按照bfs的顺序重新标号(比如样例那样),然后对于点x,令pos[x]为x的dfs序编号,a[i]为dfs序的第i个。 考虑每个点的贡献,如果pos[x]>pos[x+1],那么如果x和x+1同一层,显然pos[x]原创 2016-05-06 12:23:27 · 2065 阅读 · 1 评论 -
bzoj 3242: [Noi2013]快餐店 dfs&递推
显然题中的图就是一个环基树。另外对于最优点,必然存在两个点与该点距离相等且都是最远点,考虑这两个点与最优点所构成的链。 1.如果这条链在环外面的树上,那么显然一定是树的直径(另一方面,对于任意环外面的树上的直径,答案必然>直径的一半); 2.如果这条链一部分在环上,那么必然存在换上的两个点x,y,这条链由:x对应树中x的最长链,环上x->y最短路,y对应树中y的最长原创 2016-05-05 20:45:53 · 3084 阅读 · 4 评论 -
bzoj 3672: [Noi2014]购票 树上cdq分治
显然易得dp方程:f[x]=min{f[y]+(d[x]-d[y])*px+qx},其中y是x的祖先且d[x]-d[y] 然后就可以得到对于一定定点z(就是z在等式左边),两个点x,y(d[x]>d[y])且y更优的条件为:(f[x]-f[y])/(d[x]-d[y])>=pz,那么令不等式左边那个为S(x,y)即(x,y)的斜率。 考虑一条链的情况,显然可以离线后原创 2016-05-04 20:30:37 · 1113 阅读 · 0 评论 -
bzoj 4197: [Noi2015]寿司晚宴 状压dp
这题其实N出到800都没问题吧。。 显然,如果两个数有一个质因数相同则不能在两边;更进一步,按照最大质因数,可以把1~N的所有的数分组,那么统一组的不能在两边。显然次小质因数必然 实际上这样是O(N*4^8),但是注意到最终只有i&j=0的才有用。因此有用的状态只有3^8种,因此就是O(N*3^8)。AC代码如下:#include#include#inc原创 2016-05-03 21:43:58 · 584 阅读 · 0 评论 -
bzoj 4011: [HNOI2015]落忆枫音 递推
计数dp(递推)裸题(跟zj的题真心不能比啊)。。。 假设没有那个加边。那么显然答案就是所有点的入度相乘的结果(不包括1),显然每个点都可以随意选择一个入边,那么由于原图是DAG,因此选完n-1条边之后一定连通且无环,因此必然合法。 一开始斯波看错题以为是随意加一条边然后统计总方案数 那么加入S->T这条边之后,不妨仍然按照上述方法直接求答案;然后考原创 2016-05-02 22:11:42 · 625 阅读 · 0 评论 -
bzoj 4025: 二分图 lct
显然一个图是二分图当且仅当图中不存在一个奇环。那么我们用lct维护一个树形结构,如果不存在一条非树边,它连接的两个点在树上的距离为偶数,那么就是一个二分图。那么我们按时间离线之后维护一个树形结构和一个边的集合,集合中的边连接的两点在树上的距离为偶数。那么这个集合为空集则为二分图。 那么如果出现奇环,留下拿一条边在树上就成了问题。显然消失时间晚的可以存在的更久,因此维护一个消失时间的原创 2016-05-02 20:16:28 · 828 阅读 · 0 评论 -
bzoj 2159: Crash 的文明世界 树形dp
一般这种统计里面带k次方的都要转换成组合数把。。。 有:x^k=Σ(i=1,n) Stirling2(k,i)*P(x,i),而P(x,i)=C(x,i)*i!,这样就成功转化成组合数了。那么答案就是对于一定定点x要统计所有的Σ(i=1,n) C(dist(x,i),j) j=1...n,那么利用C(i,j)=C(i-1,j-1)+C(i-1,j),以及父亲和儿子的答案(dist刚原创 2016-04-23 09:56:20 · 1157 阅读 · 0 评论 -
bzoj 3328: PYXFIB 数论&矩阵乘法
AC代码如下:#include#include#include#define ll long longusing namespace std;ll n; int m,mod,cnt,yz[100005];struct matrix{ int p[2][2]; }a;matrix operator *(const matrix &x,const matrix &y){ matr原创 2016-05-24 12:59:45 · 1228 阅读 · 0 评论 -
bzoj 4314: 倍数?倍数! 数学
我们可以把集合改成序列,然后答案再/K!,这样就简单很多了。注意此时1,2,2算两次。 实际上,考虑前K-1个数,我们随意取,这样最后一个数实际上是固定的;但是可能会出现重复的情况,那么此时我们统计最后两个数重复,也就是前K-2个数随意取,且满足前K-2个数的和S使得S+2x≡0(mod N)有解的方案。注意到该方程有解当且仅当S≡0(mod gcd(2,N)),那么对于特定的原创 2016-05-24 16:55:09 · 1315 阅读 · 0 评论 -
bzoj2208 连通数 tarjan缩点&状压常数优化
这道题目还想并没有比O(N^3)更快的算法了。。除非从树的分治入手? 首先tarjan缩点(显然),然后就是个DAG。然后给缩成的强连通分量一个权值为它所含的点的个数,然后对于一个强连通分量该处的答案就是为该强连通分量的权值乘上这个强连通分量所能到达的点的个数(包括自身)。假设用f[i]表示强连通分量i能到达的点的集合,显然f[i]|={f[j]}当且仅当存在边(u,v)使u在强连原创 2016-01-27 21:41:05 · 961 阅读 · 0 评论 -
bzoj1911 特别行动队 动态规划斜率优化
一道比较复杂的斜率优化,如果对于j f[j]+a*(sum[i]-sum[j])^2+b*(sum[i]-sum[j])+c sum[i]>(f[j]+a*sum[j]^2-b*sum[j]-(f[k]+a*sum[k]^2-b*sum[k]))/(2*a*(sum[j]-sum[k]))。 将右边作为斜率k(j,k)则k为下凸函数(就是后一项比前一原创 2016-01-24 21:59:06 · 1124 阅读 · 0 评论 -
bzoj2039 人员雇佣 最小割
这道题目描述真是醉了。。题意,雇佣每一个经理有一个花费,同时雇佣两个经理可以的到2*E[i,j]的利润,如果一个经理雇佣另一个经理不雇佣会造成E[i,j]的损失(注意是倒扣)。 这种题目的做法和最大闭全子图差不多是一个道理。。简单说一下吧(其实是怕自己忘记): 一般来说都是转化成最小割,割完以后和S相连的是要选取的(对应到本题就是要雇佣的),和T相连的是不选取的,然原创 2016-01-24 16:48:59 · 838 阅读 · 0 评论 -
bzoj2656 数列 高精度&递推
原来想hash的,后来发现没有这么复杂。 我们不妨考虑一对数(x,x+1),那么它的结果可以由(x/2,x/2+1)的结果得到,这里的/与c++里的一样表示整除,后面也是如此。有两种情况: 1.x=2u,x+1=2u+1,则Ax=Ax/2,A(x+1)=Ax/2+A(x/2+1); 2.x=2u+1,x+1=2u+2,则Ax=Ax/2+A(x/2+1原创 2016-01-23 21:55:19 · 959 阅读 · 0 评论 -
bzoj2038 小Z的袜子 莫队算法
学习了一下莫队算法。核心就是在可以通过当前状态(l,r)的结果,能够在O(1)时间内推出相邻状态(l-1,r)(l+1,r)(l,r-1)(l,r+1)的结果的前提下,通过安排询问的次序,使总时间复杂度在O(N^1.5)内。因此这实际上是一个离线算法。同时指出,在满足上述前提的情况下,任意两个状态(l1,r1)(l2,r2),在已知一个的情况下都可以在O(|l1-l2|+|r1-r2|)的时间复杂原创 2016-01-23 16:35:58 · 1263 阅读 · 0 评论 -
bzoj2007 海拔 最小割转最短路
这道题目居然可以转化为最小割。。实际上只要剥去题目中华(keng)丽(die)的外壳,就是一个裸的最小割。 首先,这道题目中的终点一定是最高点。不妨考虑所有比终点高的点,将这些点的海拔都变为1,那么答案显然变小,同理起点一定是最低点,因此所有点的海拔范围为[0,1]。 其次,需要剥去这道题目最大的一个外壳,也就是海拔为小数这个绚(keng)丽(die)的条件。实际上原创 2016-01-22 17:10:12 · 718 阅读 · 0 评论 -
bzoj3629 聪明的燕姿 质因数的和&dfs
首先,若n=a1^p1*a2^2...an^pn,那么n的约数和为(1+a1+a1^2+...+a1^p1)*(1+a2+a2^2+...+a2^p2)*...*(1+an+an^2+...+an^pn),记为m。 然后我们就可以通过m来得到n了。可以枚举ai,然后枚举对应的pi,看能否使1+ai+...+ai^pi被m整除。但是这样的话需要求出2*10^9范围内的质数。而如果pi原创 2016-01-10 21:18:39 · 1334 阅读 · 2 评论 -
bzoj2600 ricehub 二分
这么水的题居然没有一眼看出来怎么做。。。 首先二分答案x,那么对于段[l,r],其中r=l+x-1,必然是选择中间的作为米仓(偶数就是中间两个的任意一个)。然后就可以O(N)判断了。。。。。。AC代码如下(NOIP题还拿来水。。。真是没救了):#include#include#include#define ll long longusing namespace st原创 2016-01-10 20:21:02 · 644 阅读 · 0 评论 -
bzoj1858 序列操作 线段树打标记
一道比较繁琐的线段树lazy tag(我写了2.9k应该算比较短的了)。由于有取反操作的存在,事实上我们需要维护下列东西: 1.1的个数; 2.从头开始1的连续的个数; 3.从尾开始1的连续的个数(2、3两个是为了维护连续最大值而存在的); 4.最大的连续的1的个数;同理,还需要维护: 5.从头开始0的连续的个数;原创 2016-01-09 20:08:45 · 1610 阅读 · 0 评论 -
bzoj1597 土地购买 动态规划&斜率优化
最最基础的斜率优化(这么基础的斜率优化还WA这么多发,还好意思说)。 显然如果a[i]>=a[j]且b[i]>=b[j],j是没有什么卵用的,直接去掉,那么如果将a降序排序,可以发现b一定是升序的。从而显然有方程,f[i]=min{f[j]+a[j+1]*b[i]}。那么对于j=s(j,k)时k比j更优。那么当s(i,j)>s(j,k),且i P·S:然而我犯了sb原创 2016-01-09 13:33:09 · 1570 阅读 · 0 评论 -
bzoj 3149: [Ctsc2013]复原 dfs
虽然表算是神奇的分组但是只要搜搜搜就过去了。。。 每个连通块分别考虑,然后枚举这一条弦的两个端点;如果一个端点已经确定,那么另一个端点的范围必然是一个区间,用位运算加速即可。然后就过了。。。 最大独立集的话子集dp一下就好了。。AC代码如下:#include#include#include#define N 25#define M 1300005u原创 2016-05-25 08:44:04 · 1128 阅读 · 0 评论 -
bzoj 4517: [Sdoi2016]排列计数 递推
令s[i]表示i个数错排的答案,那么对于题目中给定的(n,m),相当于求C(n,m)*s[n-m](即在n个中选m个不动其余的错位排列)。 C(n,m)=n!/m!/(n-m)!,可以预处理i!和i!的逆元。根据错排的通项公式s[i]=i!*-Σ(i=1,n) (-1)^i/i,得到s[i]=s[i-1]*i+(-1)^i递推一下即可。AC代码如下:#include#in原创 2016-04-23 09:39:39 · 1009 阅读 · 0 评论 -
bzoj 4540: [Hnoi2016]序列 莫队算法
内测的时候不知道为什么死活想不出来QAQ。。。。 然后看完题解发现傻逼题。。T_T。。。 yy了一个线段树做法(仅理论),在区间[l,r]中保存以mid为中心向两侧的一个单调递减的数组,空间NlogN,显然只有这一个数组中的数对[l,r]的答案有贡献,然后统计一下前缀和二分查找不知道行不行。。。这样应该是O(Nlog^2N)的。 莫队就简单多了。首先用原创 2016-04-22 20:08:06 · 1155 阅读 · 0 评论 -
bzoj 4519: [Cqoi2016]不同的最小割 分治&最小割
同zjoi的那倒最小割,跑最小割之后按S和T两个集合递归分治。AC代码如下:#include#include#include#include#define N 1005#define M 20005using namespace std;int n,m,tot=1,sta,gol,cnt,fst[N],cur[N],pnt[M],len[M],nxt[M],d[N],h[N原创 2016-04-22 19:55:25 · 1186 阅读 · 0 评论 -
bzoj 4521: [Cqoi2016]手机号码 数位dp
显然可以把答案转化为ans(r+1)-ans(l)(注意我用的开区间),那么考虑ans(n)。 令f[i][j][x][y]表示当前到第i位,和数n的前i为关系为j(为0表示数字和x,y然后转移一下就好了。 不需要注意前导0的问题,因为前导0会被抵消;但如果r=10^12-1,那么+1之后位数不同导致不能抵消则需要特判。AC代码如下:#include#原创 2016-04-22 19:53:11 · 679 阅读 · 0 评论 -
bzoj 3329: Xorequ 数位dp
转化一下式子变为x^2x=3x即x^2x=x+2x,那么显然x满足x和2x的二进制每一位不全为1,也就是x不存在某相邻的两位都是1。 对于第一问,令f[i][j][k]表示前i位,状态为j,最后一位为k的答案。j=0表示前i位 第二问直接矩阵乘法加速即可。AC代码如下:#include#include#include#define mod 100000原创 2016-04-21 19:12:43 · 554 阅读 · 0 评论 -
bzoj 3209: 花神的数论题 数位dp
网上题解都是高大上的组合数学。。然而我等蒟蒻显然只会简单粗暴的数位dp,即: 令f[i][j][k]表示在前i位中,状态为j,有k个1的方案数。其中j=0表示前i为=n。方便起见可以令n++,然后转移就很方便了,枚举一下01即可。AC代码如下:#include#include#include#define mod 10000007#define ll long lo原创 2016-04-21 15:50:44 · 721 阅读 · 0 评论 -
bzoj 4537: [Hnoi2016]最小公倍数 分块
按照a分成M^0.5块,然后每一块按照b排序。这样查询的时候把所有当前块之前的路径按b排序扫一遍,当前块中的路径暴力插入还原。用并查集维护即可。 注意常数QAQ。AC代码如下:#include#include#include#include#include#define N 100005using namespace std;void up(int &x,i原创 2016-04-21 11:24:45 · 1591 阅读 · 0 评论 -
bzoj 2730: [HNOI2012]矿场搭建 dfs
首先求出所有割顶,然后统计一个点双中有多少割顶。如果=1个,那么只需要在点双中除了割顶的地方建一个;否则不需要建。如果只有一个点双就特判一下建两个。AC代码如下:#include#include#include#define N 10005using namespace std;int ri,n,m,cnt,now,all,tot,dfsclk,fst[N],pnt[N],nx原创 2016-04-21 09:02:13 · 685 阅读 · 0 评论 -
bzoj 3745: [Coci2015]Norma 分治&数学
首先分治,然后答案转变为求区间[l,r]中,经过终点mid=(l+r)>>1的子串[x,y]的答案之和。 那么不妨枚举左端点为x,那么显然可以得到区间[x,mid]的最小值u和最大值v。同时维护两个指针j,k,表示最远的j使得[mid+1,j]的最小值没有u小,k维护最大值。那么: 1.对于所有y∈[mid+1,min(j,k)],最小值为u,最大值为v,直接利用高原创 2016-04-20 20:51:59 · 2209 阅读 · 0 评论 -
bzoj3925 地震后的幻想乡 子集Dp
在题目中,假设有恰好k条边使图联通,那么答案就是k/(m+1)。 如果我们令f[i][j]表示子集为i,已经选了j条边时集合不连通的方案数,令g[i][j]表示连通的方案数,那么显然可以得到g[i][j]+f[i][j]=C(m,i中包含的边的条数)。 然后计算f[i],可以利用任意一个i中的点x,然后用包含x的连通块连通的方案数*剩下的边都不在包含x的连通块中的概原创 2016-02-29 16:59:27 · 1757 阅读 · 3 评论 -
bzoj 3148: [Ctsc2013]没头脑和不高兴 数学&线段树
考虑两个纸牌i和j满足ia[j]则对答案有贡献为1;分四种情况讨论: 1.i和j都没被排序,期望贡献1/2;2.i和j都被排序,期望贡献0; 3.只有i被排序,假设被排序的有t个数,那么在期望情况下这t个数是均匀分布的,则a[j]比a[i]小的概率为Pi/(t+1),Pi表示i在t个数中是第几个; 4.同理只有j被排序时期望为(t-Pi+1)/(t+原创 2016-05-25 18:30:01 · 1308 阅读 · 0 评论 -
bzoj 4539: [Hnoi2016]树 主席树&lca
首先那个大树是由若干小树组成的,那么把每一颗小树抽象成一个点,这颗大树就变成节点为M+1的树了。同时定义树上相邻点(x,fa[x])的距离为小树x的根到小树fa[x]的根的距离。那么此时查询两个点x,y流程如下: 1.得到x所在小树u,y所在小树v; 2.若u=v,直接查询;否则令w=lca(u,v)(这里的lca为大树中的lca),然后分lca=u(v)和lca!原创 2016-04-20 20:41:26 · 1080 阅读 · 2 评论 -
bzoj 4538: [Hnoi2016]网络 树链剖分
显然,题目等价于带插入删除的,求不覆盖某一点的所有链的重要度的最大值。 如果求覆盖某一点的所有链的重要度最大值,那么插入时显然可以树链剖分之后在对应的线段树区间中加入这个重要度。因为要删除和求最大值,套一个优先队列即可。 现在要求不覆盖某一点,那么插入的时候就修改所有除了该链之外的所有点。树链剖分之后得到logN个序列区间,那么补集也是logN的,线段树打标记即可。原创 2016-04-20 20:32:54 · 1645 阅读 · 2 评论