自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

ACMer_quack&cheer

when the hobby becomes your burden, you start to hate and desert it.

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

原创 计算几何学习笔记之基本运算

模板在网上很容易找到,这里我就讲一讲我对这些代码(lrj白皮书上的)的理解,包括添加证明,插图等。定义向量及向量的四则运算,其中A,B都是一个向量。(貌似是高中数学课本上的内容)

2016-03-31 22:16:04 954

原创 POJ2688 Cleaning Robot(BFS+TSP问题)

机器人需要打扫在地图上不同位置的垃圾,地图上有的位置是墙无法经过。问打扫完所有垃圾的最少步数(不用回到起点)。 先用BFS求出垃圾们和起点两两之间的距离,再用一个DFS搜出最优解(类似于状压DP)#include<cstdio>#include<cstring>#include<queue>using namespace std;struct Node{ int x,y,stp;

2016-03-28 15:00:25 527

原创 POJ2308 Dearboy's Puzzle(DFS+BFS)

连连看的小游戏(只有4种牌),判断是否能全部消除。思路非常简单但是要注意减枝。 外层的DFS指定一张牌来想办法消除它,内层的BFS以指定的这张牌为起点,向四周扩展找到能和它配对的牌。然后每一对能消除的牌都考虑一遍。 1.连的线不能越界到格子外边; 2.有的牌只有奇数个,无解 3.出现了 A B 这种情况而且,AB分别只有两张,那么肯定无解;不加这个减枝会超时。 。。。。B A#includ

2016-03-28 14:54:31 772

原创 POJ3322 Bloxorz I(BFS)

很有意思的一个益智小游戏。题目我就不描述了,玩过的人都知道规则。 题目传送门:http://poj.org/problem?id=3322 空格子不能走(可以看成墙),标号为E表示脆弱的格子,箱子在上面不能竖放,只能横放。终点只能竖着放进去。 很明显是搜索题,状态表示也不用太费力去想。需要保存箱子一个角的位置,和摆放的状态f;如果箱子竖放,则位置就是它本身的位置,f=0;如果左右横放,则保存左

2016-03-28 14:43:26 624

原创 POJ1324 Holedox Moving(BFS)

有一条蛇蜿蜒在洞穴里面,出口为(1,1),问(蛇头)走出洞口的最小步数。走的过程不能碰到自己的身体也不能碰到石头。蛇头每移动一格,身体也要相应的移动一格。(注意:貌似当前蛇头不能移动到当前蛇尾的位置) 由于蛇身占得位置太大,保存起来不方便,于是只用保存蛇头的位置,另外开一个二进制的串来保存其他身体块相对于上一块身体的位置,二进制的串每两位表示一个位置(也相当于4进制,每一个数表示一个方向)#inc

2016-03-28 14:30:19 341

原创 POJ2044 Weather Forecast(DFS)

假设你可以控制天气,你拥有一片2*2大小的云,在云覆盖的土地上无论何时都在下雨,否则一直是晴天。在一个国家的土地上你需要移动这篇云,第一天时云在(2,2)(2,3)(3,2)(3,3)上。现在有n(n≤365)n(n \leq 365)天,每天每块土地有些活动,1表示这块土地在这天有节日,不能下雨。除此之外,不能有一块土地连续超过6天不下雨。 若只把云看做左上角的点,那么一共只有9种位置状态。

2016-03-28 13:37:35 945

原创 POJ3635 Full Tank?(最短路+DP)

n个城市之间有m条双向路。每条路要耗费一定的油量。每个城市的油价是固定并且已经给出的。有q个询问,表示从城市s走到e,油箱的容量为c,求最便宜的方案。 dp(i,j)表示走到城市i,剩余油量为j的最小花费。然后用优先队列更新,优先更新花费小的状态。走到一座城市,要么加油,要么走向下一个城市(在油量充足的情况下)。#include<cstdio>#include<cstring>#include

2016-03-27 22:54:02 3278

原创 POJ1190 生日蛋糕(DFS)

N久以前写的一个迭代加深和神奇剪枝的搜索,如今我竟然写不出来,悲哀啊! 出答案很简单,但是要AC要加各种神奇的优化,我都写在代码的注释中了啦。#include<cstdio>#include<cmath>using namespace std;int best = 0xffffff,n,m,minv[25];void dfs(int i,int ri,int hi,int si,int v

2016-03-27 22:38:39 1115

原创 POJ1475 Pushing Boxes(BFS+BFS)

题目就是推箱子的小游戏,叫你输出最优方案。推箱子用大写字母,人走用小写。 自己的想法:BFS乱搜。题解:双重BFS。涨姿势了,第一次见到。 外层BFS表示箱子要被推到的方向,内层BFS判断人是否能走到需要的那个位置;比如要往左推箱子,则要判断人是否能走到箱子的右边。 外层BFS还要开个数组判断是否在这个方向上经过这个点,不过我没理解透,估计再叫我写一遍我也写不出来。#include<cstdi

2016-03-27 22:22:21 375

原创 HDU4012 Paint on a Wall(BFS)

一开始确实没看出来什么玄机。然后搜了搜题解。由于最多只有16个格子,用二进制的状态压缩来表示,状态为1的位表示该位已经涂上了正确的颜色。 从第一行的i号节点开始向两边涂色的时候注意:如果刷到的这个节点已经是它本身的正确的颜色,那么我们就不刷了。否则这样又刷回了错误的颜色,就不是最优解了。然后把每扩展一个格子的状态全部压入队列,也就是代码中的tmp。 此外,同时刷两行颜色的时候只用考虑第一行就行了

2016-03-27 22:05:12 349

原创 HDU5634 Rikka with Phi(线段树)

三个操作:1.把数列的A[i](i∈[l,r])A[i] (i \in [l,r])变为φ(A[i])\varphi (A[i]) 2.把数列的A[i](i∈[l,r])A[i] (i \in [l,r])变为xx 3.求∑ri=lA[i](i∈[l,r])\sum_{i = l}^{r} A[i](i \in [l,r]) 正解是平衡树,线段树也可以。首先把欧拉函数的表打出来。#includ

2016-03-27 21:51:50 301

原创 HDU2821 Pusher(DFS)

题目理解了半天- - 在r*c的网格上面放置有一些箱子,你可以选择任意一块个空地作为你的起点。有上下左右四种移动的操作。一旦选择了一个方向,你会不停地朝这个方向走下去直到的撞到了箱子。被你撞到的箱子会向你行走的方向移动一格,而且数量会减少一个(如果你是紧贴着箱子并且朝它行走,这样的操作是无效的)。如果箱子移动到的位置本来就有箱子,那么他们会合并为新的一堆。 请你寻找任意一个放置人位置和移动的方案

2016-03-27 21:34:26 335

原创 HDU1226 超级密码(BFS)

由于n最大也只有5000,则对于枚举的密码s,s%n的状态也只有5000种。所以每一个枚举到的状态,开两个内容,一个表示密码的字符串,一个表示模n的余数,当余数为0的时候,说明找到密码。#include<cstdio>#include<cstring>#include<iostream>#include<queue>#include<cctype>using namespace std;

2016-03-27 21:20:44 368

原创 HDU1885 Key Task(BFS)

有一个迷宫还有四种钥匙,对应四种门,问走出迷宫的最少步数。 二进制状态压缩step[s][x][y]表示走到点x,y,获得钥匙的状态为s的最少步数。 类似于这道题:http://acm.hdu.edu.cn/showproblem.php?pid=1429#include<cstdio>#include<queue>#include<cstring>using namespace std;

2016-03-27 21:01:12 319

原创 HDU1429 胜利大逃亡(续)(BFS)

钥匙的数量并不多,状态压缩一下。step[s][x][y]表示走到点(x,y)获得钥匙的状态为s的最少步数。比如状态1001表示得到钥匙D和A。#include#include#includeusing namespace std;struct Node{ int s,x,y; Node(){} Node(int a,int b,int c) {s =

2016-03-27 20:49:12 290

原创 BZOJ1218 激光炸弹

二维区间求和乱搞#includeusing namespace std;inline int Max(int a,int b){return a>b?a:b;}inline int Min(int a,int b){return a<b?a:b;}int arr[5010][5010],n,a,x,y,r,ans,maxnx,maxny;int getsum(int x1,int

2016-03-20 21:56:51 491

原创 BZOJ3993 星际战争(最大流)

显然这是一个二分图。我们假设在k时间内能够摧毁所有机器人,那么第i个激光武器总共能够削弱k∗Bik*B_i的装甲值。也就是说,∑k∗Bi≥∑Ai \sum k*B_i \geq \sum A_i。那么构建一张网络流的图,s向激光武器连边,容量为k∗Bik*B_i,激光武器向对应的机器人连边,容量为inf,机器人向t连边容量为AiA_i。决策满足单调性,二分最短时间k;最后判断是否满流(我也不知道为什

2016-03-20 21:49:16 395

原创 BZOJ3996 线性代数(最小割)

目标: ans=min∑i=1NA1,i(∑j=1NA1,j∗Bj,i−C1,i)ans = min \sum_{i = 1}^{N} A_{1,i} (\sum_{j = 1}^{N}A_{1,j}*B_{j,i} - C_{1,i}) 化简得到 ans=min∑i=1N∑j=1NA1,i∗A1,j∗Bi,j−∑i=1NA1,i∗C1,ians = min \sum_{i = 1}^{N}\

2016-03-20 21:30:17 360

原创 BZOJ1266 上学路线route(最小割)

显然,要删掉的路径肯定在最短路径上面。所以在最短路上建网络流的图,此时边的容量变成了ci。我们要花最小的代价让1,n不连通,也就是求最大流。#include#include#include#include#define MAXN 510using namespace std;inline int Min(int a,int b){return a<b?a:b;}inline v

2016-03-20 21:12:29 443

原创 BZOJ1433 假期的宿舍(最大流)

是一张二分图,也可以用匈牙利算法实现。X部为人,Y部为床,S向要留校的和校外人员连容量为1的边,所有的床向T连边,只有校内人员有床。#include#include#include#define MAXN 110#define INF 0x3f3f3f3fusing namespace std;inline int Min(int a,int b){return a<b?a:

2016-03-20 21:07:07 310

原创 Codeforces 321E Ciel and Gondolas(DP)

n(n≤4000)n(n\leq 4000)个人排队要乘k(k≤min(n,800))k(k\leq min(n,800))艘船,每艘船坐的人数不限。第i个人对第j个人有一个不满意度Ui,j(0≤Ui,j≤9且Ui,j=Uj,i=0)U_{i,j}(0\leq U_{i,j}\leq 9且U_{i,j}=U_{j,i}=0),如果他们在一条船中的话。问,如何安排使得总不满度最小。 DP,满足四边形

2016-03-17 20:52:53 976

原创 HDU3472 HS BDC(最大流+欧拉回路)

神奇的网络流建模。 有n(n≤1000)n(n\leq 1000)个单词,每个单词的长度都小于20,有的单词可以翻转。如果一个单词的尾字母和另外一个单词的首字母相同,那么两个单词可以拼接在一起。求问n个单词是否完全能够拼接在一起。 把每个单词抽象成两个点,一个点是首字母,一个尾字母,首字母和尾字母连边,如果单词可以翻转,连无向边。好了,现在问题变成了这个:给出一个混合图(既有有向边又有无向边),

2016-03-17 20:20:16 475

原创 HDU4183 Pahom on Water(最大流)

题目好长好难懂0 0,直接翻了翻网上的题解。 大意是这样的:有n(2≤n≤300)n(2 \leq n\leq 300)个点,每个点有个频率f(400.0≤f≤789.0)f(400.0 \leq f \leq 789.0)和坐标还有半径。如果点i能走到点j,那么以两个点为圆心半径分别为Ri,RjR_i,R_j的圆相交,即(Xi−Xj)2+(Yi−Yj)2−−−−−−−−−−−−−−−−−−−√<

2016-03-16 19:11:48 695

原创 BZOJ3931 网络吞吐量(最大流)

题目比较简单,但是到处是坑,建图也有点蛋疼。先求最短路,然后拆点跑最大流。 首先是图中是双向边不是单向边,而且给出的是点权,还需要判断在最短路径上的边的两个端点的先后关系,这无疑给建图带来了许多麻烦。最重要的是开long long不然过不了几个点。#include<cstdio>#include<cstring>#include<vector>#include<queue>#include

2016-03-16 17:01:37 492

原创 HDU3998 Sequence(DP+最大流)

已知一个长度为n的排列,先求出它的最长上升子序列的长度,设为k,再求长度为k的上升子序列有多少个。每个点只能经过一次。自认为这道题比较像最短路计数。类似的,先求出最长上升子序列(O(n^2)都可以),然后把每个点拆点,容量为1,因为只能走一次。源点s连向dp[i]=1的点,dp[i]=k的点连向汇点t,当dp[i]=dp[j]+1且a[j]#include#include#includ

2016-03-16 16:28:14 359

原创 HDU3081 Marriage Match II(最大流)

n个女孩和n个男孩要玩过家家的游戏。每个女孩要选择一个与她没有吵过架的男孩假装男朋友,如果这个女孩的朋友与某个男孩没有吵过架,那么这个女孩也可以找那个男孩假装男朋友。每次必须找不同的人,问这个游戏最多能进行多少轮。 把女孩放在一个并查集中然后连边,每个女孩向符合的男孩们连一条容量为1的边。假设这个游戏能进行k轮,那么源点s向每个女孩连容量为k的边,表示每个女孩都能找个k个男友,同理,每个男孩都向汇

2016-03-15 22:16:13 316

原创 HDU3416 Marriage Match IV(最大流+最短路)

城市A和B之间有一些有向边,求A,B之间的走最短路有多少种方法,即点可以重复走,而边不能。 首先求最短路,然后把在最短路上的边拖到新图里,容量为1,求最大流。判断一条边是否在最短路上:d1[edge[i].v]+d2[edge[i].v]+edge[i].w=d1[t]d1[edge[i].v]+d2[edge[i].v]+edge[i].w = d1[t] , d1[v]是起点到v的最短路,d2

2016-03-15 17:19:49 99

原创 HDU3605 Escape(最大流)

有n个人要移居m个星球,给出每个合适的星球,每个星球最多能容纳的人数,问是否所有人都可以移居。(1≤N≤105,1≤M≤10)(1\leq N\leq 10^5,1\leq M\leq10) 一开始还以为是最大流的裸题,结果TLE,翻了翻题解才知道原因:N的范围太大,那么多条边连完就TLE了。 首先要明确一点,这么多人肯定有许多人的选择是重复的,而且总方案数不超过2102^{10},根据这个,我

2016-03-14 20:41:00 1342

原创 HDU2883 kebab(最大流)

n位顾客要找老板烤肉串,第i个人要烤NiN_i串,每串烤TiT_i分钟,可以分成几个部分来烤,但是必须在SiS_i之后才能开始烤,而且必须在EiE_i之前烤完(个人认为题目描述不清,应该是时间区间 (Si,Ei](S_i,E_i] )。烤炉每分钟可以同时烤m单位的肉串(也就是说,每个人要烤肉的总量是Ni∗TiN_i*T_i单位)。问是否能够满足所有顾客的需求。 1≤N≤200,1≤M≤1000,1

2016-03-14 20:24:52 485

原创 HDU3338 Kakuro Extension(最大流)

给出一个大小为n∗m(2≤n,m≤100)n*m(2\leq n,m \leq 100)的数谜,在每个白格子里面填上1~9的数字,使得横向的和等于黑格子右上角的数,竖向的和等于黑格子左下角的数。 我的第一反应,搜索! 但是n,m有100那么大,估计也搜不过。 于是搜了搜题解,才知道网络流可以这样建模: 源点s连向黑格子右上角,容量为黑格子右上角的数,表示需要得到的和;黑格子的右上角分别向它对

2016-03-13 21:22:27 720

原创 HDU2732 Leapin' Lizards(最大流)

建图比较恶心的网络流模型。 有一个n*m(m没有直接给出)的网状迷宫图,还有一堆蜥蜴要从这个迷宫逃跑。蜥蜴站在一个柱子上面,每次跳跃的最大值是d(1≤d≤31\leq d\leq3),而且蜥蜴起跳离开柱子的时候柱子高度减一,跳到另外的柱子上高度不变,跳出地图时就算从迷宫中跑出去了,但是如果柱子高度为0,那只蜥蜴就挂了。第一张图中显示了柱子的分布,0表示没有柱子,柱子的高度貌似不超过3。第二张图表示

2016-03-13 12:45:56 281

原创 HDU3572 Task Schedule(最大流)

有n个任务,m个机器,对于第i个任务,必须在第si天之后开始,需要pi天完成且必须在第ei天之前完成。在一天中,一台机器只能干一个任务,一个任务只能被一台机器干。一个任务可以被中途打断,在不同的天用另外的机器完成。问你是否可以完成任务。(n≤500,m≤200,1≤pi,si,ei≤500)(n\leq 500,m \leq 200,1\leq p_i,s_i,e_i \leq500) 网络流的建

2016-03-13 12:19:52 338

原创 HDU3549 Flow Problem(最大流)

给你一个网络流的图,求出它的最大流,当个模板练习吧#include<cstdio>#include<cstring>#define MAXN 50using namespace std;int c[MAXN][MAXN],d[MAXN],vd[MAXN],flow,n,m,s,t,x,y,z;inline int Min(int a,int b){return a<b?a:b;}int

2016-03-13 12:05:11 244

原创 UVA10779 Collectors Problem(最大流)

白皮书上的练习题0 0 大意:Bob在与他的n−1(2≤n≤10)n-1(2 \leq n \leq 10)个朋友交换糖纸,一共有m(5≤m≤25)m(5 \leq m \leq 25)种糖纸。每个朋友手里有一些糖纸,可以一对一与Bob交换自己没有的糖纸,但是每个朋友只会交出自己的重复的糖纸。朋友之间不互相交换糖纸。问Bob最多能收集到多少种糖纸。 还是按照书上的方式建模吧,自己没有经验- -。

2016-03-11 11:56:23 461

原创 POJ3580 SuperMemo(Splay)

splay终极题目- -。。。 给定一个初始的排列(A1,A2,A3...An)(n≤105)(A_{1},A_{2},A_{3}...A_{n})(n \leq 10^5),还有m(m≤105)m(m\leq 10^5)次操作。 ADD x y D: 把数列标号[x,y]的每个元素都加上S REVERSE x y: 翻转区间[x,y] REVOLVE x y T: 把区间[x,y]后移T

2016-03-11 09:46:00 267

原创 HDU1890 Robotic Sort(Splay)

有一个长度为n(1≤n≤105)n(1 \leq n \leq 10^5)的排列,排列中的每个元素pi(1≤pi≤n)pi(1 \leq pi \leq n)。每次操作翻转第i个元素和第i大元素之间所有的数,并且输出第i大元素的位置。 刚开始看见又是区间翻转又是求第k大就晕了- -,网上搜了搜题解+自己理会发现:用原数组的下标来建树,每次把排序后的第i个元素对应的原数组的下标旋转到根,i+sz[c

2016-03-10 17:50:04 354

原创 HDU3487 Play with Chain(Splay)

有一个数列(1,2,3......,n),有两种操作CUT a b c 把数列[a,b]截去,插入截去后的数列的c号元素后面FLIP a b 把数列[a,b]翻转splay水过#include#include#define MAXN 300010int ans[MAXN],cnt,n,m,root,tot,ch[MAXN][2],sz[MAXN],fa[MAXN],v[MAX

2016-03-09 20:57:36 448

原创 UVA11922 Permutation Transformer(Splay)

有一个(1,2,3...n)的排列,给出m次操作,每次操作翻转区间[l,r],并且把翻转后的区间移动到排列末端,输出最后的排列。splay的区间翻转操作,第一次写。开始的时候插入两个虚拟节点0和n+1,这样原本的操作区间[l-1,r+1]就变成了[l,r+2];采用类似线段树的lazy标记,表示该子树表示的区间是否翻转;向下更新的时候下传懒标记,交换子树的编号即可。注意一下输出的时候需要下

2016-03-09 18:52:40 346

原创 HDU3183 A Magic Lamp(线段树)

给出一个不超过n位数的字符串(n≤1000n \leq 1000),从当中删除m个数字(m≤nm \leq n),使得剩下的数最小。 欲使剩下的数越小,那我们应该删掉大的而且靠前的数;换一个角度看,就是选出n-m个最小的数字,越靠后越好。 选取第一个数可以这么看:在[1,m+1][1,m+1]中选一个最小的,有多个最小的就选最靠前的(保证最优解),假设选取的位置为ii;那么选第二个数就在[i+1

2016-03-06 21:02:03 178 1

原创 FZU2082 过路费(树链剖分线段树)

如果只是查询没有修改就好做了,只需要找lca。加上修改操作之后可以使用树链剖分+线段树,注意把边权下放到点权,因此需要特别注意:当我们执行lca操作时,如果u = v那么直接返回路径长度;如果u ≠ v,则说明此时uv(假设dep[u]>dep[v])在一条重链上,返回的路径长度还需要加上dis(u,son[v])(son[v]是v的重儿子)。#include#include#incl

2016-03-06 20:15:31 334

空空如也

空空如也

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

TA关注的人

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