自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

无尽

The road ahead will be long. Our climb will be steep.

  • 博客(57)
  • 收藏
  • 关注

原创 UOJ 133 [UR #9]电路手动分析

二分。刚开始做这题的时候,只是脑补出了这种做法,直觉告诉我它应该是对的,但并不会证明。 抱着试试看的心态打了一发,居然A了……题解:http://vfleaking.blog.uoj.ac/blog/694#include<cstdio>#include<cmath>#include<algorithm>using namespace std;int main(){ long l

2016-08-30 22:10:53 424

原创 UOJ 13 [UER #1]跳蚤OS

trie树。在trie上建每一条路径的字符串。节点加一个go指针,如果go不为NULL则说明他是快捷方式,并且go指向它指向的文件夹。然后找一找,连一连,就好了。其实我觉得如果对于每个文件夹,把名字哈希之后视为一个节点,依然可做。但是太懒不想打哈希。#include<cstdio>#include<cstring>using namespace std;char s[500005], t[50

2016-08-30 17:48:38 366

原创 UOJ 12 [UER #1]猜数

数论推式子。由n=a∗b=g∗ln=a*b=g*l,且a,ba,b都是gg的倍数 设a=i∗g,b=j∗ga=i*g,b=j*g 则a+b=(i+j)∗ga+b=(i+j)*g由a∗b=g∗la*b=g*l 得g2∗i∗j=g∗lg^2*i*j=g*l 得j=lg∗ij=\frac{l}{g*i} 则a+b=(i+j)∗g=(i+lg∗i)∗ga+b=(i+j)*g=(i+\frac{l}

2016-08-30 12:16:52 404

原创 UOJ 225 [UR #15]奥林匹克五子棋

构造。除了一些n=1,m=1,k=1……之类的特殊情况外,我们能够保证的最优解肯定是这样的: OXOXO OXOXO XOXOX XOXOX OXOXO那么k>2肯定都是有解。然后判掉特殊情况,把这种图暴力跑出来输出就好了- -,一些细节要注意好UOJ比赛出这种题真的好吗#include<cstdio>#define N 550int map[N][N], n, m, k;void

2016-08-29 22:48:14 639

原创 UOJ 19 [NOIP2014]寻找道路

图的遍历+最短路。第一眼看,好难,不会做。仔细一看,发现只要一次反向边BFS把不合题意的点全部丢掉就可以直接跑最短路了- -顺利打完之后被hack成97分,原因是没有判断起点直接不可取的情况。改后AC。#include<cstdio>#include<queue>#include<cstring>#define N 10005#define M 200005using namespace

2016-08-29 18:12:37 483

原创 BZOJ 2730 [HNOI2012]矿场搭建

割点。对于每一个点,如果去掉它之后,剩下的图依然联通,那么这个点并没有什么卵用就不用考虑了。所以有用的点唯有割点!进行缩强,可以得到一颗树。发现如果在所有叶子结点内部都建一个出口,非叶子结点内部不建,就完成了,并且不存在更优答案。于是可以割点+缩强搞一搞,可以根据与它直接相连的割点数来判断是否是叶子结点。注意如果整张图没有割点依然有答案 2,C2n 2,C^2_n话说这题的题目描述也是够了,没有说明

2016-08-29 12:58:00 431

原创 BZOJ 1853 [Scoi2010]幸运数字

容斥原理。记[l,r]内6的倍数的数的个数为集合S1,8的倍数的为集合S2,66的倍数为集合S3,68的倍数为集合S4......那么答案就是所有这些集合的并集大小。记[l,r]内6的倍数的数的个数为集合S_1, 8的倍数的为集合S_2,66的倍数为集合S_3,68的倍数为集合S_4......那么答案就是所有这些集合的并集大小。可以用容斥定理解决,但需要一些优化。先筛去一些是已有数的倍数的数,如因

2016-08-28 17:56:11 523

原创 BZOJ 4557 [JLoi2016]侦察守卫

树形DP。f[i][j]:以i为根的子树中,至少前j层已经被全部覆盖,做完i这一整棵子树的最小代价。 g[i][j]:i节点向上至少 j层被覆盖,做完i的子树的最小代价。可以根据f直接写出方程,此时唯一需要的就是f[i][0]的初始化,引入g即可解决。DP方程详见代码,注释已打。打完这题交上去之后蜜汁rank3,刷常之后成功rank1^_^!你猜下面的代码是rank几的#include<cstdi

2016-08-27 12:55:13 1844 2

原创 BZOJ 2588 Spoj 10628. Count on a tree

主席树+LCA对于每个点,建一棵该点到根路径上的权值线段树,用主席树搞一搞,对于每个询问(a,b),记c是他们的LCA,d是c父亲,用siz[a]+siz[b]-siz[c]-siz[d]查找即可- -WA到吐血才发现自己lower_bound里面的cnt打成n了。。。QAQ#include<cstdio>#include<cmath>#include<iostream>#include<al

2016-08-25 17:25:16 285

原创 BZOJ 1192 [HNOI2006]鬼谷子的钱袋

二进制。m非常大,就算是O(m)做法也会T,于是考虑一些奇技淫巧。把m表示成二进制,假设是10110,那么只需要1000,100,10,1,(10110-1000-100-10-1)五个钱袋,因为前四个钱袋可以表示1~1111的所有数目,而剩下的钱显然不会超过1111可以之间装起来。于是答案为满足2x>m2^x>m的最小x#include<cstdio>int main(){ int n

2016-08-24 16:20:32 290

原创 BZOJ 1057 [ZJOI2007]棋盘制作

悬线法DP。要求01相邻,方便起见,对于格子(i,j),若(i+j)为偶数,就对它取一个反,题目的要求就可以变成相邻11或00而不是01。第一问最大正方形比较好想,记f[i][j]为以(i,j)为右下角的最大正方形,可由f[i-1][j-1]通过一定的姿势转移过来。第二问用到悬线法(orz好腻害),资料传送:《浅谈用极大化思想解决最大子矩形问题》#include<cstdio>#include<a

2016-08-24 15:46:14 290

原创 BZOJ 1030 [JSOI2007]文本生成器

AC自动机+DP。这题和POJ2778神似。不同的是本题要求包含字串,而那POJ那一题要求不包含。发现只要m一定,总数量是一定的,为26m26^m。于是正难则反- -,用总数量减去不包含任何串的数量。这题节点太多(最坏情况上千个),不能用矩阵做,于是DP。记f[i][j]表示以i节点为起点,长度为j的合法字符串方案数,往儿子DP即可。#include<cstdio>#include<queue>

2016-08-24 13:43:08 292

原创 BZOJ 1968 [Ahoi2005]COMMON 约数研究

分解因数+暴力。暴力对于每个因数计算他在1~n的出现次数。#include<cstdio>int main(){ int n, ans=0; scanf("%d",&n); for(int i = 1; i <= n; i++) ans+=n/i; printf("%d\n",ans); return 0;}

2016-08-23 23:09:24 296

原创 BZOJ 1052 [HAOI2007]覆盖问题

二分+暴力判断。这题的思路很巧啊- -,必须去想最小矩形覆盖后的一些性质。发现用k(1≤k≤3)个正方形,覆盖平面上所有点,要求边与坐标轴平行,那么如果把所有点用一个最小的矩形(边也与坐标轴平行)圈起来,一定有至少一个正方形的一个顶点和矩形的一个顶点重合。证明就是假设没有这种情况,则肯定有矩形的四条边都和三个正方形的某条边重合,因为正方形只有三个,边有四条,不成立,就算是一些特殊情况想一想也可以知道

2016-08-23 18:13:08 459

原创 BZOJ 1189 [HNOI2007]紧急疏散evacuate

二分+最大流。首先可以发现如果t时间可以全部撤离,那么所有大于t的时间都可以撤离,于是考虑二分。又发现其实一个人往一个门走,走的肯定是最短路,于是可以计算出每个人到每个门的最短路。每一个人看作一个流量,由源点向每个人连容量为1的边。将每个门拆点表示每个时间出去的人(对于一个门C可以拆成编号为C+1,C+2,C+3,C+4……都向汇点连容量1的边),最多拆400个。每个人向每个门的【C+最短路距离】点

2016-08-23 12:38:52 353

原创 BZOJ 1143 [CTSC2008]祭祀river

传递闭包+二分图最大独立集。如果i能到达k,k能到达j,那么i能到达j,连边。因为最终答案的点之间肯定不存在边,所以跑二分图最大匹配,计算最大独立集即可。顺便学一些二分图的知识,本题考察下文第六点以下资料来自这里,我对它进行了一些整理修改和补充。注意,以下的图中不应存在一个点,与图中的其他点都没有连边。常用定理: 最小点覆盖=最大匹配。 最小边覆盖=最大独立集=图中点的个数-最大匹配。 最小路

2016-08-22 12:43:52 705

原创 BZOJ 1054 [HAOI2008]移动玩具

BFS爆搜+状压判重很少见到水题啦。这题n=4那肯定状压吧,分析一下时间复杂度。 最多状态217−1=1310712^17-1=131071 每一次搜索,极端情况42∗4=644^2*4=64 乘起来妥妥的, 自信满满写完就交上去。结果WA了一下,手残没办法#include<cstdio>#include<queue>using namespace std;int in(){

2016-08-21 16:59:43 1536

原创 POJ 2104 K-th Number

主席树。主席树大小开太小RE了- -关于主席树大小,自己的估(口)计(胡):顺便提一下,一般对于一棵n个元素的线段树,因为线段树符合二叉树的性质,所以大小约为2∗n−12*n-1(别开这么小,一般我会开到5∗n5*n左右)对于主席树,在建树的过程中,设正在建第i棵线段树。对于i的每一层(除去第一层和最后一层),都会有两个节点是新的(不行就画图理解),一个指向i-1的对应节点,另一个自己用。所以一棵新

2016-08-21 15:40:02 310

原创 BZOJ 1857 [Scoi2010]传送带

三分。三分AB上的点,再三分CD上的点即可(目测但是我太弱不会证,以后会证了再补证明过程)。要注意线段退化成点的情况,所以最好不要一边三分一边统计答案(在这里被坑QAQ)#include<cmath>#include<cstdio>#include<algorithm>using namespace std;const double EPS=1e-3;double ax,ay,bx,by,

2016-08-20 17:14:53 327

原创 BZOJ 1588 [HNOI2002]营业额统计

splay。模仿别人的代码打的,加了一些注释我很好奇排名第一的0s用了什么神奇的数结- -#include<cstdio>#include<cmath>#include<algorithm>#define N 200005using namespace std;const int INF = 1<<29;struct SplayTree{ int son[N][2], fa[N

2016-08-20 15:52:30 323

原创 POJ 2187 Beauty Contest

旋转卡壳。模板题,就不详细说做法了,找了一些材料,这篇写的很不错:http://www.cnblogs.com/xdruid/archive/2012/07/01/2572303.html总的复杂度,凸包O(nlogn),旋转卡壳O(n),总O(nlogn)还翻了一些别人的代码,发现他们在做旋转卡壳,最大三角形已经定下时,为了处理两边平行的情况,取了两次距离,分别是(ch[p],ch[q])和(ch

2016-08-19 18:42:36 349

原创 POJ 3335 Rotating Scoreboard

半平面交。判断多边形核是否存在,用半平面交。半平面交资料传送门:算法合集之《半平面交的新算法及其实用价值》提交的时候语言选错,蜜汁CE一次- -#include<cstdio>#include<cmath>#include<algorithm>#define N 105using namespace std;struct point{ double x, y;}p[N];st

2016-08-18 16:38:07 320

原创 POJ 2318 TOYS

二分。添加一个编号为0的直线,为格子的左边框。二分,叉积判断离点最近的左边第一条直线编号即可。早上脑子有点不清楚,犯了一些奇怪的错误,狂WA不止。。。#include<cstdio>#include<cstring>double x1[5005], x2[5005], X1, Y1, X2, Y2;int cnt[5005], n, m;bool cross(double x, double

2016-08-18 13:07:58 235

原创 POJ 1379 Run Away

模拟退火。随机出30个点,模拟退火,跳的步长随温度降低以保证稳定,每次挑30个点来跳,接下来就看RP了不知道有没有能证明正确性的正解,感觉模拟退火挺不靠谱的- -自己人品比较差,降温时间弄得比较长,果然AC了#include<ctime>#include<cmath>#include<cstdio>#include<cstdlib>#include<algorithm>#define NU

2016-08-17 17:30:30 360

原创 BZOJ 4007 [JLOI2015]战争调度

树形DP+状压+搜索。刚开始想了一些奇怪的树形DP,都没法做,后来发现是自己对题目理解有误。如果枚举所有点的决策,那是O(22n)O(2^{2^n})。发现对于一个最底层节点,他的贡献只和一条链有关,于是可以考虑从这里下手。对于一个点i,如果他的所有上司的状态已经确定,那么他的左右子树的决策将互不影响,于是可以用DFS枚举一整条链的状态并进行DP。记f[i][j]表示i结点为根的子树中去j个参加战争

2016-08-17 15:57:21 683

原创 BZOJ 1066 [SCOI2007]蜥蜴

最大流。要求逃出去的数量最多,各种状态又十分复杂,石柱还有次数限制,直接就会想到网络流的最大流。怎么体现次数限制(石柱高度)?拆点。对于每一个点,拆成入点和出点,连边,容量为高度。建源点和汇点。源点连所有蜥蜴,容量INF。汇点连所有可以出去的地方,容量也是INF。各个能跳到的点之间也要连。跑最大流。还有,注意这题的距离不是曼哈顿距离,是平面距离。连边的时候手残了,强行WA一次- - 大概没救了吧#i

2016-08-16 22:45:30 347

原创 HDU 1814 Peaceful Commission

2-SAT。假设a,a’一组,b,b’一组,那么如果a和b矛盾,选a就肯定要选b’,于是连一条边a->b’,同理有连边b->a’然后暴力找答案,dfs(i)的返回值表示选i是否引起矛盾因为这些对应关系是组与组之间的,所以假设当前选i不矛盾,那么接下来的其他没决策过的点的决策与i无关,即i决策不会改变(否则考虑i的时候就会被考虑)数组大小很迷 开大点总是好的#include<cstdio>#incl

2016-08-15 16:50:32 306

原创 BZOJ 3876 [Ahoi2014]支线剧情

有下界的费用流。题解传送门(orz跪烂。。。):http://blog.csdn.net/popoqqq/article/details/43024221不太好理解,需要细心揣摩=_=#include<cstdio>#include<queue>#include<cstring>#include<algorithm>#define N 305#define M 5005using nam

2016-08-15 15:29:53 321

原创 BZOJ 2756 [SCOI2012]奇怪的游戏

网络流。确实是网络流题目做太少,完全没往这方面去想。。。对棋盘进行黑白相间染色,如果记s0表示黑格子数字和,s1表示白格子数字和,t1表示黑格子数量,t2表示白格子数量,操作之后数字全都是x,那么因为黑白格子的操作次数肯定一样,有 x∗t1−s1=x∗t0−s0x*t1-s1=x*t0-s0 可以得到 x=s1−s0t1−t0x=\frac{s1-s0}{t1-t0}如果t1≠t2t1\ne

2016-08-14 17:47:22 359

原创 BZOJ 1001 [BeiJing2006]狼抓兔子

平面图最小割转对偶图最短路。第一眼看到这题,显然是最小割嘛。。。根据最大流最小割定理,跑一遍最大流即可,但复杂度O(n2∗m)O(n^2*m),显然要T啊。然后我就学习了平面图最小割转对偶图最短路的想法,看完就会做了,资料传送门:两极相通——浅析最大最小定理在信息学竞赛中的应用这里顺便摘抄一些平面图的重要定义和性质,详细内容看资料: ·平面图:若图G可画在平面上,使得任意两条边都不会在非端点处相

2016-08-14 15:01:33 591 2

原创 BZOJ 4006 [JLOI2015]管道连接

斯坦纳树DP。首先记f[i][sta]f[i][sta]表示经过节点ii,节点状态为stasta的最小花费,进行斯坦纳树DP再记g[s]g[s]表示颜色状态为ss的最小花费,注意是颜色状态,每一位表示一个颜色集合,那么g[s]g[s]可以从f[i][sta]f[i][sta]在O(p∗2p)O(p*2^p)的时间转移过来(为什么我的复杂度是这个可以研究一下代码- -)显然直接用g[2p−1]g[2^

2016-08-13 17:11:31 437

原创 BZOJ 2595 [Wc2008]游览计划

斯坦纳树DP。 斯坦纳树问题是组合优化问题,与最小生成树相似,是最短网络的一种。最小生成树是在给定的点集和边中寻求最短网络使所有点连通。而最小斯坦纳树允许在给定点外增加额外的点,使生成的最短网络开销最小 ——百度百科我是从这里学习的orz: http://www.cnblogs.com/lazycal/archive/2013/08/31/bzoj-2595.html上文中提到斯坦纳树D

2016-08-12 16:58:30 433

原创 BZOJ 3677 & UOJ 105 [APIO2014]Beads and wires

换根DP做这题真是艰辛啊- -如果把刚开始的第一个珠子定为根,那么Insert操作只会使得蓝线上的三个珠子呈“爷爷,父亲,自己”的形式(也就是由上向下的三代),于是可以DP,记f[i][0]表示i不属于蓝线中点、f[i][1]表示i属于蓝线中点的i子树的最大答案。于是可以对于每个点当作根进行一次DP,DP的复杂度O(n),那么总复杂度O(n^2)是不科学的。对换根过程进行优化!维护一个g[i][1/

2016-08-11 17:43:48 626

原创 HDU 1693 Eat the Trees

枚举轮廓线,插头DP只要上下左右边界都没有插头,且每一个可行方格都有两个插头,那内部就一定是联通的。记f[i][j][k]f[i][j][k]表示做到第i行,第j列,轮廓线状态为k的方案数要开long long!#include<cstdio>#define MAX 15long long f[MAX][MAX][1<<MAX];int map[MAX][MAX];int main(){

2016-08-10 15:43:41 374

原创 BZOJ 1095 [ZJOI2007]Hide 捉迷藏

点分治模板题练习借(抄)鉴(袭)了这一篇:http://blog.csdn.net/popoqqq/article/details/44461423思想是通过重心与子重心连边,形成logn高度的树,所以更新节点只需要logn的复杂度。用堆维护。代码有点长,打了一点注释以后方便理解- -#include<queue>#include<cstdio>#include<algorithm>#defi

2016-08-09 17:26:28 292

原创 HDU 3068 最长回文

学了一发manachar,做个模板题 manachar的思想就是利用已有回文串辅助目前回文串我是不是没救了,把n放在char里面还调了半天#include<cstdio>#include<cstring>#include<algorithm>using namespace std; char t[110010], s[110010*2];int n, p[110010*2];int

2016-08-09 16:36:28 256

原创 UOJ 104 [APIO2014]Split the sequence

首先发现如果切同样的地方,先切后切都一样,即操作顺序没影响,这样满足无后效性就可以DP了记f[i][j]f[i][j]表示前i的序列,切j次最大答案于是得到裸方程:f[i][j]=max(f[k][j−1]+sum[k]∗(sum[i]−sum[k]))(k<i)f[i][j]=max(f[k][j−1]+sum[k]*(sum[i]−sum[k]))(k<i) 复杂度O(n2k)O(n^2k)太大

2016-08-08 16:08:44 314

原创 POJ 1061 青蛙的约会

假设答案是跳kk次,某一只多跳dd圈 列出方程: (x+k∗m)−(y+k∗n)=d∗L(x+k*m)-(y+k*n)=d*L 整理得 k(m−n)−d∗L=y−xk(m-n)-d*L=y-x 未知数只有k,dk,d,用扩展欧几里得搞定#include<cstdio>#include<iostream>using namespace std;long long gcd;void e

2016-08-07 16:21:22 192

原创 POJ 2449 Remmarguts' Date

A*模板题#include<cstdio>#include<queue>#include<cstring>#define MAXN 1005#define MAXM 100005using namespace std;struct edge{int next,to,val;}e[MAXM<<1];bool vis[MAXN];int cnt_edge=0, cnt[MAXN], la

2016-08-07 16:15:25 226

原创 BZOJ 1912 [Apio2010]patrol 巡逻

网络上大部分都是用最长链做的,但是我(因为太弱了)并不能理解这样的正确性。。。所以就打了个树形DP。k=1时,答案=2*(n-1)-最长链长度+1 k=2时,发现如果两条链相交,相交的部分并不能减一,那怎么DP?发现一种情况,只要把相交的部分丢掉,剩下的两半也是两个链——也就是说一定会有两个不交的链等效于任意两个相交的链。那问题就变成求不相交两条链的最大长度。记f[i][j][k]表示i的子树中,

2016-08-06 16:47:50 307

空空如也

空空如也

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

TA关注的人

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