自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(53)
  • 收藏
  • 关注

原创 bzoj1076 奖励关【期望+状压dp】

解题思路:若正着推,则一个状态会转移到两个状态,但我们不知道那一种更优,所以倒着推从两个状态转移到一个状态。设f[i][j]f[i][j]表示从第i轮j这个状态开始可以得到的最高分,那么初始状态为f[k+1][j]=0f[k+1][j]=0,我们要求的答案为f[1][0]f[1][0],转移方程如下:如果当前可以去第l个,则: f[i][s]+=max(f[i+1][s],f[i+1][s|(1<

2017-12-31 20:46:37 238

原创 bzoj2118 墨墨的等式【最短路+背包问题】

解题思路:相当于无限背包求可行方案数。取任意一个a[i],设为p;那么考虑令d[i]表示当物体的总重%p=i时,物体最少的重量。设d[i]=t,那么显然对于所有的x,如果x%p=i且x>=t,都可以用总重最少的那个方案再加上若干个p得到。同时,考虑加入一个物体u,那么显然有d[(i+u)%p]可以由d[i]+u得到,这相当于从i向(i+u)%p连一条长度为u的边,那么d[i]求最小值不就是求最短路吗

2017-12-30 17:15:41 563

原创 hdu4942 Game on S♂play【线段树 or LCT】

题目大意:给一棵二叉树,每个点有权值,定义每个点的size为其子树的权值和,每个点的有趣值为其子树内size值之积。要求支持左旋右旋操作(就像splay上一样),或是询问某个点的有趣值。解题思路:1.先说一下LCT的做法: 注意到每次旋转只会改变两个点(x,y)的size值,然后改变其父亲的有趣值(除以原来y的有趣值,乘以x新的有趣值),所以可以用LCT模拟旋转操作及维护每个点的

2017-12-30 13:12:13 303

原创 codeforces618f Double Knapsack【抽屉原理】

解题思路:真是道非常妙的构造。不妨设总和小的是集合A。我们把集合看成数组,对两个数组各求前缀和(包括0号位置);那么对于每个sumA[i]sumA[i],必然存在一个sumB[j]sumB[j],使得0≤sumA[i]−sumB[i]<n0\le sumA[i]-sumB[i]<n,设为d[i]d[i],可以发现jj随ii单调增。注意到最后d[i]d[i]有n+1n+1个(d[0] d[n])(d[

2017-12-28 21:54:31 411

原创 bzoj3052 糖果公园【树上带修改莫队】

解题思路:传说中的b站毒瘤题,一交就引起民粪。 本来只是想做树上莫队模板bzoj3757苹果树的,结果题目下架了,只能上这道了…… 如果不会树分块的可以先去做做bzoj1086,题解在这里 不会带修改莫队的可以先去做做bzoj2120,题解在这里这里主要说一下正常无修改的树上莫队的做法。先树分块,将每个询问按左端点所在块为第一关键字,右端点dfs序为第二关键字排序,这样就保证了指针挪动复杂度(

2017-12-28 19:39:14 346

原创 bzoj1086 王室联邦【树分块】

解题思路:这道题是树分块模板题,要做树上莫队的可以打打基础。 树分块可以保证每一块内点的距离不超过2B。 我们开一个栈,遍历一个节点,若该节点的几棵子树的大小>=B,那么就把他们分到一块,省会即为当前节点。 这样做会剩下不到B个节点,这时候就利用栈传到上一层节点就可以 最后会剩下不到B个节点,因为我们原来的块都是一定不超过2B的,于是把这B个节点放到最后一个块就可以。#include<bit

2017-12-28 16:42:25 302

原创 bzoj1061、3265 志愿者招募【单纯形法】

解题思路:如果不清楚单纯形法的可以看这里: http://blog.sina.com.cn/s/blog_4b1046f80101m9ou.html 题目很像标准单纯形形式但求的是最大值,且所有限制条件都是大于等于。 根据对偶原理,我们只需要把单纯形法整个ABC矩阵转置再求单纯形即是答案。这是1061的代码,3265的改一下输入即可。#include<bits/stdc++.h>using

2017-12-28 11:59:08 308

原创 TC srm518 Nim【动态规划+FWT】

题目大意:求符合以下条件的序列个数: 1:长度为K 2:每个元素大小不超过L 3:每个数都是质数 4:所有数异或和为0 K≤109,L≤50000K\le10^9,L\le 50000 答案对109+710^9+7取模;解题思路:我们设f[i][j]表示序列长度为i,异或和为j的方案数,那么 f[i][x ^ y]=f[i-1][x] * f[1][y]。可以发现这个式子是符合FWT

2017-12-27 15:20:00 583

转载 快速沃尔什变换(FWT)讲解+模板

能看到这篇博客的人,一定知道FWT是干什么的。(什么?你不知道?) 没事,这里有picks讲FWT的一篇博客。先点进去看一看。如果你看懂了,那么恭喜你。如果你跟我一样看不懂,那么请继续往下看。这里的A和B都是什么呢?其实它们是一个多维的向量(如果你不知道向量是什么,就把它当成数组),下标从0开始。 其中,A=<a0,a1,...,a2k−1>B=<b0,b1,...,b2k−1>C=A@B

2017-12-27 14:07:29 754

原创 bzoj4374 Little Elephant and Boxes【动态规划+折半搜索】

解题思路:开始以为直接求出期望得到的钱和钻石数,再背包dp一波就行了,但看了答案不是整数就知道不行了。还是要根据期望的定义,列出所有方案求解才行。但直接求出所有方案是不现实的,看了n=30,应该是折半搜索。 所以我们先固定一维,用f[i][j][k]表示前i个物品取j个,花了k个钻石所消耗的最小钱数,这个很容易dp求出,可以见代码。再折半搜索,分别取第1~n/2,第n/2+1~n个盒子,把两边的方

2017-12-27 09:40:48 424

原创 bzoj4006 管道连接【斯坦纳树+子集dp】

解题思路:题目要求的即为最小斯坦纳森林。 我们可以枚举颜色种类的一个子集S,把颜色属于S的关键点提出来求一次最小斯坦纳树,设最小值为g[S],那么最后子集dp一波:g[S]=min(g[S],g[i]+g[S^i])(i∈\inS)。求最小斯坦纳树的方法源于状压dp: 设f[i][s]表示以i为根的子树中关键点联通状态为s的边权和最小值,那么转移方程有两种,分别为: f[i][s]=min(f

2017-12-26 20:50:38 317

原创 poj2420 A Star not a Tree?【模拟退火】

题目大意:给定n个点,求一点到所有点距离的最小值。解题思路:模拟退火真是神, 就是先设置一个起始点较大的步长step(初始温度),每次随机向一个方向走step,若该点更优,则更新答案,并转移起始点位置。操作完后减小等比例减小step重复上述操作若干次(尽量多),则可得到近似最优解。#include<cstdio>#include<algorithm>#include<cmath>using

2017-12-25 20:08:52 339

原创 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 345

原创 SGU209 Areas 【平面图】

题目大意:给出n条直线,问直线围成的所有闭合区域的个数及面积,按升序输出。(n<=80)解题思路:①我们需要求出两两直线的交点; ②再对每条直线上的交点排序,来求出所有分割成的线段并连边(正反两条边); ③对于连向一个点的几条线段,对它们进行极角排序进行处理,这样就可以对于每条边记录走过去后下一条该走那条边了,我们脑补一下应该可以直到是它排序后相邻边的反向边。 ④找循环,利用叉积求面积。代

2017-12-25 16:58:12 531

原创 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 232

原创 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 421

原创 poj1912 A highway and the seven dwarfs【凸包+二分】

题目大意:给出n个点,m条直线,对于每条直线,问所有点是否都在该直线同一侧。解题思路:即是问n个点的凸包是否在直线同一侧。 若直线与凸包有交点,那直线与凸包的两个切点一定在直线两侧。 所以我们可以将凸包上每条直线的倾斜角求出,对于每条直线二分找到两个切点,判断两个切点是否在直线两侧即可。具体细节见代码注释。#include<iostream>#include<cstdio>#include<

2017-12-22 14:43:05 446

原创 poj3845 Fractal 【坐标变换】

题目大意:给一条折线,每一次操作把这条折线的所有线段变换成跟这条折线的相同形状,重复d次。问此时从头到尾走全长的f(0≤f≤1),将停在哪个点上。解题思路:假设做了一次分形后得到折线长度是原来的kk倍,则深度为d的分形(操作了d-1次)的长度是原来的kd−1k^{d-1}倍。若当前线段增长后已经超出了所剩余的长度,就相当于确定变换后的直线在当前线段上,那么递归kd−2k^{d-2},确定下一次变换的

2017-12-22 08:45:55 291

原创 poj2954 Triangle【Pick定理】

题目大意:给你一个由3个整点构成的三角形,要你求出该三角形内部的整点个数.解题思路:用了一个非常神奇的小定理:Pick定理。 由Pick定理,一个多边形如果每个顶点都由整点构成,该多边形的面积为S,该多边形边上的整点为L,内部的整点为N,则有:2S=2N+L-2。 那么我们要求的N即为(2S+2-L)/2。S可由向量叉积得到,关键是求三角形各边上有多少个整点。 假设有一条由两个整点构成的线段,

2017-12-21 08:14:19 274

原创 hdu1007 Quoit Design 【计算几何+分治】

题目大意:给出平面上n个点,求最近两点距离的一半。解题思路:很经典的平面分治题。假设我们把所有点按 xx 坐标平均分成了左右两个部分,设平分直线为x=x0x=x_0,那么最近点对(p,q)(p,q)的距离就是下面二者的最小值: (1)p,qp,q同属于左半边或右半边时的最近点对距离。 (2)p,qp,q属于不同区域时的最近点对距离。 对于情况(1),是与原题完全相同的子问题,可以递归处理。设左

2017-12-20 21:36:21 259

原创 bzoj5020 在美妙的数学王国中畅游【LCT+泰勒展开】

解题思路:题目后貌似还有一段提示: 考试的时候完全看不懂它给的泰勒展开式,只打了可以暴力走和x=1x=1的部分,就是LCT维护路径和。考试后看了题解,原来它的意思就是取x0=0x_0=0,f(x)f(x)可以化成多项式形式,每项系数就是fi(0)i!。n=11\frac{f^i(0)}{i!}。n=11精度就够了,然后Splay维护每一项系数的和,询问时每项乘以xix^i就行了。对导数不熟悉的

2017-12-20 19:17:31 440

原创 bzoj1942 货币兑换【动态规划+CDQ分治】

解题思路:转自 www.cnblogs.com/zig-zag/archive/2013/04/24/3039418.html 稍稍加上个人见解(括号中)。经典的1D1D动态规划题目,标准做法是平衡树维护凸壳,但实际上还有更简洁的分治法。首先分析一下题目,对于任意一天,一定是贪心地买入所有货币或者卖出所有货币是最优的,因为有便宜我们就要尽量去占,有亏损就一点也不去碰。于是我们得到方程:f[i]=m

2017-12-19 21:24:37 449

原创 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 201

原创 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 233

原创 bzoj2648 SJY摆棋子【KD-tree模板】

解题思路:KD-tree是一种维护多维空间中点的数据结构。 讲解详见http://blog.csdn.net/jiangshibiao/article/details/34144829。 本题中的操作都有涉及。#include&lt;bits/stdc++.h&gt;#define ll long longusing namespace std;int getint(){...

2017-12-19 14:52:35 274

原创 bzoj3295 动态逆序对【树状数组套权值线段树】

解题思路:每次减少的逆序数即为在x前面比x大的数的个数加上在x后面比x小的数的个数,用树状数组套权值线段树维护即可。#include#include#include#include#include#define inf 0x7fffffff#define ll long long#define N 100005#define M 5000005using namesp

2017-12-19 11:05:12 322

原创 codevs 1743 反转卡片【Splay区间翻转】

解题思路:就是Splay的区间翻转操作。 加入两个虚拟节点0,n+1。 每次操作把0旋到root,k+1旋到son[root][1],那么son[son[root][1][0]这棵子树即是区间[1,k]了,打上翻转标记即可。#include<bits/stdc++.h>#define ll long longusing namespace std;int getint(){ int

2017-12-19 10:04:43 338

原创 bzoj3196 二逼平衡树【线段树套Splay】

解题思路:其实线段树套线段树就可做,所以叫二逼平衡树。 不过还没写过线段树套Splay,所以练一下也是好的。 首先我们把平衡树中相同的值放在一个节点里,记个cnt,方便操作。操作1:只用去线段树上logn颗平衡树上找比k小的个数即可,最后记得加一。操作2:二分答案,再用操作一去检验,这就是线段树套Splay二逼之处,要O(log3n)O(log^3n) ,要是线段树套线段树就不用二

2017-12-19 08:29:34 276

原创 bzoj1455 罗马游戏【并查集+可并堆】

解题思路:用并查集维护左偏树(可并堆)中每个节点的根节点即可。#include<bits/stdc++.h>#define ll long longusing namespace std;int getint(){ int i=0,f=1;char c; for(c=getchar();(c<'0'||c>'9')&&c!='-';c=getchar()); if(c=

2017-12-18 18:14:08 216

原创 bzoj1699 排队【稀疏表】

解题思路:稀疏表模板题。 注意数组要开大点,倍增预处理时容易越界。#include<bits/stdc++.h>#define ll long longusing namespace std;int getint(){ int i=0,f=1;char c; for(c=getchar();(c<'0'||c>'9')&&c!='-';c=getchar()); if

2017-12-18 16:46:45 227

原创 bzoj3039 玉蟾宫【单调栈】

解题思路:枚举每一行作为矩形的底,h[j]表示第j列向上延伸的最多的1,再用两个单调栈维护每列向左和向右第一个h值比它小的列l[j],r[j],那么矩形面积即是h[j]*(r[j]-l[j]-1)。可以证明最优解一定会被统计。 时间复杂度为O(n2)O(n^2)#include<bits/stdc++.h>#define ll long longusing namespace std;int

2017-12-18 16:15:58 260

原创 bzoj3678 简单题【bitset】

解题思路:初学bitset,不明觉厉。bitset相当于一个布尔数组,可以快速左移右移。 注意到一个和只有出现奇数次才有用,所以我们用f[i]表示和为i的集合个数为奇数还是偶数。用bitset维护f数组,那么f<#include<cstdio>#include<iostream>#include<cstring>#include<string>#include<algorithm>#in

2017-12-18 15:24:16 296

原创 bzoj3103or3350 Palindromic Equivalence/相似回文串【manacher+并查集+完美消除序列】

解题思路:我们可以先用manacher和并查集处理出哪些位置必须要填相同的字母,再把每个并查集看做一个点,再向和该并查集必须填不同字母的并查集连边,可以证明这样构造出的是一个弦图,详见:http://foreseeable97.logdown.com/posts/194507-herbicidalontak2010palindromic-equivalence然后就成了弦图染色问题了,求一边完美消除

2017-12-18 15:00:29 446

原创 bzoj2002 弹飞绵羊【分块】

解题思路:我们可以在分块后维护每个位置弹出该块所需步数和弹到的位置,这样查询和修改都是O(n√)O(\sqrt n)的了。#include<cstdio>#include<iostream>#include<cstring>#include<string>#include<algorithm>#include<cmath>#include<ctime>#include<vector>

2017-12-18 09:29:50 373

原创 bzoj1006 神奇的国度【完美消除序列】

解题思路:题目要求的就是用最少的颜色,使相连两点颜色不相同。有结论如下: 最小染色数=最大团大小 Proof. 不可能比这个更小,只需证这个是可行的。考虑按完美消除序列倒序把所有点加进来,每个点只需和所有当前相邻的点不同颜色即可,而当前所有相邻的点最大是最大团大小。所以只需用最大势算法求出完美消除序列,倒着加点统计即可。#include<cstdio>#include<iostream>

2017-12-17 22:05:20 318

原创 poj2411 Mondriaan's Dream【插头dp】

题目大意:用1∗21*2的矩形铺满n∗mn*m的大矩形,问有多少种方案。1≤n,m≤111\le n,m\le 11解题思路:这道题所说可以用状压dp来做,但用轮廓线dp可以做到更优秀的复杂度。首先这道题只用考虑每段轮廓线上有无插头即可,按格转移,所以时间复杂度为O(n22n+1)O(n^22^{n+1})每个有以下四种情况: 分类讨论即可。轮廓线dp建议用滚动数组,这样换行的时候好转移。#i

2017-12-17 13:58:40 338

原创 poj1286 Necklace of Beads【polya定理】

题目大意:用红蓝绿三色共n个珠子串成项链,求旋转和翻转后仍不一样的串法种数?解题思路:首先说一下polya定理:设G是n个对象的一个置换群设G是n个对象的一个置换群{p1,p2……,pkp_1,p_2……,p_k}(即所有的变换方式),用m种颜色对这n个对象染色,则不同的方案数为(即所有的变换方式),用m种颜色对这n个对象染色,则不同的方案数为l=1|G|(mc(p1)+mc(p2)+……+mc(p

2017-12-15 08:25:57 368

原创 spoj 8222 substrings 【后缀自动机】

解题思路:建立sam,那么一个节点i所对应的字符串出现次数即为其right集合大小,而其包含字符串长度为(min[i],max[i]),且随着parent链代表字符串长度减小,其出现次数单赠。所以先令f[max[i]]=right[i],最后用f[i]更新f[i-1]即可。#include<iostream>#include<cstdio>#include<cstring>#include<s

2017-12-14 09:53:20 294

原创 hdu6096 String【AC自动机】

题目大意:给出一些字符串,给出前缀后缀模式询问,问有多少字符串符合该模式解题思路:之前一直没头绪,看了看dalao的解法,真是奥妙重重。对于每个询问,我们将它变成 后缀+分隔符+前缀 的形式,如询问ab cd变为cd{ab。 对于每个原串,我们也变为 原串+分隔符+原串的形式,如abecd变为abecd{abecd。 这时我们若用询问串匹配原串就刚好只能匹配到题目所要求的一段了。 所以处理后直

2017-12-13 10:37:34 250

原创 51nod 1244 莫比乌斯函数之和【杜教筛】

解题思路:像这种求积性函数前缀和的题,可以用杜教筛来做,时间复杂度为O(n23)O(n^{\frac{2}{3}}),是一种基于分治和记忆化搜索的方法。 具体可见:http://blog.csdn.net/skywalkert/article/details/50500009 注意一定要把求得的答案记忆化才能保证复杂度,本人TLE了半天不知为何。#include<cstdio>#include

2017-12-12 11:03:45 298

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除