自定义博客皮肤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)
  • 收藏
  • 关注

原创 HDU 2256 Problem of Precision

题目分析 这道题跟我之前发的一道题几乎一样,这里我就不给出证明过程了,直接上代码。#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;typedef long long LL;const int MOD = 1024;struct Matirx{

2016-07-30 16:03:11 260

原创 HDU 4565 So Easy!

题目分析Sn=⌈(a+b√)n⌉%m S_n = \lceil(a+\sqrt{b})^n\rceil \% m 因为(a−1)2<b<a2(a-1)^2 < b < a^2 ,所以0<(a−b√)n<10<(a - \sqrt{b})^n<1,因此Sn=⌈(a+b√)n+(a−b√)n⌉%mS_n = \lceil(a+\sqrt{b})^n+(a-\sqrt{b})^n\rceil \%

2016-07-30 15:37:47 813

原创 HDU 5221 Occupation(树链剖分)

题目分析 很明显这道题是一道树链剖分的题目,这个中间用线段树处理的让我感觉老是很怪异!!可能没有这样处理过线段树吧!对于第一种操作,很明显就是树链剖分的简单处理,对于第二种操作只需要更改相对应线段树中的值就可以了,对于第三种由于轻重链剖分对于每棵子树上的东西都需要处理,但是每棵子树上所有节点所在的区间是连续的,因此转化为了线段树的区间更新,其他的都不难写了。还有一点我们用w[]表示树中的节点在线

2016-07-30 13:08:55 220

原创 HDU 5456 Matches Puzzle Game(2015 ACM/ICPC Asia Regional Shenyang Online)

题目分析 之前也研究了一段时间的数位dp,但是一直没有见到这种形式的,状态看了好半天都不知道怎么找状态,看了别人的博客,也给看懂了,感觉其实也不是特别难,但是这种dp太不好查错了!!首先将式子化为A = B+C,那么我们需要定义状态,dp有4维,第一维很明显是火柴棍数量,第二维是有没有进位,第三位是B还能不能继续放数字,第四位是C还能不能继续放数字。状态转移方程见代码。#include <cs

2016-07-29 16:28:08 381

原创 HDU 5458 Stability (2015 ACM/ICPC Asia Regional Shenyang Online)

题目分析 这道题真的不是很好写,树链剖分本来就是个很恶心的东西,这个程序里面还要倒着来,调bug调了一上午发现自己的while写成了if。整个人都不好了,不过也还好,才一上午。树链剖分可以处理2点之间路径上的一些东西,而且速度很快,本题也不例外,同样是处理这些东西。因为最初给你一些边,但是这些边组成的图可能不是一棵树因此没有办法做树链剖分,很明显我们要想办法将图转化为树,这道题我们首先将所有边塞

2016-07-29 14:07:33 380

原创 POJ 2763 Housewife Wind

题目分析 题目很水,理解了很简单,就是套模板。#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int maxn = 100005;#define mid (L+R)/2#define lson o<<1, L, mid#defi

2016-07-28 19:01:57 237

原创 HDU 3966 Aragorn's Story

题目分析 树链剖分基础题。2种操作:第一种:询问节点C的敌人数。另一种为改变a到b的路径上所有节点的敌人数。#include <cmath>#include <cstdio>#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int

2016-07-28 18:59:29 206

原创 SPOJ 375 Query on a tree(树链剖分)

题目分析 本题主要是修改树上线的cost值,还有询问2点之间的最大的cost.因为本题数据量大,并且修改和查询次数多,因此我们需要使用线段树进行操作。因此我们需要对树进行剖分,并将每个点对应的线段进行更新即可,根节点没有对应线段,因为n个节点的树只有n-1条边,因此统一将线段与连接2端的深度较大的点对应。至于树链剖分的理解有一个很不错的博客博客地址,多看看配合在草纸上画出对应图形就能正确理解了。

2016-07-28 13:15:36 302

原创 字典树基础题总结

HDU 1251 统计难题#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define MAX 26struct Trie{ int val; Trie *next[MAX];};Trie *root;void Insert(cha

2016-07-26 19:02:58 367

原创 POJ 1651 Multiplication Puzzle(区间dp)

题目分析 感觉记忆化搜索好写多了,找到递归边界,一会就写出来了,正着推老是因为要用小区间去推大区间,因此计算顺序很重要,很容易写错,但是记忆化搜索就不怎么用担心这个问题。这道题就是矩阵连乘问题的改版,这道题如果想着一个一个删除处理起来及其不方便,因此还是一个一个往里面加简单,很多dp题都是这样正着推不好推,但是倒着推很容易得到答案。#include <cstdio>#include <cst

2016-07-25 16:56:47 275

原创 SPOJ BALNUM - Balanced Numbers

题目分析 这道题的状态同样不好取,因为要求每一个奇数的个数都要为偶数,每一个偶数的位数都要为奇数,又因为只有10个数(0~9),又因为没个数只有3种状态,分别是没有(0),奇数个(1),偶数个(2),这样我们就利用3进制进行压缩就可以了,3的10次方不超过60000,因此直接开60000即可,这样dp[i][j]的i表示当前处理到了第i为,j表示当前(0~9)对应的状态。搞了3天这个了,现在感觉

2016-07-23 16:16:35 982

原创 hdu 4734 F(x)2013 ACM/ICPC Asia Regional Chengdu Online

题目分析 数位dp基础题,状态挺容易想到的,因为数字只有10位,2^9还不到才512,即使每一位都是9,运用等比数列求和知不超过5000,因此dp数组第一位表示位数,第二位就表示计算出来的f函数值,那么我们每一次就找小于F(A)的即可,同样要满足B的限制,这样就可以顺利写出状态转移方程了#include <cmath>#include <cstdio>#include <cstring>

2016-07-23 11:29:21 306

原创 HDU 3709 Balanced Number

题目分析 给定一个区间,看有多少数是跳板数,跳板树的定义是选定数字中的某一位作为支撑点,那么左边距支撑点的距离乘以左边数字的大小等于右边距支撑点的距离乘以右边数字的大小,如果相等,则为跳板数。这道题也是很迷呀!!写了半天一直在想我在里面找跳板,后来看了一下别人的博客瞬间明白了,我可以在最外面找跳板,简单并且清晰,可能写题写傻了!!!#include <cstdio>#include <cst

2016-07-22 20:43:10 225

原创 POJ 3252 Round Numbers

题目分析 找到2个给定的数之间二进制的表示中0比一大的个数。平时的数位dp用十进制进行分解,得到每一位的10进制数,这道题很明显按2进制进行分解就可以了,但是需要前导0要进行特别的判断,比如000101,前面的3个0很明显是不需要算进去的,在记忆化搜索是多加一个变量就可以了。#include <cstdio>#include <cstring>#include <iostream>#in

2016-07-22 20:37:30 336

原创 HDU 4352 XHXJ's LIS

题目分析 这道题前面说了一堆废话,不过这道题还是很有水准的,不愧是多校的题目。这道题就是让你求给定2个数字,让你求这2个数字之间的有多少个数字满足数字的每一位上的数组成的最长递增子序列为K。看这道题就满头包,不知道怎么构建状态,看了网上的代码,才发现原来要讲构成的递增子序列作为状态存下来,真是神奇呀!说好的数位dp,瞬间变成了数位dp加动规。然后就可以按照求单调递增子序列的n*logn的方法处理

2016-07-22 20:32:43 475

原创 Code Forces 55 D. Beautiful numbers(数位DP)

题目分析 cf上的D题还是很有水准,出的题不难,一眼就能知道什么意思,也很容易想到一些东西,但是如果不多加一下处理,就不能成功的解决这道题。这道题真的是一道好题,感觉特别开动人的脑经。 首先我们要求Beautiful numbers,那么我们怎么求呢,肯定要求已经加进去的各位数字的最小公倍数了,只要最后处理到头得到的那个数能够整除这个数的所有位数的最小公倍数就可以,但是你以为这样就够了吗?

2016-07-22 12:25:16 284

原创 数位dp小结

数位dp如何入门 我最初在网上漫游了一天,终于找到了一个适合自己的学习方式,这里分享给大家。搜数位dp大部分都是记忆化搜索写的,因为这个搜索是反向的,所以一看是看上去真的什么都看不懂,因此我们首先学一下递推版的,这里给出网址,大家可以去看一下写的真的很好,认真看就能看明白初探数位dp,然后看懂了之后就手写代码,通常写hdu2089(不要62)这个入门题,这样我们就可以开始看记忆化搜索了,只是反向

2016-07-22 10:29:36 246

原创 数论基础定理及其应用(hdu 2685 I won't tell you this is about number theory, hdu 2582 f(n),hdu 1792 A New Chan)

hdu 2685 I won’t tell you this is about number theory 定理:如果a>b,则gcd(am−bm,an−bn)=agcd(n,m)−bgcd(n,m);gcd(a^m-b^m,a^n-b^n ) = a^{gcd(n,m)}-b^{gcd(n,m)};对于这道题我们可以将b看做1,这样显而易见就可以得到结果了。#include <cstdio>

2016-07-19 19:16:42 542

原创 矩阵快速幂(NYOJ 148 fibonacci数列(二), POJ 3233 Matrix Power Series, hdu 2157 How many ways??)

矩阵快速幂 普通的快速幂大家应该都懂,对于矩阵快速幂来说,处理的不是数字而是矩阵。由于矩阵乘法具有结合律,因此A^4 = A * A * A * A = (A*A) * (A*A) = A^2 * A^2。我们可以得到这样的结论:当n为偶数时,A^n = A^(n/2) * A^(n/2);当n为奇数时,A^n = A^(n/2) * A^(n/2) * A (其中n/2取整)。这就告诉我们,计

2016-07-18 21:01:20 303

原创 HDU 5493 Queue(2015 ACM/ICPC Asia Regional Hefei Online)

题目分析 一道线段树的题目,因为是前面或者后面有k个比自己高的人,所以我们应该按照由身高从小到大排序,这样前面的人对后面的人就没有什么影响。我们线段树中存的是每一段有多少空位置。这样每次如果根节点的空位置小于k,那么很明显没办法放,同样因为前面对后面的没有什么影响,我只需要找到k和n-k-i中较小的,如果这个值小于0,那么则没有办法继续插入。因为满足字典序最小,因此往最前面位置插入就可以了。#

2016-07-14 09:54:14 290

原创 POJ 1988 Cube Stacking

题目分析 典型的带权并查集,这道题有2个操作,一个是将带a的那一堆石头移到带b的那一堆石头上面,另一个是询问a号石头下面有多少石头。这里我定义了3个数组,fa用于查父节点,he查编号为i的石头下面有多少石头,sum表示以a为根节点的石头堆中有多少石头。#include <cstdio>#include <cstring>#include <iostream>#include <algor

2016-07-13 15:10:23 437

原创 HYSBZ 3668: [Noi2014]起床困难综合症

题目分析 很明显,这道题不能直接枚举0~m左右数,很明显会超时,那么我们只能从高到低枚举每一位,最多有32位,每一位有2个状态(0,1),所以时间复杂度是64*10^5,注意如果这一位能取0达到1,那么必定取0,如果这一位取1则要判断是否超过m。#include <cstdio>#include <cstring>#include <iostream>#include <algorith

2016-07-13 15:04:49 296

原创 HDU 1542 Atlantis(线段树,离散化,扫描线)

题目分析 第一次做这样的题目,一直不知道处理,感觉挺麻烦的,但是想明白之后发现一点也不难。给出相应的博客地址线段树扫描线详解 扫描,还有离散化我感觉都非常好处理,但是对于线段树更新的时候不好把握。也就是二分查找的时候得到右边端点的坐标为什么要-1的问题,因为计算过程中你会发现L,mid,mid+1,R,这时候少算了mid到mid+1的距离,那么怎么给加上呢?这时候很明显需要在右边加一,但是

2016-07-09 10:14:47 487

原创 HDU 1978 How many ways

题目分析 一道简单的动态规划题目,首先状态可能是格子上的每个点了,状态转移方程肯定就是每个点可以到达的每个点了。但是数量很大,因此状态转移的每一步均要取模,同时初始化的时候我搞错了,并不是所有的地方都初始化为0,而是除了起点之外的其他点初始化为0,起点初始化为1.#include <cstdio>#include <cstring>#include <iostream>#include

2016-07-07 14:29:10 254

原创 HDU 1078 FatMouse and Cheese

题目分析 这道题跟poj上面的滑雪是一样的题目,但是这道题改变的地方有,每一次可以移动k步,而不是一步,很明显多加一重循环就可以了,同时那道题求得是递减的长度,这道题求得是递增得到的最大数量的奶酪。直接记忆化搜索就可以了。#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using nam

2016-07-07 11:06:44 233

原创 HDU 3371 Connect the Cities

题目分析 简单的最小生成树的题目,首先这道题我超时了n次,但是因此也知道了,当图为稠密图的时候需要注意是否超时,改进了之后982ms险过,但是用prim的话时间复杂度低一点,因此大家要注意。#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;int f

2016-07-07 10:24:06 187

原创 HDU 1879 继续畅通工程

已经修好的路一定要往里面加#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;struct Edge{ int from,to,dist,status; bool operator < (const Edge temp)const

2016-07-06 22:51:52 224

原创 HDU 1829 A Bug's Life(基础种类并查集)

题目分析 基础的种类并查集,一直想写,但是苦于不会,今天找了个简单的练手。种类并查集除了需要维护fa[]数组,同时还要维护关系数组,这里面只有2种关系,一种是互斥,一种是不互斥,这样已经很明显了,我们用re数组中的数字来表示与根的关系,为0是与根互斥,为1与根不互斥,这样我们还需要在状态压缩的时候同样维护re数组,这样就做出来了。#include <cstdio>#include <cstr

2016-07-06 20:11:15 285

原创 杭电数论入门习题

HDU 1973 Prime Path 这道题是一道从起点到终点的问题,很明显可以用广搜搜索最小步数即可,同理也可以用最短路,但是需要建边,时间复杂度低。#include <cstdio>#include <queue>#include <cmath>#include <cstdlib>#include <cstring>#include <iostream>using names

2016-07-05 21:28:01 297

原创 HDU 4405 Aeroplane chess

题目分析 普通的概率dp,很明显 for(int k = 1; k <= 6; k++) dp[i] = 1.0*dp[i+k]/6.0; 但是这道题因为有飞行棋的飞行线,我们可以用一个fa数组存一下,写状态转移方程时一旦其有父亲节点,那么该点的期望等于父亲节点的期望。#include <cstdio>#include <vector>#include <cstrin

2016-07-04 20:11:41 278

原创 HDU 4939 Stupid Tower Defense

题目分析 这道题真是很巧妙,首先而言红塔放最后面肯定是最好的,这点不用说大家也明白。那么这样就可以枚举红塔的数量来写出状态转移方程。假设有蓝塔加绿塔一共i个,其中蓝塔的数量为j个,那么就可以得到状态转移方程了,细节请看代码。注意这道题有可能超int。#include <cstdio>#include <cstring>#include <iostream>#include <algori

2016-07-04 16:54:01 286

原创 HDU 3466 Proud Merchants

题目分析 这道题一眼看上去就知道是一个01背包问题,但是需要预处理一下才行,每个背包均有P,Q,V3个属性,但是我们需要怎样选择呢,加入有2个物品,A(P1,Q1,V1),B(P2,Q2,V2)。很明显先买A后买B需要P1+Q2,先买B后买A需要P2+Q1,很明显选择2者之中价格小的,加入前者小于后者,那么P1+Q2#include <cstdio>#include <cstring>#in

2016-07-04 10:00:34 315

原创 动态规划求最大子矩阵详解(hdu 1505,1506 , 2870)

动态规划求最大子矩阵 对于hdu 1505,1506,都是求关于最大子矩阵的问题,因为n为1000,n^3必然超时,因此需要优化,这类题应用了一种特殊的优化算法使时间复杂度降到了n*n。优化算法 因为求最大子矩阵,都需要求最左边比该点高的位置,最右边比该点高的位置。因此就先假如我们现在我们求l[n],很明显现在l[1……n-1]都已经求出来了,那么我们就可以利用前面求得的对其进行优化,同理

2016-07-03 11:24:55 422

空空如也

空空如也

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

TA关注的人

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