自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 HDU - 1408 FFT模板题

题意:两个大数相乘。思路:这题是典型的FFT。所谓FFT,也就是快速傅里叶变换,是一种加速两个多项式系数相乘的算法,可以通过插值表示多项式的思想,将多项式从系数形式转化成点值形式,点值形式的多项式相乘只需要O(n),而FFT的关键就在于点值形式和系数形式之间的相互转化,可以利用分治的思想达到O(logn)的复杂度。关于FFT的详细推导可以学习算法导论第30章。一个题目如果需

2017-03-20 20:44:04 875

原创 hihocoder - 1483 二分 + 尺取法

题意:给出n个数,然后定义一个v(l,r)为下标区间[l,r]中相同的点对数,如对于1,1,1这个序列来说,v(1,2)=1,v(1,3) =3,v(1,1)=0。要求所有n*(n+1)/2个区间的价值第k小的是多少。思路:这题没做出来确实不应该。想到了尺取法,结果没想出来二分验证来找第k小的。二分答案x=(l+r)/2,每次判断价值能大于x的区间有多少个,如果这个数目大于n*

2017-03-19 17:30:40 633

原创 HDU - 5728 欧拉函数 + 数学推导 + 指数循环节

题意:已知:其中n是一个没有重复质因子的数,而φ(x)就是欧拉函数。求解ans的值。思路:首先要知道欧拉函数的公式:其中,p1到pn是x不重复的质因子。根据这个公式以及定义,很容易能推导出欧拉函数的几个性质:有了这些准备就可以求k了,假设p是n的其中一个质因子,将i分成两个部分,i%p!=0和i%p=0,那么就可以进行如下推导:关于上式中

2017-03-19 15:32:51 733

原创 HDU - 5727 暴力 + 二分图匹配

题意:给出n个阳珠子和n个阴珠子,排成一个环,要求相邻的两个珠子不能同阴或同阳。另外给出m个关系(u,v),如果阳珠子u和阴珠子v相邻就会褪色一次。问最有情况的组合最少褪色几次。思路:二分图匹配,暴力枚举所有阴珠子的排列,因为是环形所以又(n-1)!种情况,然后针对每一种排列,往相邻的两个阴珠子中插入阳珠子,插入的位置一共有n个,如果一个阳珠子不会和前一个以及后一个阴珠子产生褪色,那么

2017-03-18 11:25:06 372

原创 HDU - 5726 RMQ + 二分

题意:给出一串n个数的序列,然后给q个询问,每个询问查询在下标区间[l,r]的数的gcd是多少,然后问这n个数中有多少个区间的gcd等于这个询问的gcd。思路:求解gcd,没有修改操作,可以想到用RMQ,可以O(1)查询。剩下的是怎么求每个gcd对应有多少个区间。从左向右枚举左端点,那么可以发现左端点l固定的情况下,gcd会随着向右而不递增。这就有了二分的性质,我们二分出每个gcd

2017-03-17 21:06:32 319

原创 HDU - 5724 博弈sg函数 + 状态压缩

题意:给出n行格子,每行格子长度为20,现在每一行的某些格子里都会放上一枚棋子,现在A和B要轮流移动这些棋子,每个棋子只能向右移动最近的一个空的格子上,而且两个棋子不能占用同一个格子,若谁不能移动就是输,在双方都采取最优策略的情况下,问谁赢谁输。思路:博弈,sg函数的一种应用,由于每行只有20个格子,可以考虑状态压缩。这里sg函数可能的取值只有0到19,因为每一行的格子最多只有20个,

2017-03-17 18:21:50 371

原创 HDU - 4388 博弈 + 找规律

题意:给出n堆物品,每堆物品都有若干件,现在A和B进行游戏,每人每轮操作一次,按照如下规则:1. 任意选择一个堆,假设该堆有x个物品,从中选择k个,要保证02. 再增加一个大小为x^k的堆,另外有一个技能,可以将这个大小为x^k的堆变成(2*k)^x的堆,但是这个技能每个人只有一次机会可以使用。现在问两人轮流操作,都采取最优策略,最后不能操作的人输,问谁会赢。思路:好题。看

2017-03-17 16:20:31 1048

原创 HDU - 2174 博弈基础

题意:一个n*m个格子的棋盘上在(1,m)位置上有一枚棋子,这枚棋子每次可以向下,或向左,或向左下角移动一格,a和b进行移动棋子的游戏,a先移动,最后无法移动的人输,问在两个人都是最优操作的情况下,最后谁会赢。思路:为了方便考虑,我们定义棋子先(n,m)移动到(1,1),f[1][1]就是终结点,也就是必败点。最后的答案就是f[n][m],然后根据必胜点和必败点的规则,依次往后递推

2017-03-16 12:13:31 588

原创 HDU - 5723 最小生成树 + 树形dp

题意:给出n个点和m条边,每条边有一个权值,题目保证每条边的权值都不一样,求出一个权值最小生成树,并且求出任意选择n个点中的两点之间距离的权值的最小期望。思路:最小生成树没什么好说的,因为每条边权值不一样,所以可以保证求出的最小生成树一定只有一个解。按照求出的最小生成树建一棵树,所谓期望=任意两点之间的距离和/C(n,2),这样只要求出任意选择两个点的所有情况的距离和即可,dp一下。

2017-03-16 10:31:53 416

原创 HDU - 5521 最短路 + 建图

题意:给出n个点的一个图,每个点属于一个块或者几个块,保证第i块内的点都可以用时间ti互相到达,现在A在点1,B在点n,他们要找一个点开会,会议必须要双方都到场才能开始,问会议最快能需要多长时间能开始,另外按升序输出保证时间最小的可选择的开会的点的序号。思路:主要是考建图,暴力建图是不行的,这里每个块建立一个中转点,让中转点和该块内的所有点都连上长度为t的边,这样每次从一个点到达块

2017-03-15 19:13:29 364

原创 HDU - 5510 KMP + 尺取法

题意:给出n个字符串s[1]到s[n],找到最大的编号i,使得s[i]之前的字符串中存在至少一个不是s[i]的子串。思路:好题。kmp是一定的。利用尺取法的思想,设置两个指针l和r,那么对于s[l]和s[r]就存在两种情况:1. s[l]是s[r]的子串,那么++l2. s[l]不是s[r]的子串,那么更新ans=r,然后++r之所以不考虑l之前的字符串,是因为按照

2017-03-15 18:23:00 436

原创 hihocoder - 1479 树形dp

题意:给出一个有根树,每个节点都有一个权值,在其中选出不是根节点的两个节点,将这两个节点与其父亲之间边删去,可以将这棵树分成三个部分,求一共有多少种分法,可以让这三个部分的权值和相等。思路:这题一开始看错了题怎么都过不了,题目中说父亲节点为0的就是根节点,而我看成了0就是根节点,最后看别人代码才发现自己题读错了,太蠢。树形dp,很显然如果存在这样的分法,所有节点的权值总和sum

2017-03-15 15:23:22 487 2

原创 HDU 5714 树状数组 + 离散化

题意:Problem Description小明在旅游的路上看到了一条美丽的河,河上有许多船只,有的船只向左航行,有的船只向右航行。小明希望拍下这一美丽的风景,并且把尽可能多的船只都完整地拍到一张照片中。小明位于河的边上,并且可以在河边的任意位置进行拍照,照相机的视野恰好为90度角,只能以垂直于河边的方向进行拍照。河上的船只全都可看作是平行于河边的一条线段,跟河边的距离各不

2017-03-10 16:46:19 426

原创 51nod - 1672 线段树(插队问题变形)

题意:给出n个数,再给出m个区间,要求从中选择k个区间,要求k个区间的所重合的部分的和的最大值。思路:线段树。首先先将n个数按照右端点排序,然后从n到1枚举每个位置作为最后并出来区间的右端点,对于每个确定的右端点R,我们就是要找到一个L保证[L,R]这段区间至少能被k个区间所覆盖。当枚举到位置pos的时候,就是要找区间右端点r >= pos,且区间左端点l 这里就可以利用线

2017-03-09 21:35:46 555

原创 POJ - 2828 线段树(插队问题)

题意:每个人选择一个位置进入队列,后来的人会插到先来的人前面,问最后队伍上每个人的编号是多少。思路:插队问题,线段树单点更新,后来的人更有主动权,所以只要倒着考虑即可。然后每次插入到当前队列的第p[i]个空位上,sum[i]表示前i个位置中还有多少个空位。代码:#include #include #include using namespace std;#define

2017-03-09 20:26:57 446

原创 51Nod - 1821 思维题 + 并查集 + 二分

题意:一个集合S的优美值定义为:最大的x,满足对于任意i∈[1,x],都存在一个S的子集S',使得S'中元素之和为i。给定n个集合,对于每一次询问,指定一个集合S1和一个集合S2,以及一个数k,要求选择一个S2的子集S3(|S3|(集合元素可以重复)Input第一行一个数n,(n<=1000)接下来n行,每行描述一个集合:第一个数m,表示集合

2017-03-08 16:43:24 514

原创 HDU - 3585 最大团 + 二分

题意:给出n个点,要求在其中找到k个点,使得任意两个点的最短距离最大。思路:最大化最小值,很明显要二分答案判断是否可行,关键是判断可行的方案,直接对于这n个点求一个最大团,这个团满足任意两个点的距离都要大于等于当前二分的答案,看这样求出的最大团的大小是否大于等于k。代码:#include #include #include #include #include

2017-03-06 18:25:30 377

原创 HDU - 5952 暴力dfs

题意:在一个图中计算大小为s的团有多少个。思路:直接暴力搜索,但是要注意搜的过程很显然会出现重复,这时候我们搜索的时候其实可以选择每次新加入的点要比当前的已经完成的子图中的点要大,这样就可以避免枚举的时候出现重复,既然这样可行,我们可以换一种思路,直接在建图的时候只保存由小点指向大点的单向边即可,很巧妙。代码:#include #include #include #inc

2017-03-06 16:37:38 483

原创 ZOJ - 1492 dfs剪枝求最大团

题意:要求一个不超过50个点的图中最大完全子图(团)的大小。思路:dfs + 剪枝 + 记忆化学习了这篇博客的思路:http://www.cnblogs.com/zhj5chengfeng/archive/2013/07/29/3224092.html所谓团,就是一个完全子图,也就是在一个图中找到一个子图,满足任意子图中两个点都有边相连,最大团顾名思义就是点最多的团。N

2017-03-06 16:27:59 1009

原创 51Nod - 1478 单调栈 + 二分

题意:找出一串括号序列中的最长的合法子串的长度以及数目。思路:如果对于括号序列,'('表示+1,')'表示-1,一串合法的括号序列要保证这样的前缀和序列首尾都是0,且序列中间的前缀和值不能小于0。对于这道题来说,找到每个前缀和sum[p]之后与之相邻最远的且相同的前缀和的位置q,那么[p+1,q]这一段就是以这个p+1开头的最长的合法括号序列。这里可以对于每个位置p利用单调栈求

2017-03-05 12:43:21 338

原创 CF - 776D 2-SAT

题意:n个门,每个门有一个初始的状态,或开或锁,有m个开关,每个开关都能控制若干门的状态,题目保证每个门一定会受到两个开关的影响。问是否有可能让所有门都开。思路:2-SAT,对于开关来考虑,每个开关要么开要么关,两种状态true和false,设xi为true就是开关i打开,xi为false就是开关i关闭,对每个门来说,如果一开始就是打开,那么变化量就要为0,若这个门受到开关i和j的控制

2017-02-24 10:05:03 618

原创 CF - 617E 莫队算法 + 分块

题意:给出n个数的序列,给出m个区间[L,R]的询问,问在[L,R]中有多少段子区间的异或和等于k。思路:莫队算法,先保存前缀异或和,然后对于每次从[L,R]转移到[L,R+1]只需要O(1)的时间,只需要知道sum[R^k]有多少即可,因为每个数都不大,可以直接开一个数组保存。另外这题的莫队需要分块处理,否则还是T。代码:#include #include #incl

2017-02-23 21:29:09 593

原创 51Nod - 1376 dp

题意:数组A包含N个整数(可能包含相同的值)。设S为A的子序列且S中的元素是递增的,则S为A的递增子序列。如果S的长度是所有递增子序列中最长的,则称S为A的最长递增子序列(LIS)。A的LIS可能有很多个。例如A为:{1 3 2 0 4},1 3 4,1 2 4均为A的LIS。给出数组A,求A的LIS有多少个。由于数量很大,输出Mod 1000000007的结果即可。相同的数字在不同的位置

2017-02-20 16:57:35 551

原创 HDU - 5794 dp + 容斥思想 + Lucas

题意:一个n*m的棋盘,初始时刻一枚棋子在(1,1)位置,每次他只能从(x,y)移动到(x+1,y+2)或者(x+2,y+1)的位置,棋盘上还有一些障碍点,这些点不能到达,问最后旗子能到达(n,m)的方案数。思路:首先画几个例子,观察旗子能到达的点的规律,统计出规律后发现,能到达的点组成了一个杨辉三角,这时候为了方便处理,进行坐标转换,以杨辉三角最左边的一条边和最右边的一条边作为坐标轴

2017-02-20 15:23:59 345

原创 HDU - 5514 容斥原理

题意:m个石头围成一个环,编号从0到m-1,有n个青蛙在编号为0的石头上开始往后跳,每只青蛙可以从第j个石头跳到第j+a[i]个石头,每个石头只要被青蛙跳到一次,就算被占领(永久),问最后被占领的石头的编号总和是多少?思路:利用巧妙的容斥思想,并不是简单的套用模板。首先能够观察到每个青蛙能跳到的位置是d[i] = k * gcd(a[i], m),但是lcm(d[i], d[j

2017-02-19 21:23:53 692

原创 51Nod - 1407 容斥原理 + dp

题意:有n个整数,问从他们中取出若干个数字相与之后结果是0的有多少组。思路:这道题需要51nod1406作为基础,链接:点击打开链接因为从正面考虑直接求解相与和为0不好做,所以可以利用容斥来解决,因为数的总量就这么大,所以我们在总数中减掉相与和为1的方案数,相与和为2的方案数等等,就可以得到最后的答案,可以用dp求出来对于每一个x都有a[i] & x == x的个数(也就是1406

2017-02-19 18:50:09 1179

原创 HDU - 2222 AC自动机模板题

题意:多个模式串在文本串中匹配。思路:AC自动机模板,AC自动机其实就是KMP与Trie的结合。代码:#include using namespace std;const int SIGMA_SIZE = 26;const int MAXNODE = 500010;const int MAXS = 1e4 + 10;map ms;struct Aho

2017-02-18 15:35:00 384

原创 CF - 665E 字典树

题意:给出一串长度为n的序列,找到有多少个子串的异或和 ≥ k。思路:字典树的套路,因为异或和满足前缀和性质,所以[l,r]区间内的a[i]的异或和就可以表示为sum[r]^sum[l-1],这样构造一个sum的字典树。每次用sum[i]在字典树上爬,同时与k进行每一位的比较,一定要保证sum[i]和它爬的字典树的路径的异或和要≥k,所以异或和的每一位都要≥k的每一位。故分为四种情

2017-02-18 15:09:51 1031

原创 51Nod - 1406 dp

题意:有n个整数。输出他之中和x相与之后结果为x的有多少个。x从0到1,000,000Input第一行输入一个整数n。(1<=n<=1,000,000).第二行有n个整数a[0],a[1],a[2],...a[n-1],以空格分开.(0Output对于每一组数据,输出1000001行,第i行对应和i相与结果是i的有多少个数字。Inp

2017-02-18 11:08:19 924

原创 HDU - 3652 数位dp水题

题意:找到[1,n]中的满足数位上有子串13,且mod13 == 0的数字有多少个。思路:数位dp水题代码:#include #include #include #include using namespace std;typedef long long ll;int a[20];ll dp[20][15][15][2];ll dfs(int pos,

2017-02-14 22:16:55 382

原创 51Nod - 1682 哈希 + 乱搞

题意:中位数定义为所有值从小到大排序后排在正中间的那个数,如果值有偶数个,通常取最中间的两个数值的平均数作为中位数。现在有n个数,每个数都是独一无二的,求出每个数在多少个包含其的区间中是中位数。Input第一行一个数n(n<=8000)第二行n个数,0OutputN个数,依次表示第i个数在多少包含其的区间中是中位数。

2017-02-14 12:05:35 372

原创 HDU - 5536 字典树

题意:给出长度为n的序列s1到sn,以及一个表达式 (si + sj) ^ sk的最大值,^代表异或运算,其中i,j,k不能相同。思路:一个典型的字典树处理异或和的问题,思路就是先将所有si按照二进制位从高到低拆成32位然后储存在字典树中,然后枚举i和j,让s[i]+s[j]在字典树上爬,每一位尽量往与当前位数相反的方向爬,这样最终结果这一位就是1,如果相反方向节点不存在,那么往相同方

2017-02-14 11:29:30 390

原创 HDU - 2087 KMP

题意:从文本串种匹配模式串,要求找到最多有多少个互相不重叠的模式串。思路:这里要求匹配结果相互不重叠,只需要修改一下KMP算法,在每次匹配成功的时候,将j变为0即可。代码:#include #include #include #include using namespace std;const int MAXN = 1005;char s[MAXN], t[MAX

2017-02-14 09:14:59 265

原创 HDU - 1686 KMP裸题

题意:求文本串中有多少个模式串。思路:kmp算法是ac自动机的基础,其实质就是建立一个自动机,让文本串在自动机上运行。其中最关键的就是next数组,对于这个一定要深刻理解。next[i]数组所表达的含义就是对于第i个字符来说,前i-1个字符中最大的前缀和后缀能匹配上的长度。举个例子:abcdabd,最后一个字符d的前缀是abcdab,可以发现这里面最长的能自由匹配的前缀和后

2017-02-14 08:48:11 629

原创 HDU - 4324 拓扑排序

题意:给出n个人的喜欢关系,mp[i][j] == 1表示i喜欢j,规定若a不喜欢b,则b一定喜欢a,问这些关系中是否存在三角恋的关系,即(a->b,b->c,c->a)。思路:题目的要求下,显然任意两个人之间一定有一条单向边,那么可以发现如果存在环,一定至少有一个长度为3的环,画一画就能看出来。所以这道题只需要判断是否存在环即可,可以利用拓扑排序,也可以直接dfs搜环。代码:

2017-02-13 16:15:48 341

原创 HDU - 4568 最短路 + 状压dp

题意:给出一个n*m的方格矩阵。其中某些点有宝藏,每个方格都有一个经过的代价,若为-1则不能经过,现在一个猎人需要将所有宝藏都拿走,他可以从矩阵边界任意的位置进入,也可以从边界上任意位置离开,(但是要注意只能进入和离开各一次),求把所有宝藏拿走的最小代价,如果不能拿走则输出-1。思路:这道题题意很坑,经过实践发现两个坑:1.猎人只能进入矩阵和离开矩阵各一次,否则第二个样例答案就是1

2017-02-13 11:43:26 528

原创 51Nod - 1781 dp + 线段树 + 离散化

题意:Pinball的游戏界面由m+2行、n列组成。第一行在顶端。一个球会从第一行的某一列出发,开始垂直下落,界面上有一些漏斗,一共有m个漏斗分别放在第2~m+1行,第i个漏斗的作用是把经过第i+1行且列数在Ai~Bi之间的球,将其移到下一行的第Ci列。 使用第i个漏斗需要支付Di的价钱,你需要保留一些漏斗使得球无论从第一行的哪一列开始放,都只可能到达第m+2行的唯一 一列,求花费

2017-02-13 09:28:43 440

原创 HDU - 3666 差分约束 + 对数

题意:给出一个矩阵c以及L和U,判断出是否存在两个序列a1,a2...an和b1,b2,..bm,使得满足: a[i] / b[j] * c[i][j] = L思路:查分约束。根据题意可以列出如下的关系式:a[i] / b[j] b[j] / a[i] 这时候利用对数,将除法转化成减法,得到:log(a[i]) - log(b[j]) log(b[j]) - l

2017-02-12 10:10:37 366

原创 HDU - 1384 差分约束

题意:要求选取一个最小的集合,集合中的数满足n个条件,每个条件:在区间[ai,bi]内至少有ci个数备选在了集合里。思路:差分约束,设sum[i]表示在i-1中选取到集合中的数的个数,那么题目的要求就可以描述为如下的关系:sum[a] - sum[b+1] sum[i] - sum[i+1] sum[i+1] - sum[i] 这样就可以转化成关于查分约束的模式了,因为

2017-02-11 21:41:44 452

转载 最短路+差分约束学习笔记

关于最短路和差分约束的写得很全面的一篇博客,转载自:http://www.cppblog.com/menjitianya/archive/2015/11/19/212292.html目录  一、引例      1、一类不等式组的解二、最短路      1、Dijkstra      2、图的存储      3、链式前向星

2017-02-11 21:02:03 798

空空如也

空空如也

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

TA关注的人

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