自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 HDU 5175 Misaki's Kiss again (数学)

题意:求0到N-1中,有多少数m满足gcd(N,m)=N^m思路点击打开链接:令M = N xor K,原式:gcd(N,N xor K) == N xor (N xor K) == K 由此我们可以发现K是N的约数,找到所有N的约数,判断是不是满足那个等式即可,因为是异或运算,结果可能比约数本身大,如1xor2==3,还有异或出来结果等于0的舍掉,gcd(n,n) !=

2017-07-31 22:25:34 351

原创 HDU 1027 Ignatius and the Princess II(逆康托展开)

题意:给你一个n,让你求n的全排列中第m小的序列。(n, m 思路:逆康托展开 (知识见:点击打开链接)代码:#include#include#include#includeusing namespace std;const int maxn = 10;int fac[maxn] = {1, 1};bool vis[100005];void init(

2017-07-29 20:30:11 325

原创 2017 Multi-University Training Contest - Team 2 1009 HDU 6053 TrickGCD(分段 容斥)

题意:给你n个数字,每个位置的数可以小于等于a[i],求所有区间gcd(l,r)都满足大于等于2的方案数思路:我们可以枚举gcd,然后a[i]/gcd就是i位置能够填的数的个数,然后每个位置累乘起来就能得到数列为gcd时的方案数。但是这样是n^2复杂度,显然会T,因为a[i]/cgd有许多是相同的,我们可以将相同的一起考虑,这可以用前缀和和快速幂解决。这样算完之后显然计算了许多

2017-07-28 14:29:28 727

原创 POJ 2411 Mondriaan's Dream (状压DP)

题意:用1*2的矩形拼成和h*w的矩形有几张拼法.(h, w 思路:用1表示该处竖着放一块砖,用0表示横着放的砖,或者竖着放的第二行。一行中每个未放竖的矩形区间中的0数量一定要是2的倍数。这样从第一行递推到第h行,最后答案是dp[h][0],因为前i-1行状态确定最后一行的状态也就确定。代码:#include#include#includeusin

2017-07-26 20:18:06 328

原创 HDU 4427 Math Magic(DP)

题意:告诉你K个数的和为N,K个数的LCM为M,问有多少满足条件的解。(N, M 思路:dp[i][j][k]表示长度为i 和为j lcm为k的方案数。可以推出状态转移方程dp[i+1][j+x][lcm(k, x)] += dp[i][j][k]因为三维存不下,所以需要滚动数组,还有枚举x的时候只要枚举M的因子即可。为了节约时间可以预处理范围内的任意两数的lcm。

2017-07-26 17:18:25 335

原创 HDU 4430 Yukari's Birthday (枚举 二分)

题意:要在一个蛋糕上放置n个蜡烛,摆成r个同心圆,第i个个同心圆的糖果数为k^i,中间圆心可以放一个蜡烛也可以不放,让你求r和k,使得r*k最小,若有多个答案输出r最小的那个。(n=2)思路:根据等比数列求和公式我们可以知道k*(1-k^r) / (1-k) = n或n+1,我们可以发现r最大才40,所以我们可以枚举r,这样r确定,和就满足k的单调性,这样可以二分来确定k是否存

2017-07-26 15:28:03 337

原创 HDU 4427 Conquer a New Region(思维 并查集)

题意:给你n个点,n-1条带权无向边(一棵树),定义两点之间的承载能力是他们之间路径上的最小承载能力。找出一点,使得其余n-1个点到该点的承载能力之和最大。思路:因为a和b之间的承载能力是它们之间承载量的最小值,所以先将边按承载量从大到小排序。每次合并A,B两个集合时,它们之间的承载量为当前最小,假如A合并到B,则和为sum[A]+cnt[B]*w, B合并到A为sum[B]+

2017-07-26 13:51:52 376

原创 HDU 4311 Meeting point-1 (思维)

题意:给你n个点,让你选一个点,让其他所有点到这个点的距离总和最小。(n 思路:我们可以知道其他点到一个点的距离和为∑(abs(xi-x)+abs(yi-y)),x和y可以分别考虑最后再加起来,然后对x排序这样就可以对某点左边和右边分别考虑,然后就可以把绝对值符号去掉了。例如第i个点,左边为xi*(i-1)-sumx[i-1],右边为sumx[n]-sumx[i]-xi*(n-

2017-07-25 21:17:17 383

原创 2017 Multi-University Training Contest - Team 1 1006 Function(思维 循环节)

题意:给你一个序列a,是0到n-1的一个排列,给你一个序列b,是0到m-1的一个排列,问你有多少种不同的函数关系满足:f[i] = b[f[a[i]]] (0 官方题解:考虑置换 aa 的一个循环节,长度为 ll ,那么有 $f(i) = b_{f(a_i)} = b_{b_{f(a_{a_i})}} = \underbrace{b_{\cdots b_{f(i)}}}_{l\te

2017-07-25 19:38:05 765

原创 2017 Multi-University Training Contest - Team 1 1002 Balala Power!(贪心)

题意:给你n个由小写字母组成的字符串,让你给26个字母分配0-25,每个字符串形成一个26进制的数字,问怎么分配权值这n个数的和最大。(不能有前导0,但是单个0可以)官方题解:每个字符对答案的贡献都可以看作一个 26 进制的数字,问题相当于要给这些贡献加一个 0 到 25 的权重使得答案最大。最大的数匹配 25,次大的数匹配 24,依次类推。排序后这样依次贪心即可,唯一注意的是不能

2017-07-25 18:01:43 1339 8

原创 HDU 5441 Travel (并查集 离线处理)

题意:给你n个点,m条带权边,现在q次询问,每次询问给你一个val,让你求有多少对点能相连且路径上最大权不能超过val。(ab和ba算两对)(n思路:把每条边按权值从小到大排序,按每次询问val值从小到大排序,枚举询问时,不断加上求得每次加一条边后新产生的点对。用一个数组num[i],来记录i这个联通块的点的数量。每次两个联通块相连,新增加的点对数为num[a]*num[b

2017-07-23 23:45:57 419

原创 HDU 4417 Super Mario(树状数组离线处理 or 主席树)

题意:给你n个数,m次询问,每次询问求[L, R]区间内小于等于h的数的个数。(n,m 思路:树状数组:要求比h小的,我们可以对hi和ai从小到大排序,每次都将比查询的hi小的插入树状数组或线段树,插完后询问,然后继续插入比hi+1小的,在询问........跟点击打开链接做法类似。主席树:跟求区间第k大做法一样,只需要修改一下query函数即可,类似线段树求区间和。

2017-07-23 21:28:05 544

原创 SPOJ DQUERY(树状数组离线处理 or 主席树 区间不同数个数)

题意:n个数,m个询问,问区间[l, r]中有多少个不同的数。思路:树状数组:先将所有查询按区间右端点从小到大排序,如果一个数已经出现过就先把以前位置上的删掉然后在新的位置上插入,这样[l,r]中重复的就只计算了一次 。主席树:因为主席树同时维护好多树,所以可以在线上解决,思路与树状数组基本一模一样,如果这个数出现过,就在上次出现的地方删去,在这重新添加。树

2017-07-23 19:40:22 881

原创 ZOJ 2112 & BZOJ 1901 Dynamic Rankings(主席树 单点更新 区间第K大)

题意:有n个数,m次操作,操作有两种:Q l r k :查询区间[l, r]中第K大的数C i v   :将第i个数改为v思路 :在静态主席树上增加了一个单点更新操作。见博客(点击打开链接)每次更新一个数,需要更新的是T[i], T[i+1]... ...T[n](该数所在的树以及它后面的所有树)因为每棵树T[i]所记录的都是前缀(1到i的数出现

2017-07-23 19:15:32 357

原创 POJ 2104 & HDU 2665 & POJ 2761 K-th Number (主席树入门题 区间第K大)

题意:给你n个数,m次操作,每次操作询问区间[l, r] 中第K大的数。(n、m 思路:主席树模板题 (主席树知识:点击打开链接)代码:#include#include#include#includeusing namespace std;const int maxn = 1e5+5;int a[maxn], Hash[maxn];int lson[max

2017-07-23 19:06:46 416

转载 主席树详解

看了一些博客,觉得这两篇比较好吧:点击打开链接点击打开链接(文字是复制粘贴的第二篇博客的)主席树搞了一个多星期TAT,,,,,,也只是大致领悟而已!!!主席树又称函数式线段树,顾名思义,也就是通过函数来实现的线段树,至于为什么叫主席树,那是因为是fotile主席创建出来的这个数据结构(其实貌似是当初主席不会划分树而自己想出来的另一个处理方式。。。。是不是

2017-07-23 15:48:55 4719 3

原创 西电OJ 1038 裁玻璃(状压DP)

题意:给你一个n*m的矩阵,有一些格子是好的一些是坏的,问你最多能剪出多少个2*2的正方形。(n,m思路:正好前几天做过炮兵布阵,跟那题很类似(点击打开链接),注意判断下地形和状态是否冲突,地形和地形是否冲突,因为是2*2的,所以跟三个方向有关和自身位置4个地方不能冲突。注意预处理合法状态时枚举到1可,因为两边肯定有一个不行(因为假如1标志的是2*2的右下角,那么最左边的不可能

2017-07-21 00:33:03 696

原创 第七届福建省赛 FZU 2267 X(floyd)

题意:给你n个城市,m条边,(n 思路:城市数量比较少,所以可以用floyd,每次松弛的时候i-j之间的边可以舍弃。注意细节比较多,重边得去掉,松弛的时候如果没有两点之间没有直接边或者这条边已经去掉过,不能计数。代码:#include#include#includeusing namespace std;const int maxn = 105;const

2017-07-20 20:20:09 603

原创 第七届福建省赛 FZU 2267 The Bigger the Better(贪心 后缀数组)

题意:给你两个数组,让你将这两个数组合并成一个数组,每个数组的内部顺序不能改变,让你求合并能得到字典序最大的数组。(n思路:正常的贪心的思路是用两个指针从两个开头开始比较,谁大谁先放,但是问题在于碰到两个相等的时候谁先放,思路是往后找第一个不相等的,谁的大谁先,但是这样会n^2复杂度。我们可以利用后缀数组将两个数组合并(中间位置要放0,比如 1 1 X 1 1 2比较后应该

2017-07-20 19:16:32 970

原创 FZU 2218 Simple String Problem(状压DP)

题意:给你一个长度为n的字符串,仅包含前k个小写字母,求两段子串A和B,A和B中间没有共用的字母类型,求len(A)*len(B)的最大值。(n思路:状态压缩dp(点击打开链接) * n^2的复杂度,求出每个状态( 1<<n )所能达到的最大长度。 * dp,求出字母种类小于等于当前state所能达到的最大值(因为可能包

2017-07-19 23:39:13 363

原创 Lightoj 1037 Agent 47(状压DP)

题意:你现在需要消灭n个敌人,n个敌人的血量已知,你的普通攻击力为1,但是如果你杀死敌人i可以用它的武器去杀死其他敌人,p[i][j] 表示用敌人i的武器射杀敌人j会减p[i][j]滴血.问你最少可以攻击多少次可以将敌人杀死。思路:点击打开链接定义集合s为死亡敌人的集合。dp[s] 为让集合为s的人死亡最小需要的攻击次数。如果现在想要消灭敌人i 并且敌人

2017-07-19 22:37:16 279

原创 POJ 1185 炮兵布阵 (经典状压DP)

题意:一个n*m矩阵(n互相攻击。每个炮的攻击范围是上下左右两个距离。思路:(点击打开链接)可以发现,对于每一行放大炮的状态,只与它上面一行和上上一行的状态有关,每一行用状态压缩的表示方法,0表示不放大炮,1表示放大炮,同样的,先要满足硬件条件,即有的地方不能放大炮,然后就是每一行中不能有两个1的距离小于2(保证横着不互相攻击),这些要预先处理一下。然后就是状态表示和转移的

2017-07-19 21:21:47 744 1

原创 POJ 3254 Corn Fields(状压DP入门)

题意:一个m*n(m, n 要求两个相邻的方格不能同时放牛,即牛与牛不能相邻。问有多少种放牛方案(一头牛都不放也是一种方案)思路:可以看代码中的注释。转移方程:dp[i][sta] = ∑(dp[i-1][sta']) (sta‘为与sta不冲突的状态)带注释代码:#include #include using namespace std;#define m

2017-07-19 17:05:57 309

原创 Lightoj 1011 Marriage Ceremonies(状压dp入门 or km板子)

题意:给你n*n的矩阵,a[i][j]代表第i个男人和第j个女人之间的满意度,求男女一一配对后,最大的满意度之和。(n思路:可以直接套KM板子,n^3复杂度,因为n比较小,也可以用状压做,n^2*2^n复杂度转移方程:dp[i][sta|(1代码:#includeusing namespace std;const int maxn = 17;int dp[ma

2017-07-19 13:10:30 429

原创 HDU 5769 Substring (后缀数组)

题意:给你一个字符c和一个字符串s,问你s的所有不同子串中有多少个子串含有c。思路:做过求不同子串个数打开链接,是∑n-sa[i]-height[i], 现在要求子串中含有c,无非是每次计算从含有c的前缀开始计算。预处理记录下每个位置向后最近的c的位置。这样答案就是∑n-max(p[sa[i]], sa[i]+height[i])代码:#include#i

2017-07-19 12:47:53 410

原创 POJ 3693 Maximum repetition substring(重复次数最多的连续子串 字典序最小)

题意:给你一个字符串(len思路:求重复最多好计算,直接题目有做到(点击打开链接)但是要输出一个字典序最小的一开始没弄明白。首先存起来最多次数可能的长度,然后枚举sa数组,取到的第一组,肯定是字典序最小的。但是怎么算取到? 就是LCP(sa[i]+1, sa[i]+1+len) >= (ans-1)*a[j],即这一段重复达到了最多次。代码:#inclu

2017-07-18 18:11:03 486

原创 POJ 2406 Power Strings(KMP or 后缀数组 dc3板子)

题意:给出一个字符串 问它最多由多少相同的字串组成 思路:有简单的KMP解法点击打开链接也可以拿KMP做,n枚举长度i,如果长度i的子串刚好是重复了len/i次,要满足len % i == 0和rank[0] - rank[i] == 1 和height[rank[0]] == len-i(sa[0]与sa[i]的lcp为len-i)。字符串abab:ababa

2017-07-18 15:21:16 383

原创 SPOJ SUBST1 New Distinct Substrings(不同的子串个数)

题意:给你一个长度为n的字符串,问你有几个不同的子串.如 ABABA: len=1 : A,Blen=2 : AB,BAlen=3 : ABA,BABlen=4 : ABAB,BABAlen=5 : ABABA共9个。思路:所有的子串都是后缀的前缀,即所有子串的数目就是所有后缀的长度和。(跟枚举子串起点终点一样)、总个数减去重复的即为答案,计算重复的可以

2017-07-18 13:19:07 608

原创 hihoCoder 1419 后缀数组四·重复旋律4(重复次数最多的连续子串)

描述小Hi平时的一大兴趣爱好就是演奏钢琴。我们知道一个音乐旋律被表示为长度为 N 的数构成的数列。小Hi在练习过很多曲子以后发现很多作品中的旋律有重复的部分。我们把一段旋律称为(k,l)-重复的,如果它满足由一个长度为l的字符串重复了k次组成。 如旋律abaabaabaaba是(4,3)重复的,因为它由aba重复4次组成。小Hi想知道一部作品中k最大的(k,l)-重复旋律。解题方法

2017-07-18 00:20:44 533

原创 hihoCoder 1415 后缀数组三·重复旋律3(最长公共子串)

描述小Hi平时的一大兴趣爱好就是演奏钢琴。我们知道一个音乐旋律被表示为长度为 N 的数构成的数列。小Hi在练习过很多曲子以后发现很多作品中的旋律有共同的部分。旋律是一段连续的数列,如果同一段旋律在作品A和作品B中同时出现过,这段旋律就是A和B共同的部分,比如在abab 在 bababab 和 cabacababc 中都出现过。小Hi想知道两部作品的共同旋律最长是多少?解题方法提示

2017-07-17 20:47:33 465

原创 hihoCoder 1407 后缀数组二·重复旋律2 && POJ 1743 Musical Theme(最长不可重叠重复子串问题)

hihoCoder 1407:描述小Hi平时的一大兴趣爱好就是演奏钢琴。我们知道一个音乐旋律被表示为长度为 N 的数构成的数列。小Hi在练习过很多曲子以后发现很多作品自身包含一样的旋律。旋律可以表示为一段连续的数列,相似的旋律在原数列不可重叠,比如在1 2 3 2 3 2 1 中 2 3 2 出现了一次,2 3 出现了两次,小Hi想知道一段旋律中出现次数至少为两次的旋律

2017-07-17 20:07:10 559

原创 hihoCoder 1403 后缀数组一·重复旋律(最长可重叠重复子串问题)

描述小Hi平时的一大兴趣爱好就是演奏钢琴。我们知道一个音乐旋律被表示为长度为 N 的数构成的数列。小Hi在练习过很多曲子以后发现很多作品自身包含一样的旋律。旋律是一段连续的数列,相似的旋律在原数列可重叠。比如在1 2 3 2 3 2 1 中 2 3 2 出现了两次。小Hi想知道一段旋律中出现次数至少为K次的旋律最长是多少?解题方法提示输入第一行两个整数 N和K。1≤N≤

2017-07-17 19:17:52 717

转载 后缀数组详解

转自:点击打开链接为什么学后缀数组后缀数组是一个比较强大的处理字符串的算法,是有关字符串的基础算法,所以必须掌握。 学会后缀自动机(SAM)就不用学后缀数组(SA)了?不,虽然SAM看起来更为强大和全面,但是有些SAM解决不了的问题能被SA解决,只掌握SAM是远远不够的。 ……有什么SAM做不了的例子? 比如果求一个串后缀的lcp方面的应用,这是SA可以

2017-07-17 16:29:07 704

原创 Educational Codeforces Round 25 E. Minimal Labels(拓扑排序)

题意:给你n个点,m条边的有向无环图,要求给n个点赋值1至n,每条边u->v要求val[u]思路:跟HDU 4857基本一样.点击打开链接代码:#includeusing namespace std;typedef long long ll;const int INF = 0x3f3f3f3f;const int maxn = 1e5+5;int du

2017-07-17 08:53:26 334

原创 2017 四川省赛 L.Nice Trick(递推 DP)

思路:方法一:因为已经告诉你了n个取3个的乘积和,所以可以利用这个公式递推,ans[i] = ans[i-1]+S(i-1,3)*a[i]方法二:设 f(i, j) 表示在前 i 数里面挑 j 个乘起来的总和,那么f(i, j) = f(i − 1, j) + f(i − 1, j − 1) × ai方法一代码:#include#include#incl

2017-07-16 22:17:17 771

原创 2017 四川省赛 D.Dynamic Graph (思维 拓扑排序 bitset优化)

题意:有n个点m条边的有向无环图,初始时所有点都是白色,现在q次询问,每次询问将一个点x变为相反的颜色(白->黑,黑->白)后,求有多少对白色点之间存在路径,且路径上的点都是白色的。思路:方法1:为了统计有多少点能到当前点,可以由之前的点递推过来,这样就想到了拓扑排序。递推转移的过程可以用bitset优化。bit[i][j]表示i能到j,u传递到v只需要bit[v[

2017-07-16 21:30:59 511

原创 HDU 4442 Physical Examination (贪心)

题意:要参加一场考试,有n个科目,每个科目就是一个考试队列,每个科目队列有如下两个属性,a,b,那么该科目的消耗时间=a+b*(不在该队列排队的时间);问给出n个科目队列,求考完所有科目总耗时最少是多少。思路:假设有x y两个科目,怎样安排先后顺序呢,假设x在前, 时间为ax+ay+ax*by,假设y在前, 时间为ay+ax+ay*bx, 要让x在前的条件是ax+ay+ax*b

2017-07-15 23:53:35 297

原创 BZOJ 1257 余数之和sum (思维 数学 分段)

Description给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值,其中k mod i表示k除以i的余数。例如j(5, 3)=3 mod 1 + 3 mod 2 + 3 mod 3 + 3 mod 4 + 3 mod 5=0+1+0+3+3=71思路:=∑k mo

2017-07-15 23:13:43 506

原创 Codeforces Round #424 (Div. 2) E. Cards Sorting(思维 树状数组)

题意:有n张牌,每张牌上有一个数,每次从牌顶取一张牌,如果这张牌是剩余牌中的最小值那么就把它扔掉,不然放到牌堆底,问多少次操作才能把牌扔光。思路:树状数组维护每个位置的牌是否存在,这样就能logn计算两个位置之间牌数,一共只有1e5个数,这样我们就可以从1开始枚举模拟(一开始开一个1e5的vector把每个数的下标存进去),如果存在这个数,就从当前位置把所有的这个数拿完,记录维

2017-07-15 15:15:43 374

原创 Codeforces Round #424 (Div. 2) D. Office Keys(贪心 二分 or DP)

题意:有n个人和k把钥匙(n=n),n个人都必须拿一把钥匙去p点,一把钥匙不能多人拿。问最后每个人都到达p点最少需要多少时间。思路:对人和钥匙都排序一下,然后有两种做法:1.二分答案 贪心验证:每次尽量取左边的钥匙2.DP:转移方程:dp[i][j] = min(dp[i][j-1], max(dp[i-1][j-1], abs(a[i]-b[j])+abs(b[j]-

2017-07-14 23:31:17 468

空空如也

空空如也

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

TA关注的人

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