自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

转载 Convex hull trick算法介绍

http://www.rockzh.com/archives/57

2016-03-08 16:20:50 710

原创 HDU 2859 Phalanx(动态规划)

dp[i][j]表示以点i、j为左下角的最大对称子矩阵长度。#include#include#include#include#include#includeusing namespace std;typedef long long LL;const int maxn=1010;char g[maxn][maxn];int dp[maxn][maxn];int main()

2015-12-22 19:38:30 306

原创 后缀数组——罗穗骞倍增算法代码详解

首先解释一下用到的几个数组。数组sa:构造完成前表示关键字数组,下标表示名次,值表示关键字的首字符位置,值相同的时候名次根据在原串中相对位置的先后决定;构造完成后表示后缀数组,下标表示名次,值表示后缀的首字符位置。数组x:表示rank数组,下标表示关键字的位置,值表示关键字大小(rank),相同的值有相同的rank。初始化为字符串r的每个字符大小(此时x并不代表rank,只借助其值比较相对

2015-12-19 10:28:15 4487 1

原创 HDU 3681 Prison Break(BFS+二分+状态压缩DP)

用BFS处理每个点之间的距离,二分答案,用状态DP判断是否能够可以。dp[i][j]表示当前位于i点已经遍历集合j时的最大能量值。#include #include #include #include #include #include #include #include using namespace std;typedef long long LL;const in

2015-12-03 22:13:11 274

原创 HDU 4562 守护雅典娜(动态规划)

答案分为三种只能只有包含雅典娜的塔,只有包含怪兽的塔,包含雅典娜和怪兽的塔的和。使用dp可以分别计算包含雅典娜、怪兽的最厚塔层数,过程类似LIS。枚举这两种情况的塔数,求和计算第三种情况。#include #include #include #include #include #include #include #include using namespace st

2015-11-26 20:41:00 369

原创 使用SecureCRT远程登录Linux Ubuntu

在使用SecureCRT远程登录Ubuntu时会出现,The remote system refused the connection.这是因为SSH服务没有启动。安装SSH-Server。sudo apt-get install openssh-server启动SSH-Server。/etc/init.d/ssh startSSH-Server

2015-11-25 13:21:38 442

原创 HDU 4939 Stupid Tower Defense(贪心+动态规划)

可以发现对于最优解红塔一定是放在最后的。对于蓝塔和绿塔进行dp,dp[i][j]表示在长度为n的路径上已经安放i个绿塔和j个蓝塔可造成的最大伤害,然后进行转移。最优解一定是路径上放满了塔,这样n-i-j得到的就是红塔的数量,这样比较得到最大值即可。#include #include #include #include #include #include #include #inc

2015-11-08 19:00:20 276

原创 HDU 1561 The more, The Better(树形DP)

经典的树形DP。先将多叉树变成二叉树,然后进行DP。dp[i][j]表示以i为根,可选j个时候的最优解。#include #include #include #include #include using namespace std;const int maxn=205;int ch[maxn][2];int f[maxn][maxn];int v[maxn];in

2015-11-08 15:44:40 254

原创 HDU 3534 Tree(dfs统计树的直径的数量)

求树的直径用dfs可做,每次返回以当前结点为终点、某个叶子为起点的最长路径长度,同时找最大的两条路径求和更新最优解。具体分有多条同样长的最长路径、有一条最长路径和一条或多条次长路径、只有一条路径、叶子结点这几种情况。O(n)可做。#include #include #include #include #include using namespace std;const int

2015-11-08 14:39:24 559

原创 USACO Section 3.1 Humble Numbers

用一个数组p来维护每个素数要拓展的丑数在数组中的位置,每次比较得到最小的数字加入到丑数数组中。#include#include#include#include#include#includeusing namespace std;typedef long long LL;/*ID: kkkwjx1PROG: humbleLANG: C++*/int s[10

2015-11-06 19:33:32 223

原创 USACO Section 3.1 Score Inflation(完全背包)

完全背包。模版题,可以用滚动数组优化。#include#include#include#include#include#includeusing namespace std;typedef long long LL;/*ID: kkkwjx1PROG: inflateLANG: C++*/const int maxn=10005;int dp[maxn];int

2015-11-06 14:16:15 266

原创 USACO Section 3.1 Agri-Net(最小生成树Prime算法)

最小生成树,模版题。#include#include#include#include#include#includeusing namespace std;typedef long long LL;/*ID: kkkwjx1PROG: agrinetLANG: C++*/const int maxn=105;int g[maxn][maxn];bool use[m

2015-11-06 14:06:43 377

原创 HDU 1712 ACboy needs your help(分组背包)

模版题,分组背包。dp[i][j]=max(dp[i][j],cost[i][k]+dp[i-1][j-k])#include#include#include#include#include#includeusing namespace std;typedef long long LL;const int maxn=105;int cost[maxn][maxn];

2015-11-05 17:48:24 236

原创 HDU 5525 Product(数论)

首先将1-n每个数分解质因数,变成p1^x1*p2^x2...pi^xi..pm^xm的形式,其中pi表示质因数,ai表示质因数出现次数。考虑每个质因数pi对最后答案的贡献,由约数个数定理知除pi以外的质因数有(x1+1)*(x2+1)*...(xi-1+1)*(xi+1+1)..(xm+1)个,而pi可能贡献0到xi个,所以包括pi的约数的积是pi^0*pi^1*...pi^xi*(x1+1)*

2015-11-05 13:41:31 404

原创 USACO Section 2.4 Fractions to Decimals

首先答案不可能是无限不循环小数,因为无限不循环小数不能用分数表示。之所以出现循环是因为余数出现了重复,只需要用数组记录余数出现的位置,用判重来结束循环即可。#include #include #include #include #include #include #include #include #include using namespace std;/*ID:

2015-11-03 21:29:39 281

原创 USACO Section 2.4 Cow Tours (Floyd+并查集)

用floyd计算每个点可达的最短距离,然后统计每个点可达距离的最大长度。然后用并查集计算每个点所属的集合,枚举两个不同集合a、b里的两个点i、j,从所有的max{edge[a],edge[b],distance(i,j)+l(i)+l(j)},其中edge[x]表示集合x的直径,distance(x,y)表示x和y点的距离,l(x)表示点x可达距离的最大长度。#include #incl

2015-11-03 20:59:36 303

原创 HDU 5524 Subtrees(DFS)

分析可以发现所有子树的种数不会太大可以直接暴力统计。递归处理当前的树,首先记录当前树的大小,然后对于它的两颗子树,找到其中那颗满二叉树暴力统计子树种数,然后递归处理另一颗子树。注意统计判重。找满二叉树的过程可以通过枚举树的高度,然后判断另一颗树的高度与它相差是否在1之内。#include #include #include #include #include #include

2015-11-01 10:27:45 626

原创 HDU 5523 Game

简单题。如果不止1个柱子而且s和t相同则无解。其他情况下如果s和t分别在两边则是0,如果s在一头或s在中间但是s和t相邻则只需要1,其他情况下为2。#include #include #include #include #include #include #include using namespace std;typedef long long LL;int main(

2015-11-01 10:23:27 541

原创 HDU 4832 Chess (动态规划+组合数学)

关键点是行和列是独立的。移动K步可以视为x方向移动i步(y向不动),y方向移动K-i步(x向不动)。分别预处理出x和y方向上移动i和K-i步时的种数,然后使用排列组合枚举i。相乘即可。注意,计算组合数时可能使用了除法这将使模运算出错。#include#include#include#include#include#include#include#include#incl

2015-10-31 16:15:36 321

原创 UVa 1400 "Ray, Pass me the dishes!"(区间最大连续数组和)

训练指南上的例题。可以使用Splay解决,维护区间最大连续值即可,在维护输出要求这里比较复杂,需要考虑清楚,L最小和R最小。注意要用longlong。#include #include #include #include #include #include #define Value ch[ch[root][1]][0]using namespace std;typed

2015-10-31 13:34:12 359

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

经典的题目,包含了Splay常见的操作:区间最值,区间求和,区间翻转,区间改值等。#include #include #include #include #include #include #include #include #include #define Value ch[ch[root][1]][0]using namespace std;typedef l

2015-10-30 22:08:39 250

原创 HDU 1166 敌兵布阵(区间求和+单点更新)

经典问题,对序列进行区间求和和单点更新操作。可用树状数组或线段树或Splay实现。我这里使用了Splay。#include #include #include #include #include #include #include #include #include #define Value ch[ch[root][1]][0]using namespace std;

2015-10-30 20:05:56 244

原创 LeetCode273 Integer to English Words

将数字转化成英语单词。分析单词可以发现每1000之间是有规律的。

2015-10-08 17:15:09 450

原创 POJ1655 Balancing Act (树的重心)

树的重心:如果删除某点以后,形成的所有子树中,最大的子树大小最小,那么该点是树的重心。求树的重心只需要一遍dfs即可,并不是什么树形dp。对于某个点,需要求出它所有的子树大小,孩子结点直接递归计算就行了,它父亲方向的结点个数等于树结点总数减去所有孩子结点的和。然后比较在最大值中取最小的就可以了。#include#include#include#include#include

2015-10-08 16:41:57 293

原创 LeetCode283 Move Zeroes

最容易想到的思路,先删掉所有的0,然后再在尾部补0。class Solution {public: void moveZeroes(vector& nums) { int j=0; for(int i=0;i<nums.size();++i) if(nums[i]!=0) nums[j++]=nu

2015-10-08 13:30:18 303

原创 LeetCode284 Peeking Iterator

实现一个迭代器支持peek,next,hasnext。其中next和hasnext直接使用继承来的操作即可;peek要求返回数值又不删除它,可以用一个临时变量的next实现。// Below is the interface for Iterator, which is already defined for you.// **DO NOT** modify the interface

2015-10-08 13:09:07 207

原创 LeetCode290 Word Pattern

用两个哈希表分别存放字符-单词,单词-字符。然后遍历判断是否出现冲突。切割字符串可用strtok。class Solution {public: bool wordPattern(string pattern, string str) { char cstr[str.size()+1]; strcpy(cstr,str.c_str());

2015-10-08 12:25:48 240

原创 4034: [HAOI2015]T2 (树链剖分)

树链剖分+线段树区间更新和区间求和。注意,一个子树的所有点上的序号在线段树上的位置是连续的,意识到这点这个题就是模版题了。另外关于树链剖分的细节,第二次递归的时候要先计算重边对应结点否则会出错。线段树中,push_down的部分注意可能溢出int。最终答案要用longlong。#include#include#include#include#include#include

2015-10-08 12:06:59 240

原创 SPOJ 375. Query on a tree (基于边的树链剖分)

基于边的树链剖分,与点的几个不同点:1,维护边权值,即是维护某点与其父亲点之间边的权值,所以可以等同视为该点的权值(即孩子结点,可以通过判断深度较大的是孩子结点)。2,在LCA过程中,最后一步,在重链上求区间最大值,这里的左端点实际上是对应一条不在计算范围内的边,所以调整左端点x为son[x]。#include#include#include#include#inclu

2015-10-07 23:25:47 283

原创 1036: [ZJOI2008]树的统计Count (基于点的树链剖分)

处理点的树链剖分。支持单点更新,树上求最值和树上求和。注意的地方:记录树上的点在线段树的位置的同时,也要记录线段树的某个位置是树上哪个点。因为线段树建树的时候是按照线性从左往右的,需要知道每个位置的点是哪个。

2015-10-07 16:49:25 318

原创 USACO Section 2.4 The Tamworth Two (BFS模拟)

用三维数组保存运动物体第一次处于x、y坐标和某方向时所用步数,同时记录当运动物体的路径和出现循环时的周期。这一步用BFS完成。枚举两个运动物体路径中的公共位置,根据情况分类讨论。有3种情况。1,人和牛都处于循环路径中。即判断A+xa=B+y+b,用拓展欧几里德求解。2,人和牛都不在循环路径中。即判断A=B。3,人和牛只有一个在循环路径中。即判断A+xa=B。/*ID: k

2015-10-06 17:44:11 312

原创 USACO Section 2.3 Controlling Companies (迭代更新)

每次循环迭代,直到没有更新控制的公司。

2015-10-06 15:29:20 215

原创 USACO Section 1.3 wormhole (暴力+模拟)

注意几个地方。1,暴力的时候要注意别算重复了。匹配是双向的。2,判断回路不能使用拓扑排序或弗洛伊德,因为它的行动是有规则的:传送以后只能往前走不能再相同位置传回去,基于这个条件只能枚举每个位置模拟判环。

2015-10-06 12:40:38 669

空空如也

空空如也

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

TA关注的人

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