自定义博客皮肤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.

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

原创 BZOJ1500 [NOI2005]维修数列(Splay)

题意不多说。这大概算是splay的终极题目了吧,和poj3580差不多。 插入:把左端点前一个节点和右端点后一个节点旋转到根和根的右儿子,然后像建树那样构造右儿子的左子树。 删除:同上的旋转方式。删掉根节点的右儿子的左子树。虽然同时存在的节点不超过500 000个,但是不停的插入删除会使节点编号x变得非常大,造成RE;因此需要内存回收,开一个栈来保存删掉的所有节点编号。 修改:同上的旋转方式。

2016-04-08 11:38:29 488

原创 POJ3525 Most Distant Point from the Sea(半平面交)

有一个海岛,求海岛上距离海岸线最远的点。lrj白皮书例题,我这里也有介绍半平面交的相关知识。直接求不好求,于是二分这个距离,把海岸线向”里”(逆时针给出边的时候左边为里,也就是它对应的半平面)移动这个距离,如果这些半平面有交集,则说明距离不够远,如果没有交集则说明距离太远。于是二分到恰好没有交集。#include<cstdio>#include<cmath>#include<algorithm>

2016-04-05 22:19:16 371

原创 POJ 1279&1474 (多边形的核)

关于多边形的核,我的这篇博客有介绍,就不多说了,差不多就是粘模板吧。 POJ1279求多边形核的面积(貌似G++编译器有问题,C++就过了)#include<cstdio>#include<cmath>#include<algorithm>#define MAXN 1550using namespace std;struct poi{ double x,y; poi(d

2016-04-05 21:42:09 572

原创 HDU3555 Bomb(数位DP)

数位DP入门级题目(我也只会做入门级题目0 0),求n以内的数字中不含有连续的49的数字有多少个。类似于另外一题http://acm.hdu.edu.cn/showproblem.php?pid=2089,照搬代码吧。另外一题题解,N久以前发的:传送门。先预处理,设dp[i][j]表示第i位数是j的方案数(j可以是0),不难得到dp[i][j] = sigma(dp[i-1][k])(0模

2016-04-05 21:22:18 407

原创 UVA11374 Airport Express(SPFA求最短路)

城市里面有n个站点,一些站点之间通过双向边相连。现在在一些站点之间可能有快速路,可以减少通行的时间,但是你只能经过一次快速路。问到终点的最少时间,并输出方案。思路还是很好想,输出就有点蛋疼了。设d1[i]表示起点到i的最短距离,d2[i]表示终点到i的最短距离。枚举每一条可能使用的快速路(a,b),用d1[a]+w(a,b)+d2[b]或d1[b]+w(a,b)+d2[a]去更新答案,最小的那

2016-04-05 20:33:52 449

原创 两个圆柱相交的体积 UVALive 5096 Volume

本博客主要讨论从积分和非积分方式计算两个圆柱体交集的体积。由于博主的高数很烂,有什么不得当的地方还望大家指出来。 两个圆柱相交: 不难发现相交有两种情况,如图所示是2R<H2R<H的情况。 我们先暂且不考虑第二种2R>H2R>H的情况,先看第一种。把多余的地方切去,会得到这个立体图形: 这个叫做牟合方盖。通过百度不难发现它的体积公式为163R3\frac{16}{3}R^3,那么问题

2016-04-05 14:11:59 24330

原创 计算几何学习笔记之旋转卡壳

旋转卡壳的用途太广太广了,而且每种用途代码都大同小异,这里只简单介绍一下(毕竟我也没怎么写过) 什么是旋转卡壳?可以想象成有一双筷子(筷子是平行的),把凸多边形夹了起来,然后不停地旋转,旋转。旋转中筷子要么是紧贴多边形的边要么就是紧贴多边形的顶点。 旋转卡壳简介:http://blog.csdn.net/acmaker/article/details/3176910 计算凸多边形上的最远点

2016-04-01 18:11:53 2273

原创 计算几何之半平面交、多边形的核

半平面指一个平面的一半。比如在二维空间中,一条直线可以把整个平面分为两部分,左边是一个半平面右边是一个半平面。而半平面交就是一堆半平面的交集,可以想象成线性规划方程组A0x+B0y+C0>=0,A1x+B1y+C1<=0......A_0x+B_0y+C_0>=0,A_1x+B_1y+C_1<=0......的解集 如果一根直线是有向的,我们可以定义它的左边是它对应的半平面(也可以是右边),那么半

2016-04-01 17:46:08 2947 1

原创 计算几何学习笔记之凸包

凸包就是把给定点包围在内部,面积最小的凸多边形。 先将所有点排序(x小的放在前面,x相同则y小的放在前面),用一个栈维护已经加入凸多边形的点,类似于DP的单调栈优化。按照逆时针(顺时针则操作取反)顺序依次加入点,如果新点在上一根直线的左边则加入,否则弹出栈顶的边,直到新点在上一根直线的右边。点的位置可以用叉积正负判断。 需要执行以上操作两次,第一次加入凸包下方的点,第二次为凸包上方的点。 in

2016-04-01 16:20:07 677

原创 计算几何学习笔记之多边形

凸多边形:指如果把一个多边形的所有边中,任意一条边向两方无限延长成为一直线时,其他各边都在此直线的同旁,那么这个多边形就叫做凸多边形,其内角应该全不是优角。 非凸多边形:不是凸多边形的多边形。 多边形的有向面积:通过把n边形转换为n-2个三角形(从第一个顶点出发向其他点连边),用叉乘公式求每个三角形的有向面积。对于非凸多边形也同样适用,在外面部分可以正负抵消。实际中,多是求多边形的面积而不是有向

2016-04-01 15:51:36 509

原创 计算几何学习笔记之点和直线

向量的基本运算http://blog.csdn.net/cqbzwja/article/details/51030712 直线用参数方程表示,参数方程就是直线上任意一点,加上一个方向向量,以及参数t。假设直线上所有点满足P=P0+tv⃗ P = P_0+t\vec v,那么t为参数,P0是直线上任意一点,v是直线的方向。假设点Q有Q=P0+t0v⃗ Q = P_0+t_0\vec v,则表示Q在P

2016-04-01 15:30:10 1160

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

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

2016-03-31 22:16:04 925

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

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

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

2016-03-28 14:54:31 763

原创 POJ3322 Bloxorz I(BFS)

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

2016-03-28 14:43:26 607

原创 POJ1324 Holedox Moving(BFS)

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

2016-03-28 14:30:19 330

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

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

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

原创 POJ1475 Pushing Boxes(BFS+BFS)

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

2016-03-27 22:22:21 361

原创 HDU4012 Paint on a Wall(BFS)

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

2016-03-27 22:05:12 335

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

原创 HDU2821 Pusher(DFS)

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

2016-03-27 21:34:26 321

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

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

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

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

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

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

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

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

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

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

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

2016-03-17 20:20:16 460

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

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

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

2016-03-16 17:01:37 454

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

原创 HDU3081 Marriage Match II(最大流)

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

2016-03-15 22:16:13 295

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

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

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

空空如也

空空如也

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

TA关注的人

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