自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 LCA在线算法学习笔记

LCA就是求树上两个节点的最近公共祖先。LCA的在线算法最好的就是ST算法,这是一种基于RMQ(区间最小值)的算法,总的来说,就是利用dfs搜索得到一个序列,然后在这个序列中确定一个区间内,找到最小值的编号就是对应两点的LCA。举例说明,如图所示一棵树:通过深搜可以得到这样一个序列:节点ver: 1 3 1 2 4 2 5 6 5 7(左到右)深度  R :1 2 1

2016-11-10 16:25:18 552 1

原创 CF - 718C 线段树+矩阵

题意:给出n个数a1到an,还有m次操作,操作分为两种类型,一种给下标属于[l,r]的所有ai+x,另一种操作是询问F(a[l])+F(a[l+1])+...+F(a[r]),其中F(i)表示斐波那契数列的第i项。思路:求斐波那契数列通常会想到矩阵。可以发现:根据上面的递推式,可以用线段树维护这一段区间[l,r]中的F(a[i])的和以及F(a[i]-1

2016-11-10 16:09:42 676

原创 HDU 5826 微分方程

题意:n个质量完全相同的球放在一条直线上,每个球都有一个位置和初速度以及运动方向,球坐变加速运动,其加速度和速度的乘积为定值C,从某一时刻开始计算,有q个询问,每个询问需要求出在第t秒钟,n个球中第k小的速度是多少。思路:看到题,因为n个球质量相同,所以碰撞时交换速度,等价于忽略了碰撞,所以对这道题来说,球的初始位置和方向是多余条件。对于加速度a和速度v的乘积为定值c,我们

2016-11-09 23:44:31 355

原创 HDU 5761 微分方程

题意:题目可以描述为下图:一个人初始时刻在坐标(0,a),要到达(0,0),水流速度为v2,人的速度为v1,大小不变切始终指向(0,0),问是否能到达(0,0),如果能到达时间是多少?思路:一道关于速度的物理题,这种题通常要画出矢量图,并且对于速度的分量列出微分方程并求解。考虑v1的方向和v2的方向可以列出两个方程:

2016-11-09 23:20:38 608

原创 CF - 540D 概率dp

题意:有一个岛上有剪刀,石头,布各x,y,z个,每天都会有两个人相遇,如果是相同属性的两个人,则不会发生任何事,如果是不同属性的两个人,会有一个人被消灭。消灭的规则就是1.剪刀 消灭 布2.布   消灭 石头3.石头 消灭 剪刀假设经过无限长的时间,最后岛上只剩下一种人的概率分别是多少?思路:经典的概率dp,x,y,z都不大,很容易想到状态的设计dp[i][j]

2016-11-09 20:45:32 303

原创 CF - 201A 找规律

题意:给出一个数字n,要求出方阵的最小变长x,保证x*x的方针中有n个格子1,其余格子都是0,而且要保证方阵上下,左右都对称,输出x。思路:没什么想法,多画几个找规律,发现x一定是奇数,且于n满足一定的关系。注意3是需要特判。代码:#include using namespace std;int main() { int n, i; sca

2016-11-09 19:48:48 406

原创 CF - 461B 树形dp

题意:给出一棵n个节点的无根树,每个节点要么是0,要么是1,现在要把树分成若干区域,要求每个节点都必须属于一个区域,而且一个区域中只能有一个节点为1。问一共有多少种分法?思路:设dp[i][0]表示节点i属于某个没有1的区域的方案数,dp[i][1]表示节点i属于某个有1的区域的方案数。可以得到状态转移方程:dp[u][0] = dp[u][0] * (dp[v][0] +

2016-11-09 19:36:32 465

原创 CF - 219D 线段树 + dfs序

题意:n个城市之间有n-1条边相连,其中每条边都是有向的,现在要在其中选择一个城市作为首都,选择某个城市作为首都后,要保证首都可以到达任何城市,那么就要修改原来边的指向,问选首都最少修改几条边,另外要输出所有符合这个最小修改数的首都。思路:一道好题。如果从点的角度出发没什么思路,可以从边的角度考虑这个问题,对于某一条边(u,v),以哪些城市作为首都需要修改这条(u,v)边呢?思

2016-11-09 19:15:23 281

原创 CF - 274B 树形dp

题意:给出的一棵树,树上每个节点都都有一个值,现在可以每次选择树上的一块联通区域,要求这个区域中必须包含节点1,每次可以选择的合法区域进行所有节点值+1或-1的操作,问要使所有节点的值都变为0,最少需要几步操作?思路:一道树形DP。不妨以节点1为根,这样可以发现,要让每个节点的值都为0,而且每一步的操作都要求包含根,那么儿子节点一定不会晚于父亲节点变成0,所以我们可以从下到上进

2016-11-09 18:40:12 569

原创 CF - 255C DP

题意:找到一串序列b中的一段最长子序列,子序列满足x,y,x,y,x,y...交替的形式。思路:也算一种套路吧,这种类型dp[i][j]设为序列的最后两个数,这样状态转移就很明显了,dp[i][j] = max(dp[i][j], dp[last[j]][i] + 1),其中last[j]是j这个数上一次出现的位置。代码:#include using name

2016-11-09 10:16:39 538

原创 CF - 375B DP

题意:给出一个n*m的01矩阵,求出最大的全1子矩阵的面积,可以任意改变行的顺序。思路:枚举每一列,按照以这一列为末尾的连续1的个数排序,再枚举子矩阵的右下角。代码:#include using namespace std;const int MAXN = 5005;char a[MAXN][MAXN];int dp[MAXN][MAXN], tmp

2016-11-09 10:04:34 386

原创 CF - 505C DP

题意:有30000个岛屿,某些岛屿上会有宝藏,现在要从岛0开始移动,每次只能往序号更大的岛移动,如果第i-1次移动的距离为l,那么第i次的移动只能有三种情况,l-1、l、l+1(必须要满足都>1),第一次移动的距离为d,问最多能够获得多少宝藏。思路:要注意到1+2+...+250>30000,可以发现每次走一步的距离与第一步之间的差距不会超过250,所以我们可以考虑dp[i][

2016-11-09 09:43:29 452

原创 CF - 294B DP

题意:题意看图就懂,求书能摆放的最小长度,上面书的长度不能超过下面的。思路:每本书有两种可能的摆放,由这两种转移即可。代码:#include using namespace std;const int MAXN = 105;const int INF = 0x3f3f3f3f;int t[MAXN], w[MAXN], dp[MAXN][2 * MA

2016-11-09 09:35:13 352

原创 CF - 463D LIS + 思维

题意:题意很简单,给出m个1到n的排列,求出m个序列的最长公共子序列。思路:刚看这道题很容易以为是求LCS,但是并没有进展。其实这里,需要用另外一种方式表示两个排列相等。两个排列相等,当且仅当对于任意一个排列中的数x,y,如果在第一个排列中pos[x]有了上面的思路,我们只要在第一个排列中找到一个最长的子序列,满足子序列中的任意两个元素在m个排列中的相对位置都相等。这样就可以通过预

2016-11-08 23:31:47 350

原创 CF - 269B LIS

题意:给出n个盆栽摆在坐标x轴上,每个盆栽有自己的种类和放置的坐标,求出最小移动几个盆栽,可以使盆栽的种类序列非递减。思路:其实想找到最少移动的数目,就是要知道最多有多少个不需要移动,那么直接求一遍裸的LIS即可,这里是最长非递减序列。代码:#include using namespace std;const int MAXN = 5e3 + 10;int a[MAX

2016-11-08 23:19:15 441

原创 CF - gym - Samara University ACM ICPC 2016-2017 Quarterfinal Qualification Contest --- G

题意:一共n个人,m个物品,每个人都要选择一个物品,一个物品不能匹配多个人,每个物品有两种属性w和c,每个人都有两个要求a和b,一个物品可以匹配一个人,当且仅当w>=a和c>=b。求出一种符合的匹配策略,如果不可能就输出-1。思路:一道经典的贪心题,二维属性的匹配问题。先来考虑一维的情况,当每个物品只有一个属性的时候,很显然,贪心策略是为每一个物品找到所有可以匹配这个物品的人中要求

2016-11-08 22:09:37 1279

原创 HDU 5977 树的点分治 + 状态压缩 + 枚举子集

题意:给一棵节点数为n,节点种类为k的无根树,问其中有多少种不同的简单路径,可以满足路径上经过所有k种类型的点?(a->b与b->a算作两条路径,起点与终点也可以相同)思路:现场赛的时候k的大小是7,当时看到这题也没多想就树形dp水过了。现在重现赛k改成了10,这时候用树形dp,无论是时间还是空间复杂度都很爆炸。后来听说这题的正解是树分治,于是就学习了一波,然后重新来做这道题,关于

2016-11-07 20:09:10 2416

原创 POJ 1741 树的点分治

对于树上的路径问题,一种高效的处理方式就是分治算法。关于树分治算法的研究,详见2009年IOI国家集训队论文——《分治算法在树的路径问题中的应用》。    通常对于树上的分治算法有两种,第一种是针对点进行的分治,另一种是针对边进行的分治,可以证明,大部分情况下点分治算法的性能更加稳定,而边分治在某些情况下,算法效率非常低。所以以下主要讨论点分治。    如POJ-1741,求解一棵树中路径

2016-11-07 15:00:41 980

原创 CF - 733D STL

题意:有n个长方体,长宽高分别是ai,bi,ci,现在要选择其中一个或者两个长方体,如果选择两个长方体要拼成一个,必须要有一面完全一样,求这样选择的长方体的最大内切球体积为多少?思路:利用map 代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;const int MAXN = 1e5 + 10;map < p

2016-11-06 20:10:20 326

原创 CF - 733C 构造 + 贪心

题意:一排上有n只怪兽,每个重量为ai,每只怪兽可以吃掉比他重量小的怪兽,并获得这个怪兽的重量,问能否在若干步之后形成k只怪兽,每只重量为bi,如果可以,还需要输出在每一步的状态下,左数第几只怪兽吃掉了它左边还是右边的怪兽。思路:仔细观察可以发现,ai的相对顺序没变,所以最后形成的bj一定是由某个连续一段的ai组成,所以对于每个ai都可以知道它最后组成了哪个bj。 这样知道ai与bj的配对关系,我

2016-11-06 19:52:16 653

原创 HDU 5950 矩阵快速幂

题意:给一个递推公式 f(i) = f(i-1) + f(i-2) + i^4,求第n项的值。思路:根据递推公式构造矩阵,并且利用快速幂计算结果。算一算矩阵就出来了。代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;const ll MOD = 2147493647;struct mat{ ll p[

2016-11-06 19:27:30 412

原创 HDU 5969 思维题

题意:中文题意不解释。思路:要使或的和最大,要尽可能的让高位为1。将l和r两个数的二进制形式写出来,每一位都对齐,由于l<=r,所以在不相等的情况下,一定会出现某一位,r这一位上是1,而l这一位上是0,这样,我们可以选择一个数x这一位是1,往后所有都是0,y这一位是0,往后所有都是1,这样选择的x,y一定满足要求,而且x|y最大。代码:#include <bits/stdc++.h>using n

2016-11-06 18:19:53 535

原创 HDU 5963 思维题

题意:一道思维题 中文题意不解释。思路:首先考虑一条链的情况,与根节点相连的那条边,一定是最后变动的一条边。如果它是1,那无论下面的边怎么变,都必定要经过奇数次操作才能使它变成0,反之,它是0就要经过偶数次操作才行。 对于一棵树的情况,我们对于一个根,只要知道与根相连的所有权值1的边有多少,就可以判断出游戏要经过奇数还是偶数次才能结束,从而得到答案。代码:#include <bits/stdc+

2016-11-06 18:11:15 378

原创 CF - 724C 模拟 + STL

题意:给出的一个n*m的矩形区域,另外给出k个点的坐标,在初始时刻0从坐标原点想由上方45度射出一条射线,射线的速度为根号2,遇到墙壁会按照反射定律反射,问对于每个询问的点,计算出射线到达该点的时间,如果没到达就输出-1。思路:n和m都是1e5级别,对于每个点,都只有两条直线可以穿过它,且斜率k是+1或者-1,用map嵌套set来报存每一条直线上存在的点。然后设置一个当前反射点的坐标x,y,当前时间

2016-11-06 17:34:08 476 1

原创 HDU 5550 dp + 前缀和优化

题意:有个大楼有n层,每层都有两种人,一种喜欢的打球,一种喜欢游泳,现在要你在每一层要么开设球馆,要么开设游泳馆,分配完毕以后,打球的要到球馆,游泳的要到游泳馆,问最优分配下,所有人要移动的最短距离和是多少?思路:dp[i][0/1]表示第i层布置为0或1,且i+1层为1或0(与第i层相反)的最小代价。 dp[i][0]可以由dp[j][1]转移过来,其中j小于i,那么我们考虑j+1到i的这些层要

2016-11-06 00:14:41 581

原创 UVALIVE 7505 dp

题意:题目链接:https://vjudge.net/problem/UVALive-7505 2015年EC-final的F题 这题是半年前做的,当时想了非常久,最近又拿出来回味一下。 N只蚂蚁在一个水平放置的长度为N+1的杆子上,其中第i只蚂蚁就在据左端点i的位置上,而且重量也为i,每只蚂蚁会随机等概率地选择移动方向,向左或者向右,移动过程中到达杆子的端点就会折返。蚂蚁的移动速度都是...

2016-11-05 20:53:02 1019 2

原创 HDU - 5955 AC自动机 + Gauss消元

题意:N个人玩游戏,每个人心中猜测一个只允许有1到6数字,且长度为l的序列,题目保证任意两个人猜测的序列不完全相同。有一个色子,每次可以掷出1到6的任意数字,色子会永远不停的投掷,从而形成一个无限长的随机序列,问某一时刻,某个人所猜测的序列证号是这个序列末尾l个字符的概率是多少,输出每个人的概率。思路:lrj的《训练指南》上的ac自动机章节有过类似的题型,所以看到这种题,数据量也不大,首先考虑搞一个

2016-11-04 13:46:46 1400

原创 CF - 712D 差值dp + 前缀和优化

题意:A和B玩游戏,游戏一共分为t局,两个人各有一个初始分数a和b,每一局,两个人需要在[-k,+k]这个区间中任意选择一个整数,并且加到自己的分数中去,问游戏结束后,有多少种情况,A的分数可以严格大于B?(只要任意一局有至少一个人选择的分数不同两种,就算作不同情况)思路:dp进行计数,看到这种差值不是很大的关系,可以考虑dp的其中一维设置成两人分数的差值 设dp[i][j]表示到第i局为止,a-

2016-11-03 23:17:40 530

原创 CF - 711D 搜索环

题意:给出n个点n条单向边的一个图,其中可以任意选择其中的某个边的集合,将其中的边反向,问可以选择多少种集合,使得整个图中不存在环?思路:初看这题可能会觉得无从下手,仔细读题之后会发现几点1.一共只有n条边,可以证明n条边组成的图,在一个联通分量中不可能存在两个环,假设某一个联通分量中存在两个环,其中一个环大小为s1,另一个环大小为s2,因为只有s1+s2条边,所以两个

2016-11-03 21:59:15 479

空空如也

空空如也

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

TA关注的人

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