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

原创 UVA 1494 - Qin Shi Huang's National Road System(次小生成树)

题目链接:点击打开链接题意:n个城市,需要修建一些道路使得任意两个城市联通,还可以修一条魔法道路, 不花钱, 设魔法路连接的城市的人口之和为A, 所有道路总长为B, 求A/B的最大值。思路: 次小生成树。 先做一次最小生成树, 然后用dfs搜索出最小生成树上任意两点之间最长的道路长度。  然后枚举在哪两个城市之间建魔法道路。n^2复杂度。细节参见代码:#include#inclu

2016-02-14 21:01:01 1621

原创 Educational Codeforces Round 7 E. Ants in Leaves(DFS+贪心)

题目链接:点击打开链接题意:给出一棵n个结点的树, 每个叶子结点上有一只蚂蚁, 每秒每只蚂蚁可以向相邻结点走一步, 同一时刻同一结点上只能有最多一只蚂蚁(根结点除外),根结点为1, 求所有蚂蚁都移动到1上的最小花费时间。思路:很容易想到,采取贪心的思路就行了, 那么只要不断向上走就行了, 因为根结点比较特殊, 我们只考虑它的子树, 对于它的每一棵子树, 先dfs处理出所有结点的深度,然后对

2016-02-13 14:32:22 2093 2

原创 POJ 3666 Making the Grade(DP)

题目链接:点击打开链接题意:给n个数, 要求把这个数列变成非减或者非增数列, 求最小该变量之和。思路:

2016-02-12 19:56:16 2673

原创 UVA 10917 - Walk Through the Forest(最短路优化DP)

题目链接:点击打开链接题意:给你一个图, 从1走到2,求有多少种不同的走法,从结点a可以走到b的条件是:存在一条总b出发回家的路径,比从a出发回家的路径都短。思路:这个条件的意思其实就等价于从2到b的最短路比从2到a的最短路短。所以, 可以事先处理出从2出发到所有结点的最短路。 然后用DP进行计数就行了。细节参见代码:#include#include#include#in

2016-02-11 13:34:49 2318

原创 UVA 11374 - Airport Express(最短路)

题目链接:点击打开链接题意:某个人要从起点到终点, 有m个经济站和k个商业站, 只能乘坐一次商业站, 求最短时间。思路:因为多了商业站, 所以不能直接套用最短路, 但是注意到只有一次乘坐商业站的机会, 所以直接枚举坐哪个商业站就行了, 这样,其他部分就是最短路了, 假设商业站是从a到b,花费c,那么答案就是d1[a] + d2[b] + c, d1是从起点的最短路,d2是从终点出发的最短路

2016-02-11 12:54:09 2404 2

原创 BNUOJ 51275 道路修建 Large(并查集)

题目链接:点击打开链接题意:见链接。(中文题)思路:该题与普通并查集的不同之处在于,需要查询两个点最早联通的时刻。  我们不妨在结点上维护一些信息:假设结点v, 那么维护ans[v]表示v到父亲结点的时间。 然后查询的时候, 考虑到并查集是一个树形结构, 如果两个顶点联通, 两个顶点之间有唯一路径, 路径上边的最大值就是了。因为要维护这个关系, 所以显然不能路径压缩, 因为那样会破坏结

2016-02-10 14:40:11 1738

原创 UVA 10054 - The Necklace(欧拉回路)

题目链接:点击打开链接题意:n个珠子,每个珠子的两半由不同的颜色组成。 只有相同的颜色才能接在一起, 问能否组成一个一个项链。思路:如果将一个珠子看成是一条连接两个顶点的无向边,那么本题就变成了求无向图是否存在欧拉回路。  对于无向图, 如果所有点的度数都是偶数并且图是联通的, 那么就存在欧拉回路。   那么从任意一个点开始走都将走完所有道路并回到起点。细节参见代码:#includ

2016-02-09 21:23:16 3048

原创 UVA 10047 - The Monocycle(BFS)

题目链接:点击打开链接题意:从起点到终点,每秒可以选择前进、向左、向右转, 每前进一格轮子转到下一个颜色, 一共5中颜色, 开始的时候绿色接触地面,朝北, 要求最后也绿色接触地面,求能否到达目标点以及最短时间。思路:和普通BFS相比,多了两个附加条件,所以要将状态表示全面,也要对应加两维。 水题。细节参见代码:#include#include#include#include

2016-02-08 22:14:11 2103

原创 HDU 5623 KK's Number(DP)

题目链接:点击打开链接题意:两个人轮番从n个数中每次选择任意个数, 每次获得的分数是所选数种最小的,两人采取的策略都是使得自己的分数减去对方的分数尽量大, 求最终第一个人的得分。思路:昨天BC的C题, 因为每次可以选择若干个数, 所以普通的贪心肯定是不行的。 我们可以用d[i]表示还剩i个数时先手减去后手得分的最大值, 这样的话, 每次转移是:d[i] = max(a[j+1] - d

2016-02-07 14:32:53 2399

原创 HDU 5624 KK's Reconstruction(最小生成树)

题目链接:点击打开链接题意:n个城市, m条可以修建的路, 修每条路有一个费用, 要求修建路将n个城市全部联通,并且最大费用减去最小费用最小。思路:枚举最小边, 然后重新求一遍最小生成树,复杂度m^2, 出的数据水了, 左边BC水过了。。细节参见代码:#include#include#include#include#include#include#include#in

2016-02-07 11:25:12 2670

原创 lightoj 1422 - Halloween Costumes(区间DP)

题目链接:点击打开链接题意:有n个舞会, 每个舞会规定要穿哪个衣服, 衣服可以套着穿, 一旦脱下一件衣服, 再穿时要穿新的, 求最少要准备多少套衣服。思路:一开始手算了一下, 发现普通的贪心策略是行不通的, 因为可能情况太多, 那么显然这肯定是一道DP了, 只是没想到是区间DP, 找了很多状态都不对。问题的关键是, 如果有几件衣服都在不同舞会出现, 那么到底是选择哪一件衣服留到后边穿。

2016-02-05 17:11:49 1529

原创 ACM竞赛黑科技

以后将在这篇文章中陆续更新各种黑科技。手动扩栈:(G++编译器):#pragma comment(linker, "/STACK:1024000000,1024000000")

2016-02-05 11:44:32 2077

原创 HDU 5505 GT and numbers(GCD魔法)

题目链接:点击打开链接题意:给两个数n和m, n每次乘以它的因子变成一个新的值, 求最少乘几次可以变成m。思路:每次乘以的整数v有两个要求:1.它是n的因子;2.它要尽量大。又因为如果n能最终到达m,一定是乘以n的k倍, 所以只要n能被m整除, 那么每次取gcd(n, m/n)就行了。细节参见代码:#include#include#include#include#inc

2016-02-03 12:07:26 970

原创 Codeforces Round #226 (Div. 2) C. Bear and Prime Numbers(暴力)

题目链接:点击打开链接题意:给n个数, m次询问, 每次询问时一个区间[l, r]。 求这个区间中的所有素数,能被n个数中的几个数整除的累加和。思路:没想到什么好办法, 直接筛出素数以后直接暴力的,没想到跑的这么快。。最费时间的大概就是那个二重循环, 但是可能因为素数比较少, 所以实际的时间复杂度并不高。细节参见代码:#include#include#include#in

2016-02-02 13:10:04 1299

原创 HDU 5618 Jam's problem again (cdq分治+树状数组)

题目链接:点击打开链接题意:给n个点,求每一个点的满足xyz都小于等于它的其他点的个数。思路:经典的cdq分治+树状数组。  方法就是先按照x从小到大排序, 这样,x一定满足后面的大于等于前面的, 这样我们就可以不用管x了, 然后对y进行cdq分治,使得y满足关系, 在此基础上用树状数组顺便维护z坐标。  但是由于cdq分治每次总是要解决左边对右边的影响, 所以在相等时, 每次只更新了右边

2016-02-02 10:45:09 1927

原创 Codeforces Round #341 (Div. 2) E. Wet Shark and Blocks(矩阵优化DP)

题目链接:点击打开链接题意:给n个数作为一个块,有b个块,从其中若干个中选择数,每个块只能选一个数,最后组成一个数模x等于k的方法数。思路:很容易想到这样一个DP方程 : 用dp[i][j]表示现在i位,余数是j。那么dp[i + 1][(j * 10 + k) % x] = dp[i][j] * cnt[k],k是指枚举放1~9中哪一位。因为b特别大,显然要矩阵优化,知道了DP方程,

2016-02-01 14:45:46 1298

原创 Codeforces Round #341 (Div. 2) C. Wet Shark and Flowers(简单容斥)

题目链接:点击打开链接题意:有n个人围坐成一圈,每个人可以从a[i].l 到 a[i].r里选一个数,如果相邻两个数的乘积能整除p,那么就奖励他们一人1000,求所得钱的总和的期望。思路:既然求期望, 先求概率。 显然是要求每组相邻两个人的值乘积能否被p整除, 可以很容易知道在区间里有多少个数不能被p整除, 正难则反, 就能算出相邻两个有多少种组合不能被p整除, 那么也就很容易算出每组可以

2016-02-01 12:36:56 1334

原创 HDU 5617 Jam's maze(DP)

题目链接:点击打开链接题意:给你一个n*n的矩阵。  求从(1,1)走到(n,n)所组成的回文串个数。思路:一开始傻逼把状态写成了d[x][y][s],s表示一个串, 用map存的, 后来发现极不可行, 因为这个状态简直太大了, 包括了s串的所有情况。 只是相当于一个dfs中的剪枝罢了。后来想到, 其实串是不必记录的, 我们只要统计个数, 所以不妨在DP的过程中就判断回文串的情况, 那

2016-01-31 17:06:55 1541

原创 HDU 5616 Jam's balance(暴力枚举子集)

题目链接:点击打开链接题意:有一个没有游标的天平,和n个秤砣,m个询问, 每次一个k,问可否秤出k这个重量。 秤砣可以放两边。思路:因为n最大20, 暴力枚举子集。 因为可以放两边, 所以每次再跑一遍, 减去每个的重量, 将答案保存。比赛的时候忘了限制边界,虽然过了终测数据, 却被人用大数据hack了(RE), 还是自己程序写的不够鲁棒, 思考的不完善。细节参见代码:#incl

2016-01-31 10:29:24 1943 1

原创 HDU 4433 locker(DP)( UVA 1631 - Locker)

题目链接:点击打开链接题意:有一个n位密码锁,每一位都是0~9,可以循环旋转,每次可以让1~3个相邻数字同时往上或者往下旋转一格。 输入初始状态和终止状态,问最少需要转几次。思路: 很显然是个DP题目, 由于每次可以让相邻的1~3个数字同时旋转, 所以状态的表示上就要考虑相邻3个位置。那么可以用d[i][a][b][c]表示当前到了第i位,第i位上当前是a,i+1位是b,i+2位是c。

2016-01-29 13:32:45 1694

原创 HDU Disney's FastPass(状态压缩DP)

题目链接:点击打开链接题意:给你一个n个点的完全图, 图中任意两个点都有直接相连的路,在某些点上可以获得某些景观的入场券,有入场券和没有入场券进入景观要等候的时间不同,有k个景观,要求从1点出发参观完所有景观后回到1的最小花费。思路: 很明显的状态压缩DP, 因为 k 很小,所以可以压缩成一个整数,表示哪些景观已经参观完了。 然后还要表示出当前到了哪个点, 又因为有没有票的等候时间是不同的

2016-01-27 15:32:46 1257 1

原创 HDU 5613 Baby Ming and Binary image(暴力)

题目链接:点击打开链接题意:给一个矩阵A, 要求找到一个01矩阵使得每个格子以及周围8个格子数字之和等于A中对应的格子。要求第一行和最后一行必须都是0套路题, 因为第一行和最后一行已经确定了,并且n很小, 直接二进制枚举子集枚举第一列的情况,然后就可以一列列递推出后面的所有情况了。细节参见代码:#include#include#include#include#include

2016-01-26 15:47:09 1563 2

原创 Codeforces Round #235 (Div. 2) D. Roman and Numbers(状态压缩DP)

题目链接:点击打开链接题意:给你一个数n,要求将n的各个位上的数重新排列(不能有前导0),使得形成的数对m取模为0, 问有多少个这种数。思路:因为n太大了,枚举全排列复杂度高达n!。 因为n最大有18位, 所以可以用状态压缩每一位,表示当前的答案中选了哪些数了。那么不难想到状态d[i][j]表示当前已经把哪些位上的数用了(用集合i表示),且此时余数为j的答案数。 这样递推到所有数都用了

2016-01-25 23:21:14 1463

原创 Codeforces Round #271 (Div. 2) E. Pillars(线段树优化DP)

题目链接:点击打开链接题意:一个n个数的序列,每个数有一个高度值h[i]。 求一个最长子序列,要求相邻两个数满足| h[i] - h[i-1] | >= d。 并要求打印出该序列。类似于最长上升子序列, DP思想很简单, 但是可惜n太大了, 二重循环会超时。 所以要想办法优化掉第二层循环。观察发现, 第二层所做的事情就是在所有满足j= d 的j中找到最大的d[j]。j 把不等式

2016-01-25 17:50:00 1298

原创 1455 - Kingdom(并查集+线段树区间加减)

题目链接:点击打开链接题意:给你n个点,m次询问,每次询问有两种:1. 将城市v和u用一条道路连接起来2.询问用一条水平线能穿过多少个州和这些周中包括的城市数。由于水平线一定是v.5的形式,所以不妨将y坐标乘以2再建立线段树,建两棵线段树,一棵维护大洲的数量,一棵维护城市数。 合并问题交给并查集就好了。另外值得一提的是,对于线段树区间加减这个问题, 其处理方法大家应该更深入

2016-01-25 15:25:11 1370

原创 BZOJ 2038: [2009国家集训队]小Z的袜子(hose)(莫队算法)

题目链接:点击打开链接题意:给n个袜子, 每个袜子有一个颜色。 m次查询,每次查询给一个区间, 求在区间里的任选一对袜子的颜色相同的概率。最经典的莫队算法, 莫队算法有两种, 我刚刚学了第一种:分块。简单来说,假设总区间长度为n,那么将区间分成size = sqrt(n)块,那么每一块的长度为n/size,也是sqrt(n),所以每次只维护一块里的内容和块与块之间的内容,如果改变一个数

2016-01-25 14:40:04 1437

原创 Codeforces Round #340 (Div. 2)题解

题目链接:点击打开链接这次的比赛比较简单, 有些坑点, 主要是考思维的严密性。。。比赛时做出了前4道, 都没有什么算法, 最后一道的通用解法是莫队算法, 现在还不会, 今天就补上。终测挂了C,原来是漏了枚举第一个半径为0的情况, 太失误了。A. Elephant

2016-01-24 14:02:14 863

原创 Educational Codeforces Round 6 E. New Year Tree(DFS序+线段树)

题目链接:点击打开链接题意:给你一棵树,编号1~n,告诉你根结点是1。 每次有两个操作:1,将以v为根的子树的结点全部染成颜色c2,问以v为根的紫书的结点的颜色种类。思路:如果这是一条线段的话, 那么这就是线段树的区间更新问题,而现在是一棵树。因为告诉了根结点是1, 那么这棵树的任意一个结点的子树就是确定的, 所以我们可以用DFS的先序遍历,将所有结点重新编号,因为先序遍历的话

2016-01-22 16:56:41 1145

原创 UVA 11402 - Ahoy, Pirates!(线段树区间更新(标记重叠的处理))

题目链接:点击打开链接题意:有3种区间操作, 将某个区间全部变成1; 将某个区间全部变成0;将某个区间的1变成0, 0变成1。思路:前两个操作就是最基本的区间更新, 用到懒惰标记, 然而第3个操作却有些麻烦, 如果仅仅更新当前这个结点对应的大区间, 那么它所包含的小区间再次更新时就会发生错误, 错误的原因是因为标记的重叠和碰撞。  显然 , 这就是很典型的一个问题, 处理标记碰撞的问题。

2016-01-22 16:26:16 1659

原创 UVA 11525 - Permutation(二分+树状数组)

题目链接:点击打开链接题意:从1~k的所有排列中找到第n个排列, n由公式给出。思路:可以发现, 这个公式就是康托展开公式(康托展开百科:点击打开链接)。 那么s[i]的意思就是i个数中当前数排在第几。如此, 可以用二分+树状数组快速求解, 和一道BC题目神似。细节参见代码:#include#include#include#include#include#includ

2016-01-20 15:55:00 1409

原创 UVA 1232 - SKYLINE(线段树区间更新)

题目链接:点击打开链接题意:依次建n个建筑, 每个建筑有3个信息,宽度:[l, r], 和高度h, 要求求出每个建筑刚建完时最高的部分的区间长度之和。思路:就是维护线段树区间最值, 然而有一个问题, 因为不能更新比当前高度大的区间,所以最坏的情况下要更新到所有点, 因此要加一个懒惰标记,表示该区间是否被完全覆盖,覆盖值是多少。  另外由于是区间问题, 会产生区间端点的麻烦, 所以我们把线段

2016-01-20 10:24:29 1654

原创 UVA 1513 - Movie collection(树状数组)

题目链接:点击打开链接题意: 有编号1~n的n个影碟从上到下排列, 每次取一个影碟并把其放在最上面, 求每次取之前该影碟前面有多少个影碟。取出影碟, 将该位置-1即可, 容易想到用树状数组来维护, 但是还要放到最前面。 其实解决方法很简单, 就是把数组开大一点, 前面留出足够大的空间, 不断更新位置即可。细节参见代码:#include#include#include#incl

2016-01-19 14:52:03 1487

原创 POJ 1436 Horizontally Visible Segments(线段树区间修改)

题目链接:点击打开链接题意:n条竖直线段,如果两条线段之间可见(即可以用一条水平线段连接而不触碰其他线段),则称它们可见。   如果三条线段任意两条都可见, 则称它们为a triangle of segments, 求a triangle of segments的个数思路: 一开始真没想到n^3的复杂度可以过。。。  如果这样的话, 问题的关键就是怎样判断任意两个线段是否可见。那么如果

2016-01-18 12:31:26 1207

原创 POJ 2777 Count Color(线段树区间修改+位运算)

题目链接:点击打开链接题意:两种操作, 一个是区间修改, 一个是区间查询颜色种类数。该题因为要不断的求某个区间的颜色种类数, 我们可以用位运算的并来实现。其他的就是线段树区间修改的经典操作了。细节参见代码:#include#include#include#include#include#include#include#include#include#inclu

2016-01-17 15:07:42 1516

原创 HDU 5607 graph(矩阵优化+概率DP)

该题很容易想到求概率的转移方程:用d[i][j]表示第i

2016-01-13 11:55:35 1340

原创 POJ 3233 Matrix Power Series(矩阵优化)

题目链接:点击打开链接题意:求S[k] = A + A^2 + ..... + A^k利用矩阵快速幂可以很快的求出A矩阵的k次方, 但是该题是求和, 如果还按照原来的方法, 将要计算k次, 复杂度无法承受。我们可以构造一个矩阵   (A  0)                                           (E  E)此时令S[k] = E + A + A

2016-01-12 20:03:17 1293

原创 POJ 3734 Blocks(矩阵优化+DP)

题目链接:点击打开链接题意:个n个方块涂色, 只能涂红黄蓝绿四种颜色,求最终红色和绿色都为偶数的方案数。该题我们可以想到一个递推式 。   设a[i]表示到第i个方块为止红绿是偶数的方案数, b[i]为红绿恰有一个是偶数的方案数, c[i]表示红绿都是奇数的方案数。那么有如下递推可能:递推a[i+1]:1.到第i个为止都是偶数,且第i+1个染成蓝或黄;2.到第i个为止红绿恰有一个是

2016-01-12 18:35:46 1854

原创 HDU 5606 tree(并查集)

题目链接:点击打开链接题意:一棵树,权值只有0和1,找到每个点与之相距最近的点的个数, (包括这个点自己,也就是说,等价于找每个点与之相距为0的点的个数)。用并查集乱搞就行了, 如果边权为0就合并集合, 并在集合的根节点上维护一个信息:该集合中点的个数。细节参见代码:#include#include#include#include#include#include#inc

2016-01-04 11:00:41 1673

原创 POJ 2528 Mayor's posters(线段树区间修改+离散化)

题目链接:点击打开链接题意:在墙上贴海报,海报可以互相覆盖,问最后可以看见几张海报。该题是线段树区间修改+离散化的应用。不难想到, 每次对一个最长10^7的线段进行线段树的区间修改, 最后统计。线段树的复杂度是log10^7, 应该不会超时, 但是会超内存。 所以想到要离散化, 将区间端点值有映射成一个尽量小的值。但是该题求的是覆盖情况, 如果按照单纯的点对点的离散化, 那

2016-01-02 11:29:25 1489

原创 POJ 3468 A Simple Problem with Integers(线段树|区间加减&&区间求和)

题目链接:点击打开链接题意:区间加减,区间求和。该题是线段树区间增减和区间求和的模板题。 和区间修改值一样, 在每个结点上维护一个之前加减的值, 那么每次经过一个结点时, 当前结点一定已经拥有所有结点信息。每次递归前下传结点信息,这就是所谓的懒惰标记。 细节参见代码:#include#include#include#include#include#include#i

2016-01-01 21:31:23 2230

空空如也

空空如也

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

TA关注的人

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