---------ACM---------
nbl97
这个作者很懒,什么都没留下…
展开
-
有上下界网络流建模方法
假设上界为 rrr, 下界为 lll无源汇可行流(循环流)法一:建立源点 sss 和汇点 ttt , 对于图中每条边 <u,v><u, v><u,v> ,拆成如下三条:$<s,v> $ ,容量为 lll$<u,t> $ ,容量为 ll原创 2018-11-20 22:40:24 · 222 阅读 · 0 评论 -
【网络流24题】最小路径覆盖问题
题目:给定有向图G=(V,E)。设P 是G 的一个简单路(顶点不相交)的集合。如果V 中每个顶点恰好在P 的一条路上,则称P是G 的一个路径覆盖。P 中路径可以从V 的任何一个顶点开始,长度也是任意的,特别地,可以为0。G 的最小路径覆盖是G 的所含路径条数最少的路径覆盖。设计一个有效算法求一个有向无环图G 的最小路径覆盖。分析:将每个点拆成两个点,比如将x拆成x1,x2,将y拆成y1,y2...原创 2018-10-16 11:58:07 · 152 阅读 · 0 评论 -
【网络流24题】太空飞行计划(最大权闭合图)
题目:W 教授正在为国家航天中心计划一系列的太空飞行。每次太空飞行可进行一系列商业性实验而获取利润。现已确定了一个可供选择的实验集合E={E1,E2,…,Em},和进行这些实验需要使用的全部仪器的集合I={I1,I2,…In}。实验Ej需要用到的仪器是I的子集RjÍI。配置仪器Ik的费用为ck美元。实验Ej的赞助商已同意为该实验结果支付pj美元。W教授的任务是找出一个有效算法,确定在一次太空飞行...原创 2018-10-17 22:42:56 · 126 阅读 · 0 评论 -
Codeforces 1065D Three Pieces
题意:有一个n * n 的矩阵,不重不漏地随机放着 1到 n*n 的每个数。现在你站在数字1的位置,每次可以有三种走法:走直线,四个方向。一次可以走多个单位,不仅只能走到相邻的位置,就像中国象棋里的车。走斜线,四个方向。一次可以走多个单位,像国际象棋里的象。走日字,八个方向,一次只能走一个单位。就像中国象棋里的马。每走一次,需要花费一个精力值。如果切换了一次走法,需要额外花费一个精力值...原创 2018-10-12 15:02:51 · 465 阅读 · 0 评论 -
zoj4048 Red Black Tree(二分+LCA)
题意:一棵n个结点的树上有若干个点是红色。有q个询问,每个询问给出k个点,可以将树上一个非红色点染成红色,使得k个点中与红色点的最大距离最小,输出最小值。根节点是红色。2 <= n,m <= 1e5, 1 <= q <= 2e5分析:搜索的过程中将每个点距离最近红色点的距离和根节点的距离记录下来。二分答案,然后将k个点中距离红色大于答案的拿出来,求这些点的LCA,...原创 2018-09-18 20:57:29 · 313 阅读 · 0 评论 -
hdu5785 Interesting (回文树)
题意:找出字符串中所有三元组(i,j,k)使得s[i,j]和s[j+1,k]均为回文串。问所有三元组的i*k的和是多少。分析:令中间的j固定,然后计算两边所有的i和k。可以计算出∑i∑i\sum i,∑k∑k\sum k,然后这两个和相乘,就是j固定时所有的i*k的和。对于第j个字符,可以在回文树上计算出,所有以字符j结尾的回文串个数num[j]和这些回文串的长度总和sum[j],...原创 2018-09-07 16:05:22 · 220 阅读 · 0 评论 -
bzoj2342 [Shoi2011]双倍回文 (回文树)
题意:在字符串s中寻找一个最长字串,这个子串必须是回文串并且这个字串的前半部分也是回文串。这个最长字串长度是4的倍数。分析:对于结点u,它的fail结点就是一个最长回文后缀,再fail一下,就又是一个短了一些的回文后缀,以此类推。对于u,我们只需要一直往上fail,看有没有一个fail结点长度是u的一半,有的话就找到了一个。将这个过程反向过来,建立一个fail的树,从根节点dfs一...原创 2018-09-10 17:07:17 · 189 阅读 · 0 评论 -
bzoj2565 最长双回文串(回文树)
题目:顺序和逆序读起来完全一样的串叫做回文串。比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同)。 输入长度为n的串S,求S的最长双回文子串T,即可将T分为两部分X,Y,(|X|,|Y|≥1)且X和Y都是回文串。分析:正反建立两棵回文树分别求前缀和后缀即可。代码:#include <bits/stdc++.h>usin...原创 2018-09-06 20:06:45 · 188 阅读 · 0 评论 -
bzoj3676 [Apio2014]回文串 (回文树)
题目:考虑一个只包含小写拉丁字母的字符串s。我们定义s的一个子串t的“出现值”为t在s中的出现次数乘以t的长度。请你求出s的所有回文子串中的最大出现值。分析:回文树裸体。借此学习回文树,记录模板。两个基本原理对于任何一个串S,它的本质不同的回文串的个数不会超过|S|个如果在串S后面加入一个字符,新增的本质不同的回文串的个数不会超过1个。证明 利用数学归纳法来证明...原创 2018-09-06 17:37:36 · 187 阅读 · 0 评论 -
hdu6477 YJJ's Salesman (线段树+dp)
题目:一个人从(0,0)走到(10^9,10^9),每次只能往右、上、右上走一个单位。 在地图上,有n个村庄,每个村庄有一个收获值,只有当从左下方走到某个点的时候,这个点的收获值才能被获取。给出n个村庄的坐标和每个村庄的收获值,问最大的收获值和是多少。 (1≤N≤105)分析:用线段树根据y轴维护收获值和。 对y离散化,然后对所有村庄按照x从小到大,y从大到小的顺序排序。对于第i...原创 2018-08-26 00:48:08 · 414 阅读 · 0 评论 -
hdu1087 Super Jumping! Jumping! Jumping!(线段树+DP)
题目:求一个数列的最长上升子序列和。(1≤n≤105,ai是32位整数)(1≤n≤105,ai是32位整数)(1 \leq n \leq 10^5, a_i是32位整数)分析:其实这个题的数据没有那么大,n^2的算法也可以过,在此提供一种O(nlogn)的做法。转移方程是dp[i] = max(dp[j]) + a[i], (1<= j < i, a[j] < ...原创 2018-08-26 00:23:28 · 138 阅读 · 0 评论 -
计蒜客2018蓝桥A模拟赛(三)蒜头君的01串
题目:蒜头君想知道长度为50且连续的1和连续的0的个数都不超过10的01串有多少个。分析:用dp[i][j][k] 表示长度为i 最后一位为j 这一位已经出现了k次 的数有多少。 转移时,最后一位只出现1次的可由最后一位是另一个数的所有情况得到,而出现超过 k 次的可由之前结尾是一样的数且出现 k - 1次的转移得到。代码:#include <bits/stdc++.h>using name原创 2018-04-27 19:38:34 · 208 阅读 · 0 评论 -
2018宁夏邀请赛网赛 G.Trouble of Tyrant(单调栈)
题意:有n个点,2n-3条边的图。点 1 到每个点有一条边,编号相邻的两个点有一条边。q次询问,每次询问一个增量d,问图中每条边都增加 d 后,1 到 n 的最短路是多少。增量独立,不累加。 1 <= n,q <= 1e5分析:用 dp[i] 表示经过 i 条边到达 n 的最短路长度,每条路是唯一的。如果每条边增加了长度 d 后最短路发生了改变,那新的最短路一定是边数...原创 2018-04-25 13:53:42 · 1282 阅读 · 0 评论 -
2018计蒜客蓝桥杯A组模拟(三) 蒜头君的数字
题目:有n个数,每次从左边或右边取一个,直到取完。每取一个数会有一个分数,问总分最大是多少? 分数计算如下:第一次拿的分数是数字本身。随后每次得到的分数是这个数与之前已取数的极差的乘积。分析:动态规划问题,我们可以用dp[i][j]表示剩余序列为第 i 个数到第 j 个数时已经获得的最大分数,可以通过 dp[i−1][j] 和 dp[i][j+1] 转移过来,需要注意边界情况,同时我们需要维原创 2018-04-30 13:31:06 · 495 阅读 · 0 评论 -
Codeforces915E Physical Education Lessons
题目:现有n个黑色石子。每次将(l,r)内的石子染成黑色或白色。每次染色后输出当前有多少个黑色石子。 (1 ≤ n ≤ 1e9, 1 ≤ q ≤ 3·1e5) 分析:这道题也是用ODT的思想,合并和拆开区间。分析可得:虽然n非常大。但一开始只有一个三元组,每次操作最多增加两个三元组,每个三元组最多删除一次。所以set中元素不会特别多。而黑色石子的和可以随着操作一起维护。用set来维护黑色石子的区原创 2018-04-11 13:44:44 · 122 阅读 · 0 评论 -
计蒜客2018蓝桥A模拟赛(一) 蒜头君王国(概率计算)
题目:有一天,蒜头君当上了国王。蒜头君的王国有 n 坐城市,现在他需要在城市之间修建道路使得城市之间相互联通。蒜头君是一个不会规划的人,他不知道哪些城市之间必须要有道路,所以对于任意两座城市之间,蒜头军会修建道路的概率为 p。请你计算一下最后修建出来的道路使得 n 坐城市都联通的概率。 1 <= n <= 20分析:用 F(n)F(n) 表示 nn 个点联通的概率,G(n)G(n) 表示 nn 个原创 2018-04-17 00:02:29 · 743 阅读 · 2 评论 -
【网络流24题】魔术球问题
题目:假设有n根柱子,现要按下述规则在这n根柱子中依次放入编号为1,2,3,…的球。(1)每次只能在某根柱子的最上面放球。(2)在同一根柱子中,任何2个相邻球的编号之和为完全平方数。试设计一个算法,计算出在n根柱子上最多能放多少个球。例如,在4 根柱子上最多可放11 个球。分析:枚举球数x,在图中建立节点1…x。如果 i < j,且 i+j是完全平方数,那么就建立一条 i 向 j...原创 2018-10-16 12:20:16 · 150 阅读 · 0 评论 -
bzoj入门4839 作诗
题目:神犇SJY虐完HEOI之后给傻×LYD出了一题:SHY是T国的公主,平时的一大爱好是作诗。由于时间紧迫,SHY作完诗之后还要虐OI,于是SHY找来一篇长度为N的文章,阅读M次,每次只阅读其中连续的一段[l,r],从这一段中选出一些汉字构成诗。因为SHY喜欢对偶,所以SHY规定最后选出的每个汉字都必须在[l,r]里出现了正偶数次。而且SHY认为选出的汉字的种类数(两个一样的汉字称为同一种)越...转载 2018-10-09 18:58:21 · 171 阅读 · 0 评论 -
2018-2019 ICPC, NEERC, CodeForces 1070C Cloud Computing(权值线段树)
题目:有n天,每天需要k个cpu。现在有m个供应商,第i个供应商可在[li,ri]天之间,每天提供ci个cpu,每个cpu价格为pi。如果某一天的cpu无论如何也凑不够,那就把仅有的全用上。问n天的最小花费。分析:最开始的想法是,把供应商按价格排序,然后依次取供应商去提供一个时间段的cpu。在线段树上想办法把这个时间段做一个区间减法。但发现其实在线段树上很难操作,很难知道供应商提供的区间哪...原创 2018-11-14 22:03:17 · 258 阅读 · 0 评论 -
ZOJ - 2314 Reactor Cooling(有上下界网络流)
题目:给n个点和m个边,每条边有流量上界和下界,问能否使这n个点形成一个流量循环,每个点流入等于流出,每条边都在界限之内。分析:典型的有上下界无源汇网络流。法一:建立源点 sss 和汇点 ttt , 对于图中每条边 &lt;u,v&gt;&lt;u, v&gt;<u,v> ,拆成如下三条:&lt;s,v&gt;&l...原创 2018-11-15 20:36:27 · 248 阅读 · 0 评论 -
2018-2019 ICPC, NEERC (CodeForces 1070A)Find a Number
题意:给两个整数d和s,求出最小的整数n满足n%d==0且n的每一位数字和是s。分析:令状态{i, j}表示对d取模为i,数字位数和为j时的最小数,因为是从小到大枚举,所以可以保证第一次到达{i0,js}的状态的数字就是最小值。代码:#include &lt;bits/stdc++.h&gt;using namespace std;#define ms(a,b) memset(a,b...原创 2018-11-13 19:27:00 · 212 阅读 · 0 评论 -
2018-2019 ICPC, NEERC(CF 1071I) Privatization of Roads in Berland
题目:n个点m条边,无穷多个公司,给每个公司最多分配两条边,每条边都要被分配出去,且每个点相连的所有的边所属的公司数不超过k。输出一种边分配方案。分析:记录每个点的度数,如果一个点的度数d[i] <= k,那么这个点相连的边无需合并,可直接给每个边分配一个公司(因为公司有无穷多个)如果一个点的度数d[i] > k,那么这个点的边至少要合并 2*(d[i]-k)条,而每条边只能被...原创 2018-11-13 17:52:12 · 320 阅读 · 0 评论 -
2017acm香港区域赛 Black and White
题目:有一个初始颜色全为白色的n*n的棋盘,每次选一个长方形区域反转颜色,问最后会有几个黑色格子。n,k&lt;=10000分析:和扫描线求面积并一样。记录每条横边,向x轴投影。只不过不区分上边和下边。按高度排序后,对于每条边,向x轴投影,将投影的区间进行一次 xor 1 的操作。所以线段树维护区间异或操作,然后每次询问区间和。代码:#include&lt;bits/stdc++.h&g...原创 2018-11-05 21:56:56 · 333 阅读 · 0 评论 -
hdu1828 Picture (线段树+扫描线)
题目:给n个矩形求周长并。分析:唯一需要注意的地方就是,对线段排序的时候不能单纯只考虑高度,还要考虑是上边还是下边。如果有一个上边和一个下边高度一样,那么应该让上边在前下边在后。代码:#include <bits/stdc++.h>using namespace std;#define ms(a,b) memset(a,b,sizeof(a))#define lson ...原创 2018-11-05 11:33:01 · 133 阅读 · 0 评论 -
hdu1542 Atlantis (线段树+扫描线)
题目:给n个矩形,求矩形的面积并。n <= 100分析:扫描线求面积并模板题。需要注意的是,线段树记录的不是点,而是边。数轴上若有 1-n 共 n 个点,则会切出 n - 1 条不能再切分的小线段,将这些线段从左至右依次标号为 1 - (n-1)。线段树的每个叶子节点就表示一条小线段。线段树避免同一段重复加的方法是:对于某一段,如果tag[rt] > 0,则不通过子树来更新值...原创 2018-11-05 00:31:30 · 110 阅读 · 0 评论 -
NWERC 2017 :Installing Apps(背包+贪心)
题目:有一个手机,容量为CCC,网上有NNN个app,每个app有个安装包大小did_idi,有个安装后的占用空间大小sis_isi,安装app是瞬间完成的,即app的占用空间可以瞬间由did_idi变成sis_isi,而不需要其他多余的空间。问这个手机最多可以安装多少个app,输出最多可以安装的app数量和安装顺序。分析:若 d < s,则 d 没有作用,只考虑 s 就可以...原创 2018-11-03 20:42:54 · 502 阅读 · 2 评论 -
背包路径记录方法总结
0-1背包记录路径:不要求字典序:法一:逆推状态,看这个状态是由哪个状态推过来的,从而找到上一个状态即可。可用额外的标记数组,也可不标记直接用f[][]数组求解。此时如果f数组被滚动优化成了一维,就无法倒推了。for(int i=1;i<=n;i++){ for(int j=V;j>=0;j--){ f[i][j] = f[i-1][j]; if(j < c[...原创 2018-11-01 17:14:54 · 1083 阅读 · 2 评论 -
2017acm香港区域赛 Optimal Coin Change(完全背包+记录路径)
题目:用几种面额的钱凑一个面额,问最少需要多少枚硬币。数量相同时尽量使用小面额,输出每个硬币用多少枚。输入的硬币已经按面额小到大排好序。分析:完全背包+路径输出。因为要尽可能使用小面额的硬币,所以在转移的时候:如果 f[j-a[i]] + 1 < f[j],肯定是要转移,记录状态j用的i硬币转移来的。如果 f[j-a[i]] + 1 = f[j],也要转移,因为f[j]不变的情...原创 2018-10-31 19:55:45 · 326 阅读 · 0 评论 -
hdu3032 Nim or not Nim? (sg打表找规律)
题目:标准Nim游戏的基础上,增加了一个操作:可以将某堆石子分成两堆。分析:将石子分为两堆的操作可视为两个子游戏,那么此时的sg值就是两个子游戏sg异或值。然后打表找规律即可。代码:打表代码:#include <bits/stdc++.h>using namespace std;#define ms(a,b) memset(a,b,sizeof(a))#define ...原创 2018-10-29 13:07:53 · 128 阅读 · 0 评论 -
【网络流24题】圆桌问题
题目:假设有来自m 个不同单位的代表参加一次国际会议。每个单位的代表数分别为ri (i =1,2,……,m)。会议餐厅共有n 张餐桌,每张餐桌可容纳ci (i =1,2,……,n)个代表就餐。为了使代表们充分交流,希望从同一个单位来的代表不在同一个餐桌就餐。试设计一个算法,给出满足要求的代表就餐方案。对于给定的代表数和餐桌数以及餐桌容量,编程计算满足要求的代表就餐方案。分析:源点S向每...原创 2018-10-16 19:50:25 · 286 阅读 · 0 评论 -
bzoj入门4839 蒲公英
题目:n个数m个询问,每个询问是一个[l,r],输出[l,r]之前的众数。有相同的输出小的。n <=40000,m<=50000,ai<=1e9分析:分块。预处理出f[i][j]表示第i个块到第j个块的众数。对于一个询问[l,r],中间整块的部分可以直接得到答案ans,然后对于两边的2*sqrt(n)个元素,查询出每个元素的出现次数,看是否能更新ans。至于,查找一个[l...原创 2018-10-09 21:00:00 · 285 阅读 · 0 评论 -
计蒜客2018蓝桥A组模拟赛(一)青出于蓝胜于蓝(dfs序+线段树)
题目:武当派一共有 n 人,门派内 n 人按照武功高低进行排名,武功最高的人排名第 1,次高的人排名第 2,… 武功最低的人排名第 n。现在我们用武功的排名来给每个人标号,除了祖师爷,每个人都有一个师父,每个人可能有多个徒弟。我们知道,武当派人才辈出,连祖师爷的武功都只能排行到 p。也就是说徒弟的武功是可能超过师父的,所谓的青出于蓝胜于蓝。请你帮忙计算每个人的所有子弟(包括徒弟的徒弟,徒弟的徒弟的徒原创 2018-04-16 22:58:38 · 310 阅读 · 0 评论 -
Codeforces896C Willem, Chtholly and Seniorious(出题人原创:ODT算法)
题目n个数,m个操作,操作分4种: 区间加一个数、区间赋值、区间第k小、区间幂次和 第三个操作第四个操作输出结果。 (1 ≤ n, m ≤ 1e5) 所有的数据都是随机的。分析:ODT算法适用于“将一段区间”推平的操作,将序列中连续的相同元素用一个三元组 (L,R,val) 表示,用set来维护。然后根据情况来合并或拆开某一个或几个三元组。通常维护的区间按照某种顺序排序,然后二分找到需要的区原创 2018-04-11 13:25:31 · 1095 阅读 · 0 评论 -
poj2752 Seek the Name, Seek the Fame(next数组的理解)
题目:在一个字符串中,输出那些既是后缀又是前缀的字符串的长度。分析:这个题就看next数组理解的深不深刻。 next其实是给字符串划分了对称性,大对称中套着小对称,小对称套着更小的对称。 两段长度为k的值是完全相同的,而两段k中各分为两段后,四段小蓝色部分也是相同的。这是个重要的性质。 nxt[j]就是长度为k的那一截,nxt[k-1]就是其中一截蓝色的。“递归”下去即可。代码:#incl原创 2017-09-08 02:06:59 · 226 阅读 · 0 评论 -
hdu2087 剪花布条(kmp基础变形)
题目:一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢?分析:唯一需要注意的是,比如aaaa中找aa,答案是2而并非3。也就是说,找到的子串是不能重叠的。 只需要修改kmp找子串的函数即可,当找到一个后,下次子串直接从0开始,而不是next[j-1]代码:#include <iostream>#inclu原创 2017-09-07 11:16:49 · 203 阅读 · 0 评论 -
poj2406 Power Strings(kmp求最小循环节)
题目:求出一个字符串的最小循环节的循环次数。分析:一个字符串的最小循环节就是len - next[len],这个字符串可以是最后一个循环节不完整的。 证明也很简单,把字符串看作是几个最小循环节连起来,最后再连一个循环节的一部分,称这部分叫“小尾巴”。然后next[len]肯定是尽可能长的匹配的,前缀是尽可能多的循环节加一个从循环节中抽出的小尾巴,后缀是尽可能多的循环节加小尾巴。画个图就很明显nex原创 2017-09-07 00:26:20 · 316 阅读 · 0 评论 -
hdu6154 CaoHaha's staff
题目:在一个网格纸上,小网格是 1 * 1的。每次可以画一笔,这一笔可以是边长1,也可以是对角线2√\sqrt2。每次询一个面积 s,问最少画几笔,可以画出一个面积不小于 s 的图形。分析:同样画一笔,2√\sqrt2显然比1长。画一个1*1的小正方形需要4笔,而画一个2√∗2√\sqrt2 *\sqrt2的面积为2的小正方形也需要4笔。所以,肯定是画边长2√\sqrt2的正方形。以下出现的“正方形原创 2017-08-23 14:18:11 · 213 阅读 · 0 评论 -
uva12338 Anti-Rhyme Pairs (字符串hash+二分)
题目:给N个字符串,Q组询问,每次询问(i,j),输出第 i 个串和第 j 个串的最长公共前缀长度。 N <= 1e5 ,L <= 1e4, N * L <= 1e6分析:这道题二分加字符串哈希很容易想到,没什么可说的。 两个注意的点:字符串的N和L给的很不舒服,没法直接开二位数组,可以考虑用string和vector。或者,把所有字符串存到一个1e6的一维数组中,只不过需要记录每个字符串的起原创 2017-09-04 22:07:29 · 183 阅读 · 0 评论 -
hdu4821 String (字符串hash + map)
题目:一个字符串S,找出 S 有几个子串满足如下要求:子串长度是M*L子串由M个长度为L的小子串相连而成。分析:最朴素的想法肯定是枚举1~n-L+1依次作为子串的开始,然后算出它之后的M个长度为L的串的值是否相同。这样的时间复杂度是O(n * M),不太能接受,尝试优化。 为了方便描述我们让M = L = 3 假设我们已经得到了以1开头的3个长L的串,###@@@^^^,现在想算下一个,只原创 2017-09-04 01:39:55 · 316 阅读 · 0 评论 -
hdu6078 Wavel Sequence(分析优化递推过程,好题)
题意:序列a有n个数,序列b有m个数。问,两个序列有多少个公共子序列满足“波浪状”。“波浪状”数组形如 a1 < a2 > a3 < a4 > a5 ……1 <= n,m <= 2000分析:看了一个博客分析的非常好 http://blog.csdn.net/weyoungg/article/details/76735843代码就是按照这个博主的思路,只不过用滚动数组把第一维滚掉了。代码:#inc原创 2017-08-14 00:47:05 · 195 阅读 · 0 评论