自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

AC_Arthur的专栏

Always challenge miracles!

  • 博客(555)
  • 收藏
  • 关注

原创 POJ 3164 Command Network(最小树形图)

题目链接:点击打开链接题意:给你一个图 (单向边), 要求你找到一棵树, 根结点是1, 可以从根结点到达其他任意一个结点, 且总权值最小。思路: 模板题。细节参见代码:#include#include#include#include#include#include#include#include#include#include#include#include

2016-03-18 16:56:46 664

原创 HDU 4630 No Pain No Game(线段树离线处理)

题目链接:点击打开链接题意:给你一个n的全排列, q个操作, 每个操作是一个区间,要求求出这个区间中任意两个数的gcd的最大值。思路:一个数是两个数的公约数, 等价于一个数可以被两个整数同时整除。   所以我们可以算出每一个数的所有约数, 然后求一个区间中被超过两个数整除的数中的最大值即可。维护区间最大值, 我们可以用线段树来维护。  因为我们难以同时维护一个区间, 所以我们离线处理,

2016-03-17 11:41:03 1111

原创 HDU 1402 A * B Problem Plus(FFT)

题目链接:点击打开链接题意:求大数 A * B。思路:由于A 和 B太大了, 用java或者大数都会超时。 我们可以用所谓的快速傅立叶变换(FFT)求解多项式相乘的问题。细节参见代码:#include#include#include#include#include#include#include#include#include#include#include#

2016-03-16 19:49:23 953

原创 HDU 5456 Matches Puzzle Game(数位DP)

题目链接:点击打开链接题意:给你n个火柴棍, 要求你恰好用完, 来组成一个一个等式, 等式的形式是a - b = c 。求可以组成的等式个数。思路:很明显的数位DP, 不过巧妙的是, 该题利用了手动模拟大数相加的过程,首先, 我们不妨将等式改成b + c = a, 用d[res][a][b][c] 表示还剩res根火柴, 当前对应位相加之后有没有进位, b和c是否已经停止放火柴棒  的方法

2016-03-15 19:22:38 1383

原创 HDU 3652 B-number(数位DP)

题目链接:点击打开链接题意:给你一个数n, 求从1到n有多少个数满足:包含13这个子串并且可以被13整除。思路:又是一道典型的数位DP水题, 套路是一样的,  用d[i][last][p][cur][res]表示当前到了第i位, 上一位是last, 等于还是小于n, 当前是否已经包含13这个子串, 当前的余数为res的最终答案。 递推即可。细节参见代码:#include#incl

2016-03-14 22:28:10 1199

原创 HDU Bomb(数位DP)

题目链接:点击打开链接题意:给你一个数字n, 求1~n所有数中包含子串49的个数。思路:典型的数位DP水题, 做过一两道数位DP后这道题就很简单了。  把数字n当成字符串读进来, 用d[i][last][p][cur]表示当前到了第i位, 上一位是last,当前和n相等还是小于n, 是否已经包含49的方案数。   然后按照意义转移就行了。细节参见代码:#include#inclu

2016-03-14 17:18:07 1472

原创 HDU 5642 King's Order(数位DP)

题目链接:点击打开链接题意:要求你生成一个合法的字符串, 由小写字母a~z组成, 相同字母相邻出现不能超过3个, 求有多少种组合。思路:数位DP来做, 用d[i][j][k]表示处理完前i个字母, 第i-1个字母为j,已经连续出现了k次的方法数。 然后每次转移就很简单了, 继续选择字母j(if(k 细节参见代码:#include#include#include#include

2016-03-13 10:02:14 1138 1

原创 Codeforces Round #269 (Div. 2)(D. MUH and Cube Walls(KMP))

题目链接:点击打开链接题意:给你一个长度为n的序列, 让你找其中有几个长度为m的序列的形状(即高低差距)思路:将数组预处理成相邻两数的差的形式, 然后KMP即可。 KMP的精华在于状态转移图的构造, 有点DP的思想, 也就是预处理失配之后能转移到代价尽量小的地方。这里附上一篇KMP详解:点击打开链接细节参见代码:#include#include#include#inclu

2016-03-12 16:26:17 1351

原创 Codeforces Round #250 (Div. 2) (D. The Child and Zoo(并查集))

题目链接:点击打开链接题意:给你一个n个点, m条边的图, 每个点有一个点权值, 我们定义f(p, q)表示p点到q点的一条路径, 要求这条路径上的最小点权尽量大, 其值等于最小点权值。  求任意一对点的f值之和除以n * (n - 1) , 即平均值。思路: 其实转化一下, 就是要先求最大生成树, 那么路径一定在树种, 且唯一。  那么我们从大到小来, 每次将两个集合合并的时候, 那么A

2016-03-11 19:46:24 1310

原创 HDU 1828 Picture(线段树 + 扫描线)

题目链接:点击打开链接题意:求n个矩形的周长的并。思路:用扫描线法, 按照x坐标和y坐标分别扫描, 用线段树维护区间覆盖情况, yy了一下, 可以发现, 每次的可见轮廓都等于这次的区间覆盖长度和上一次的差值。细节参见代码:#include#include#include#include#include#include#include#include#include

2016-03-11 16:52:18 1465

原创 Codeforces Round #345 (Div. 2) (D. Image Preview(二分))

题目链接:点击打开链接题意:给你n个照片, 从第一个照片开始看, 如果一张照片是'w', 那么要花费b时间去反转他, 否则不用反转, 看一张从来没看过的照片要1时间, 从一张滑动到另一张要a时间。 如果一张照片看过, 则不用再反转, 也不用再傻1s 。 求在不超过T时间的前提下最多能看多少张。思路:首先我们可以发现, 存在折返的情况, 也就是看到一个地方返回向另一端翻照片。 但是显然最多只

2016-03-10 21:20:59 1961

原创 HDU 1542 Atlantis(线段树求矩形面积并)

题目链接:点击打开链接题意:给你n个矩形, 求这n个矩形所覆盖的面积(重复覆盖算一次)思路:我们可以考虑, 将y坐标保存并排序。 按x坐标离散化后建立线段树。 每次遇到一个矩形的下底边就将这个区间+1, 遇到上边就-1, 每次更新后累加当前x区间的长度乘以相邻两边的高度。  具体原因可以画图看看就明白了。   另外很重要的一点就是, 线段树都是维护一个点集, 但是对于边的问题就会变得很麻烦

2016-03-10 17:22:54 2530

转载 3xian之所在(3xian退役贴)

初看此文, 不以为然 ; 现在, 方觉真理。最后一天,漫天飘起了雪花,假装欢送我离去。这次WF之战不太顺利,早期的C题大概花了1秒钟构思,然而由于输出格式多了一个空格直到两个半小时才逃脱Wrong Answer的纠缠。还好lynncui在期间独挡一面过掉D。最终成绩不好,然而没有遗憾,从不遗憾。相比之下,来自全球的队伍让我看到了很强大的实力,每一道题都有人过,包括SJTU欺骗性

2016-03-09 17:00:30 2409 2

原创 HDU 4819 Mosaic(二维线段树)

题目链接:点击打开链接题意:

2016-03-08 16:16:50 1262

原创 HDU 4302 Holedox Eating(multiset)

题目链接:点击打开链接题意:有个吃货在坐标为1~L的线段上, 开始在0位置, n个操作, 0 x 表示在x位置放一个蛋糕, 1 表示这个吃货会吃掉离她最近的一个蛋糕。 如果在左右两边都有离他最近的,就按照上次的方向吃。思路:用multiset维护蛋糕的位置, 用二分查找加速算法, 乱搞即可。细节参见代码:#include#include#include#include#in

2016-03-06 20:42:06 675

原创 HDU 4902 Nice boat(线段树)

题目链接:点击打开链接题意:给n个数, q个操作, 两种操作, 1操作是把[l, r]区间里所有数变成x。  2操作是把[l, r]区间里所有大于x的数变成gcd(a[i], x)。思路:1操作没什么好说的, 对于2操作可以发现, 如果一个数被修改, 那么它一定是变小了, 我们知道一个数在经过不超过loga[i]次后一定会变成1, 所以可以知道, 如果存在很多2操作, 那么最后一定会形成很

2016-03-06 19:37:58 1490

原创 HDU 4126 Genghis Khan the Conqueror(最小生成树)

题目链接:点击打开链接题意:给你一张图, n个点, m条边, 求一个最小生成树, 然后Q个询问, 每个询问要求改变一条边, 然后求现在的最小生成树。思路:最暴力的做法是, 对于每个询问, 改变这个边(一定是增大)之后再做一遍最小生成树。 复杂度O(qm),显然会超时。 那么我们可以发现, 对于每个询问推一步的结果如下:1. 改变的这条边不在最小生成树中, 那么答案就是最小生成树。2

2016-03-05 15:41:02 1258

原创 POJ 2253 Frogger(最小生成树)

题目链接:点击打开链接题意:求从1到2的路径中, 使得最长路尽量小。细节参见代码:#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define Max(a,b) (

2016-03-05 10:20:24 1377

原创 ZOJ 3635 Cinema in Akiba(二分+树状数组)

题目链接:点击打开链接题意:n个人轮流做到座位上, 第i个人做到第a[i]个空座上, 求最终每个人的座位情况。思路:经典水题, 二分套树状数组。细节参见代码:#include#include#include#include#include#include#include#include#include#include#include#include#incl

2016-03-04 15:06:11 1137

原创 Educational Codeforces Round 9(D. Longest Subsequence(筛法))

题目链接:点击打开链接题意:给定n个数, 求一个最长的不连续子序列, 使得子序列中所有元素的最小公倍数 思路:因为最小公倍数 筛法复杂度是O(nlogn)。细节参见代码:#include#include#include#include#include#include#include#include#include#include#include#inclu

2016-03-03 16:26:58 1075

原创 Manthan, Codefest 16(G. Yash And Trees(dfs序+线段树))

题目链接:点击打开链接题意:给你一棵树, 根结点为1, q组操作, 每组操作有两种, 一种是对一个结点的所有子树结点的值全部+1, 另一种是查询一个结点的子树结点上值%m的余数为素数的个数。思路:对于第一个操作, 我们可以想到用dfs序给树重新标号, 使得一个结点的子树结点为相邻的一条线段, 这样,就可以很容易的用线段树进行处理了。  对于第二个操作, 为了维护一个区间内的值, 我们可以用

2016-03-02 09:00:14 1159

原创 Manthan, Codefest 16 (C. Spy Syndrome 2 (trie树 + DP))

题目链接:点击打开链接题意:给你一个m个单词的字典, 给你一句话, 这句话中的每个单词都来自字典, 字典中的每一个单词可重复使用, 把这句话的所有大写字母变成小写字母, 然后反转后去掉空格。  要求你恢复这句话。思路:一看就是一个典型的DP, 很容易想到, 枚举每个单词的起点, 然后向后找这个单词的终点, 并转移过去。  但是问题在于, n和m都很大, n*1000复杂度如果再用map查找

2016-03-01 15:46:08 1192

原创 Manthan, Codefest 16 D. Fibonacci-ish(暴力)

题目链接:点击打开链接题意:给你n个数, 问最长的题目中定义的斐波那契数列。 思路:枚举开始的两个数, 因为最多找90次, 所以可以直接暴力, 用map去重。  注意, 该题卡的时间有点厉害啊, 用了两个map结果超时。细节参见代码:#include#include#include#include#include#include#include#include#in

2016-02-28 21:38:13 1621

原创 UVA 11389 - The Bus Driver Problem(二分or暴力)

题目链接:点击打开链接题意:n个老司机, n个下午路线,n个晚上路线, 要求给每个老司机分配一个下午路线和一个晚上路线, 使得每条路线恰好被分配给一个老司机, 且支付的加班费最少。思路:n太小了, 直接n^2暴力都行, 当然了可以用二分加速一下。 从小到大排序后, 从下午路线最短的开始, 找第一个大于等于d - a[i]的晚上路线, 如果都比d - a[i]小, 那么选择当前最大的一条,为

2016-02-26 14:06:13 1445 1

原创 UVA 11627 - Slalom(二分)

题目链接:点击打开链接题意:你有s个滑雪器具, 每个的下滑速度不同, 从高到低有n个门, 你的水平速度最大是v,求一个下滑速度最大的能够穿过所有n个门的器具。思路:将n个器具的速度排序, 这样就成了二分查找找上界。  判断是否能穿过所有门也很简单, 只要每次维护一个能滑到的最大范围就行了。细节参见代码:#include#include#include#include#inc

2016-02-25 21:24:35 2238 2

原创 HDU 5634 Rikka with Phi(线段树)

题目链接:点击打开链接题意:有3种区间操作, 1是把区间内的所有数变成它的欧拉函数值, 2是把区间所有数都变成一个数x,3是查询区间和。思路:后两个操作就是线段树的区间修改和求和, 没什么好说的。 题解说用平衡树(弱不会), 不过大致思路线段树同样可以维护, 因为一个数进行最多phiO(logn)次就会变成1, 所以我们可以在递归结束,向上传标记的时候顺便看看其子区间是不是都等于1,

2016-02-25 13:58:22 1499

原创 UVA 1422 - Processor(二分+优先队列+贪心)

题目链接:点击打开链接题意:有n个任务, 每个任务必须在[r,d]时间段内完成, 任务量为w, 求最小执行速度, 使得可以在规定时间内完成所有任务。思路:二分通常要和贪心搭配, 显然, d越小的, 应该优先完成, 所以我们可以用一个优先队列来维护这个信息, 然后枚举每一个时刻, 看看应该先执行那个程序。细节参见代码:#include#include#include#inclu

2016-02-25 12:37:50 1352

原创 UVA 1267 - Network(贪心DFS)

题目链接:点击打开链接题意:一开始只有一个结点上有一个服务器, 为了让所有叶子结点距离服务器的距离不超过k, 我们在非叶子结点上添加服务器, 问最少添加多少服务器。思路:贪心。 将第一个服务器所在结点作为根结点, 向下拓展, 记录父子关系, 将叶子结点的深度排序, 从最深的结点开始向上找k个距离的父节点, 安装服务器, 并进行一次DFS, 将所有距离它不超过k的结点标记。细节参见代码:

2016-02-24 13:31:48 1138

原创 UVA 12124 - Assemble(二分)

题目链接:点击打开链接题意: 给n个组件来组装电脑, 每个组件有4个属性:种类、名称、价格、品质。 要求每种组件买一个, 求在不超过预算的情况下, 品质最低的品质尽量大。思路:很显然, 二分最低品质, 然后判断是否可行, 属于二分找上界,在二分时有一个小技巧用来处理当区间相差1时的情况。细节参见代码:#include#include#include#include#incl

2016-02-24 00:01:37 2006 2

原创 Codeforces Round #343 (Div. 2) (C. Famil Door and Brackets(DP))

题目链接:点击打开链接题意:给你一个长度为m的只含()的括号串s, 要求在s两端在加两个串p和q, 使得总长度为n,并且平衡, 平衡是指任意前缀串的(都不少于), 并且整个串的(和)一样多。思路:我们不难想到这样一个DP, d[i][j]表示长度为i的串,(比)多j个(或者)比(多j个, 是等价的)的方案数。  那么转移很简单:if(j > 0) d[i][j] += d[i-1][j

2016-02-23 17:27:11 1296 1

原创 Educational Codeforces Round 8(E. Zbazi in Zeydabad(树状数组优化))

题目链接:点击打开链接题意:一个n*m矩阵, 里面的格子除了'z'就是'.',问有多少个z形图案。思路:因为n和m很大, 即使n^3复杂度也会超时。  如果按照最朴素的方法, 我们可以处理一下前缀和, 处理出一个格子向左l[i][j]、向右r[i][j]、斜向左下lr[i][j]连着的z到哪里为止, 这样我们用n^2复杂度枚举每一个格子作为z形图案的右上角,取min(l[i][j], lr

2016-02-22 21:24:58 1704 1

原创 Educational Codeforces Round 8(D. Magic Numbers(数位DP))

题目链接:点击打开链接题意:给一个m一个d, 一个字符串a和b, 问在[a,b]范围内, 有多少个可以整除m的魔法数, 魔法数的定义是, 偶数位上都是d, 奇数位上都不是d。思路:据说是典型的数位DP, 以前没做过数位DP, 感觉和DP差不多?用d[i][j][p]表示当前到了第i位, 余数为j, p == 1表示目前和b串相等, p == 0表示已经比b串小了。  每次枚举第i位上放

2016-02-21 22:31:33 1529 1

原创 Codeforces Round #343 (Div. 2) D. Babaei and Birthday Cake(线段树+离散化优化DP)

题目链接:点击打开链接题意:给出n个圆柱体的地面半径和高, 要求只能有一个直接放在桌子上, 其他的要放在他上面, 第i个能放在第j个上面的条件是:当且仅当第i个的体积大于第j个且j 思路:一看就是一个DP, 而且状态很容易表示, d[i]表示到第i个为止能得到的最大总体积。   转移到 max(d[j]) + a[i], (j a[j])。  但是n非常大, 显然要优化, 因为第二层循环

2016-02-21 14:27:34 1574

原创 8VC Venture Cup 2016 - Elimination Round F. Group Projects(DP)

题目链接:点击打开链接题意:给n个人, 让我们分成若干组, 每组的值是最大值减去最小值, 求所有组的和。思路:显然, 需要用DP的思想, 但是该题DP设计的非常巧妙, 而且状态转移的情况容易考虑不全。我们用d[i][j][v]表示考虑了前i个数了, 有j个组是开放的(所谓开放指的是只有最小值, 还没有最大值, 还可以进人), 当前值之和为v 的方案数。我们先排序, 这样, 对于开放

2016-02-19 22:06:12 1617

原创 HDU 2335 Containers(暴力枚举)

题目链接:点击打开链接题意:n个40X8的箱子, 要求建一个矩形场地来放这些箱子, 箱子间有已知大小的间隙, 最高可以放5层。 求场地的最小面积, 在此基础上尽量方。思路:设场地x列,y行, 那么x*y == (n+4)/5  所以x不会超过sqrt(n), 所以枚举x求y就行了。比赛的时候考虑到随着x的增加, 答案先变小后变大, 所以三分的, 但是样例都过不了, 后来才注意到是5层。

2016-02-19 15:50:38 1144

原创 HDU 1523 Decoding Morse Sequences(DP)

题目链接:点击打开链接题意:给出一个编码, 给n个单词的字典, 求有多少个字典中单词组成的语句可以编译成所给编码。思路:答案数很大, 我们不难想到要用动态规划的思想。   用d[i]表示到第i个编码为止的答案数, 那么起点就是d[0] = 1;  我们在第二层循环枚举n个单词的编码, 如果能匹配,就转移过去。细节参见代码:#include#include#include#in

2016-02-19 12:52:19 1258

原创 8VC Venture Cup 2016 - Elimination Round E. Simple Skewness(枚举+三分)

题目链接:点击打开链接题意:给你n个数, 要求选若干个数, 使得这些数的平均数减去中位数尽量大。思路:由于该题没有顺序问题, 排好序之后我们可以枚举中位数, 可以证明, 奇数个数一定比偶数优,然后三分中位数左右区间长度x(数的个数), 在中位数的右边选最大的x个数, 在左边也选最大的x个, 这样, 随着区间长度的增加, 平均数将先增大后减小, 或者一直减小,或者一直增大。为什么呢? 假

2016-02-18 11:20:06 1655 2

原创 UVA 10816 - Travel in Desert(最小生成树+最短路)

题目链接:点击打开链接题意:有n个绿洲, m条道路,每条路上有一个温度,和一个路程长度,从绿洲s到绿洲t,求一条道路的最高温度尽量小, 如果有多条, 选一条总路程最短的。思路:先生成最小生成树,按照温度排序, 当s和t联通的时候, 这个温度就是最高温度。  然后把其他温度小于等于这个温度的道路也加进图中, 跑一个最短路就行了。细节参见代码:#include#include#in

2016-02-16 15:13:49 1492

原创 UVA 10600 - ACM Contest and Blackout(最小生成树&次小生成树)

题目链接:点击打开链接题意:n个点,m条边,求最小生成树的值和次小生成树的值。思路:最小生成树就不说了, 如何求次小生成树:可以证明, 次小生成树一定是最小生成树加一条边然后减去一条边形成的。  所以只需要枚举减去最小生成树中的哪条边, 然后在此前提下再生成一遍最小生成树就行了, 复杂度O(n*m)。还有一种更好的方法:枚举要加入哪条新边, 在最小生成树上加入一条边u-v后,图上会出现

2016-02-15 21:24:06 2450

原创 UVA 11354 - Bond(并查集-按秩合并)

题目链接:点击打开链接题意:给出一张n个点m条边的无向图, 每条边有一个危险度,有q个询问, 每次给出两个点s、t,找一条路, 使得路径上的最大危险度最小。思路:首先,我们可以发现,如果求一个最小生成树, 那么任意两点, 在生成树上有唯一路径, 而且这条路径上的最大危险值一定最小。 但是n和q都太大, 如果直接顺着树走,每次询问最大复杂度O(n), 那么复杂度高达O(n^2),会超时。  

2016-02-15 16:14:32 3530

空空如也

空空如也

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

TA关注的人

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