自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 51NOD 1188 数学

简略题意:求∑n−1i=1∑nj=i+1gcd(i,j)\sum_{i = 1}^{n - 1}\sum_{j=i+1}^{n} gcd(i, j)。∑n−1i=1∑nj=i+1gcd(i,j)\sum_{i = 1}^{n - 1} \sum_{j=i+1}^{n} gcd(i, j) =∑ni=1∑i−1j=1gcd(i,j)= \sum_{i = 1}^{n}\sum_{j = 1}^{i

2017-09-26 16:42:40 229

原创 51NOD 1179 数学

简略题意:给出n个数,求两两之间的最大公约数的最大值。枚举gcd即可,复杂度O(nlogn)O(nlogn)#include<bits/stdc++.h>using namespace std;typedef long long LL;namespace sss { int cnt[1100000]; int n; void solve() { scanf(

2017-09-26 16:25:35 145

原创 codeforces 864D 模拟 + 贪心

简略题意:给出n个数,所有数的值都在[1,n][1, n],可以选择某个数变成任意数。问至少需要几次才能将原序列变成一个排列,保证改变次数最小的情况下需要保证字典序最小。我们只需要记录哪些数没有出现过,这些数就必然会替换原来重复出现的数。 我们记录下所有重复出现的数出现的位置,从小到大去替换。我们需要讨论的就是当前位置的数应不应当被替换。 1. 若当前重复出现的数为x,我们打算用y去替换x。

2017-09-26 11:16:48 246

原创 codeforces 864C 模拟

简略题意:在一维坐标下,初始有一辆油量为b的车,每走1单位距离消耗1单位的油,在x=0的位置,向x=a的位置开去。在x=f的地方有一个加油站,可以把油加到b。每次从x=0到x=a或者从x=a到x=0,都记作一个行驶周期。问行驶k个周期至少需要加几次油。注意到k很小,因此模拟就可以了。 当k=1时,若b > f && b > a - f,必然可以。 当k = 2时,需要额外判定 b > 2 * (

2017-09-26 11:04:00 370

原创 codeforces 855C 树DP

简略题意:给出一颗树,有m种颜色,第k种颜色是特殊颜色,树上最多有x个特殊颜色点。 你需要把整个树染色,且保证特殊颜色节点以下条件: 1. 与其相连的不能有特殊颜色节点。 2. 与其相连的节点的颜色序号必须小于k。 问有多少种满足要求的树。这题的突破点在于x很小。 其实节点的颜色种类只有3种: 0. 能够和特殊颜色相连的点(小于k)。 1. 特殊颜色点(等于k)。 2. 特殊颜色外,

2017-09-26 10:48:00 1389

原创 codeforces 855E 数位DP

简略题意:每次询问[Li,Ri][Li, Ri]在bb进制下每种00 到 b−1b-1的数的个数都为偶数的个数,不包含前导0。典型的数位DP套路题,最多十个进制,对每个进制暴力进行数位DP。 考虑构造状态dp[bit][pos][sta][st]dp[bit][pos][sta][st],代表当前处理bitbit进制时,处理到第pospos个位置,状态为stasta,是否已经没有前导0。 对于每

2017-09-25 11:56:50 352

原创 BZOJ 1257 计数

题意:给出正整数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=7。f(n,k)=∑ni=1k%i=∑ni=1k−⌊k/i⌋=n∗k−∑ni=1⌊k/i⌋f(n

2017-09-25 11:43:07 190

原创 codeforces 855B DP

简略题意:给出pp, qq, rr,给出nn个数v[i]v[i],问i≤j≤k,max(p∗ai+q∗aj+r∗ak)i \leq j \leq k, max(p*a_i + q*a_j + r*a_k)。枚举aja_j,当0≤p0 \leq p,选取max(ai),i∈[1,j]max(ai), i \in [1, j], 否则选取min(ai),i∈[1,j]min(ai), i \in [1,

2017-09-25 11:39:10 375

原创 codeforces 855A 模拟

简略题意:给出n次询问,问之前的询问中是否出现个这个字符串。用map记录一下询问就可以了。#include <bits/stdc++.h>using namespace std;typedef long long LL;const int maxn = 110000;int n;map<string, int> M;int main() { scanf("%d", &n); for

2017-09-25 11:29:14 409

原创 codeforces 461B 树DP

题意:给出一棵树,每个节点的颜色为黑色或者白色,现在可以切割任意条边,使得答案这个树被分成若干块,每块至多一个黑色点。问方案数有多少。对于树dp,一般用dp[u]dp[u]表示当前u节点的子树的方案数,然后根据其与子节点的关系进行转移。 对于这题我们还需要记录,当前子树中是否已经有黑色点了,如果有,就可以切割,没有,就不能切割。这样状态的构造和转移都已经出来了。 dp[u][0/1]dp[u][

2017-09-25 11:27:50 225

原创 BZOJ 2002 分块

简略题意:某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏。游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系数ki,当绵羊达到第i个装置时,它会往后弹ki步,达到第i+ki个装置,若不存在第i+ki个装置,则绵羊被弹飞。绵羊想知道当它从第i个装置起步时,被弹几次后会被弹飞。为了使得游戏更有趣,Lostmonk

2017-09-22 22:55:52 180

原创 2017 ACMICPC Asia Regional Shenyang Online 个人题解汇总

截止2017.9.21,已完成[9/12].HDU 6194 后缀数组 HDU 6195 数学 HDU 6196 DP预处理 + 搜索 + 剪枝 HDU 6197 LIS HDU 6198 打表 + 矩阵快速幂 HDU 6199 DP HDU 6200 BCC + 并查集 + dfs序 + BIT HDU 6201 树形DP 或 最长路 HDU 6202 HDU 6203 贪心

2017-09-21 18:09:44 743

原创 HDU 6203 贪心 + LCA + dfs序 + BIT

简要题意:给出一个n+1n+1个点的树,以及若干个点对,需要断开一些点,使得这些点对路径不连通。输出应该断开的最少点数。我们断开一个点,能够影响到的是: 1.1.子树中过这个点的路径. 2.2.一个点在子树中,另一个点在祖先中的路径。为了使得以上两个影响尽可能的大,我们每次需要使得断开的点的子树尽可能大。 因此当我们打算断开一对点对(u,v)(u, v)的时候,为了使得断开的点的影响尽可能大,

2017-09-21 17:51:14 297

原创 HDU 6205 思维

简略题意:两人玩卡片游戏。 所有卡片被分成n堆,一共从左到右操作n次,每次A拿到手上a[i]张,B从A的手中拿走b[i]张。若某次B拿完了A手上的所有卡片,则游戏停止,否则游戏继续。A可以进行特殊操作,每次把第一堆移动到最后一堆。为了使得A拿的∑ni=1a[i]\sum_{i=1}^{n} a[i]最大化,问A最少需要进行多少次操作。因为∑ni=1a[i]=∑ni=1b[i]\sum_{i=1}^

2017-09-21 17:24:21 194

原创 BZOJ 2588 LCA + 主席树

简略题意:树上路径第K大。经典的LCA + 主席树问题。每次以父亲节点为上一版本建树,对于一次询问的答案就是在区间x−lca[x,y]+y−fa[lca[x,y]]x - lca[x, y] + y - fa[lca[x, y]]的答案。A了这题可以看一下加强版。#include <bits/stdc++.h>#define all(x) x.begin(), x.end()using name

2017-09-19 20:11:13 314

原创 BZOJ 2212 线段树启发式合并

简略题意:现在有一棵二叉树,所有非叶子节点都有两个孩子。在每个叶子节点上有一个权值(有n个叶子节点,满足这些权值为1..n的一个排列)。可以任意交换每个非叶子节点的左右孩子。要求进行一系列交换,使得最终所有叶子节点的权值按照遍历序写出来,逆序对个数最少。考虑题中的唯一操作,交换两个孩子。 对每个节点考虑两个孩子对答案的贡献:左孩子的贡献 + 右孩子的贡献 + 左孩子比右孩子大产生的贡献。 交换两

2017-09-19 17:14:33 503

原创 BZOJ 2653 可持久化线段树

大致题意:一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a, b从0开始标号,除法取下整。给你一个长度为n的序列s。回答Q个这样的询问:s的左端点在[a,b]之间,右端点在[c,d]之间的子序列中,最大的中位数。其中a < b < c < d。位置也从0开始标号。强制在线。对于中位数有一个性质,将所有大于等于他的数置为11, 小于他的数置为−1-1,则所有数的和00或11

2017-09-19 11:50:59 378

原创 BZOJ 3123 LCA + 主席树 + 启发式合并

大致题意:有两种操作。 1. 查询节点x到节点y的路径上的第k小。 2. 连接点x和点y。需要离散化不必多说。 对于第一种操作,经典的LCA + 主席树问题。每次以父亲节点为上一版本建树,对于一次询问的答案就是在区间x−lca[x,y]+y−fa[lca[x,y]]x - lca[x, y] + y - fa[lca[x, y]]的答案。 对于第二种操作,每次启发式合并即可。对于新加入的点,

2017-09-18 15:17:06 426

原创 HDU 6208 AC自动机 或 暴力?

简略题意:问是否存在一个串,其他串都是他的子串。看了题目之后,可以明确一点,极限数据的情况下,暴力一定过不了。 有可能成为目标串的一定是最长串,所有串建AC自动机,用最长串去匹配。如果匹配到了所有串,那么答案存在。 具体做法就是每访问到一个节点,都看当前节点是否能匹配到某个串,以及这个节点一直在fail树上跳转到根部的这段路径上是否能匹配上某个串。 这题卡自动机做法主要在两点: 1. 卡读入

2017-09-18 12:22:14 936 2

原创 HDU 6199 DP

简略题意:AA和BB玩游戏,AA先手。有nn个数,第ii个数的大小为v[i]v[i]。第一次能从左边取11或22个数,之后假如之前取了kk个数,下次必须取kk或k+1k+1个数。A想要他的值尽可能比对方大,而B想要他的值尽可能比对方小。两人轮流行动,问最终结果是多少。Alice wants to maximize the difference while Bob wants to minimize

2017-09-14 18:35:23 304

原创 HDU 6201 树形DP 或 最长路

简略题意: nn个节点,n−1n-1条边,每个节点有一个点权v[i]v[i],代表这个点的物品售价。 每条边有一个权值,代表走这条路的花费。问从任意一点购买,在任意一点卖出的最高收益是多少。解法11:因为我们不知道从哪点出发到哪点终止。因此虚拟一个起点,一个终点,起点连接所有的节点,权值为−v[i]-v[i],代表买入的代价。 所有节点再连向终点,权值为v[i]v[i],代表卖出的收益。每条边

2017-09-14 17:56:11 305

原创 HDU6198 矩阵快速幂

简略题意:问kk个斐波那契数不能组成的最小的数是多少。DP打个表,发现规律很显然是f(2∗k+3)−1f(2*k+3)-1…#include <bits/stdc++.h>using namespace std;typedef long long LL;const LL mod = 998244353;const int maxn = 2;struct Matrix{ int a[maxn

2017-09-13 21:33:44 281

原创 HDU 6197 LIS

简略题意:问把一个长度为nn的数组,去除掉kk个数,剩下的能不能构成非递增或非递减序列。换一个角度理解题意就是:问原数组是不是存在长度大于等于n−kn-k的非降或者非增序列。就是很简单的LIS问题了。#include <bits/stdc++.h>using namespace std;const int N = 1e5+10;int t, n, k;vector<int> V;namespac

2017-09-13 14:46:27 260

原创 HDU 6195 数学

简略题意:MM个物品,KK个光源。要求任意取KK个物品都能被KK个光源照到,问至少需要多少电缆。看了下样例,大致知道怎么构造的,我们首先取出K个物品,使得物品和光源一一对应。为了满足题意,身下的所有物品都得连上所有的光源。 Ans=(M−K)∗K+KAns = (M - K) * K + K。 但是为什么这是最优解呢? 希望知道的人能够在下面评论一下,谢谢。#include <bits/std

2017-09-13 14:42:43 268

原创 HDU 6196 卡时搜索

简略题意:Bob和孩子玩游戏,孩子先手,每次他们从数组的两端取数。孩子每次都会取左右中最大的数,Bob任取。问能否让孩子获胜,且两人的分数差尽可能小。这题我不会,但是很多人过了,即使是折半枚举复杂度也还是很高,那就爆搜之后剪枝吧。区间的极大极小值可以区间DP预处理得到。 对于某个状态(l,r,val)(l, r, val),代表当前还能取[l,r][l, r]区间,Bob和孩子的差值为val。

2017-09-13 13:47:07 366

原创 HDU6194 后缀数组

简略题意:问在一个字符串中出现次数等于k次的子串有多少种。考虑按kk对height进行分组,则当前分组对答案的贡献为: 组内所有元素的的max(0, LCP - max(组内第一个元素与之前元素的LCP, 组内最后一个元素与之后元素的LCP))。 举例来看就是: k=2k = 2 *1. abcabc *2. abcabcabcabc *3. abcabcabcabcabcabc *4

2017-09-13 11:54:10 899

原创 后缀数组小结

其实下定决心刷后缀数组还是因为沈阳王赛第一题从开始卡到结尾…最后发现了板子错了。 觉得自己的后缀数组已经忘得差不多了,重新拿出来刷一刷。 参考资料:国家集训队2009论文集后缀数组——处理字符 后缀数组这里顺便一提,之前我一直使用的是O(nlogn)O(nlogn)的倍增模板,我原以为已经够用了,结果在多校和网络赛频繁被卡,然而DC3的常数也非常大,对此我感到非常苦恼啊,直到我发现了后缀数组的

2017-09-13 10:46:40 359

原创 POJ 1226 后缀数组 或 KMP 或 暴力

简略题意:出现或反转后出现在每个字符串中的最长字符串。先将每个串和自己的反转串连接起来,随后将这若干个串连接起来。二分答案,判定就分组看是否有一组后缀在所有原串或者原串的反转串中出现。#include <iostream>#include <cstring>#include <map>#include <cstdio>#include <vector>#include <algorithm

2017-09-13 10:00:22 231

原创 SPOJ 220 后缀数组

简略题意:每个字符串中至少出现两次,且不重叠的最长子串先将nn个字符串连接起来,二分答案tt,用tt分组之后看同一组的是否出现在所有串中至少两次,且在每个原串中的最大最小sa[i]−sa[j]>=ksa[i]-sa[j]>=k。其实只要同时存在最大最小位置,即出现了至少两次。#include <iostream>#include <cstring>#include <map>#include

2017-09-12 17:43:54 220

原创 POJ 3294 后缀数组

简略题意:求出现在不少于k个字符串的最长子串。先将nn个字符串用不同的字符连接起来,二分答案tt,用tt分组之后看同一组的是否出现在不少于kk个原串中。 麻烦的是要输出答案,因此还是要仔细做。#include <iostream>#include <cstring>#include <map>#include <cstdio>#include <vector>#include <algo

2017-09-12 17:40:16 234

原创 POJ 3415 后缀数组 + 单调栈

简略题意:求两个串长度不小于k的公共子串的个数。 我喜欢这题! 首先按height分组,随后对于每个A后缀,看之前出现的B后缀与其的LCP,若其长度为xx,则对答案的贡献为x−k+1x-k+1。暴力查找n2n^2, 其实B后缀的排名越接近当前A后缀,两者的LCP越高 想一想,为什么, 因此维护一个单调栈,以及栈内元素贡献总和。显然从栈底到栈顶元素逐渐增大。对A统计完答案之后再对B统计一次即可。#

2017-09-12 17:36:21 265

原创 POJ 2774 后缀数组

简略题意:求两个字符串的最长公共子串其实解法和51NOD 1089 最长回文子串一样…#include <iostream>#include <cstring>#include <map>#include <cstdio>#include <vector>#include <algorithm>using namespace std;const int N = 2e5+10;int n;

2017-09-12 17:29:38 241

原创 POJ 3693 后缀数组

简略题意:求一个字符串中的重复次数最多的连续重复子串。 如(“dababab”,答案为3),要求输出字典序最小的那个。论文里已经说了大致解法了,还需要补充一些。 对于向后扩展,可以用LCP,而对于向前扩展,暴力扩展即可,按照我们枚举的方式,显然可以证明向前扩展不会超过L。现在,我们得到了最大重复次数,还需要得到字典序最小的串。 其实我卡在这里了,我把所有能组成的串全部提取出来,用strin

2017-09-12 17:25:52 219

原创 POJ 2406 后缀数组 或 KMP

简略题意:求解一个连续重复串的最大重复次数。连续重复串:如果一个字符串L由字符串S重复R次得到,那么L是一个连续重复串,R是这个字符串的重复次数。KMP的解法和后缀数组异曲同工。 不过为了练习后缀数组,这里只说后缀数组的解法。吐槽一下: 虽然是KMP的水题,不过用后缀数组写起来还是很烦的。 1. 卡时间,倍增的后缀数组过不去。 2. 卡空间,因为串很长,所以不能用一般O(nlogn)O(nl

2017-09-12 17:18:11 331

原创 51NOD 1089 后缀数组 或 manacher

简略题意:求解最长回文子串。经典问题,为了练习后缀数组再写一遍吧。 将原串和原串的反转串用没用过的字符拼接起来,发现原问题等价于求最大height[i], 且sa[i-1]和sa[i]分别在原串和反转串中。 复杂度O(nlogn) 嘿嘿嘿,刚从uoj搞了个sais的板子 复杂度O(n)。#include <iostream>#include <cstring>#include <map>

2017-09-12 17:10:16 211

原创 SPOJ 694 后缀数组

简略题意:求不相同的子串的个数。求出sa之后,会发现每按名次加入一个后缀,会产生n-sa[i]个新的子串,其中有height[i]个之前已经出现过。答案为n-sa[i]+height[i]。#include <iostream>#include <cstring>#include <map>#include <cstdio>#include <vector>#include <algori

2017-09-12 17:04:01 260

原创 POJ 3261 后缀数组

简略题意:求可重叠的至少出现t次的最长重复子串。 (数值好像很大啊,我们来离散化一下吧) 先二分长度k,随后按照height不小于k分组,若存在一组的个数不小于t即可满足条件。#include <iostream>#include <cstring>#include <map>#include <cstdio>#include <vector>#include <algorithm>u

2017-09-12 17:00:28 227

原创 POJ 1743 后缀数组

简略题意:求不可重叠的最长重复子串。这题有以下坑点。 1. 给出的n个数不是我们要处理的串,差方之后的串才是。 2. 不可重叠指的是原数组之间不可重叠,例如”1 2 3 4 5 6 7 8 9”的答案为0,而不是5。注意之后,我们只需要二分答案k,按height不小于k分组,存在一组最大最小位置差大于k即可(不能为k,理由见坑点2)。复杂度O(nlogn)。#include <iostream>

2017-09-12 16:53:57 179

原创 BZOJ 2434 ac自动机fail树+dfs序+树状数组+离线处理

简略题意:中文题目丢链接跑先考虑建立acac自动机,PP代表当前节点为终止节点,BB代表返回父亲节点。 这样就可以O(n)O(n)建树。 问第xx个字符串在yy中出现多少次,相当于问rootroot到yy这条路径每个点不停在fail上走,能到达多少次xx。 所以我们相当于在fail树上询问,rootroot到yy这条路径上有多少点在xx的子树中。 对于一个询问,我们只需要把rootroot到

2017-09-08 23:40:14 379

原创 codeforces 632E FFT快速幂优化

简略题意:nn种物品,每种物品有对应的权值,每种物品的数量没有限制。现在问取kk个物品能够组成的权值有哪些。假若只能取两个物品,就是一个很经典的生成函数问题,相当于做一次多项式乘法,可以用FFT去优化这个过程。现在我们做kk次多项式乘法,就可以用快速幂去加速这个过程。 复杂度O(maxv∗k∗log(maxv∗logk)∗log(k))O(maxv*k*log(maxv*logk)*log(k))

2017-09-07 14:27:10 400

空空如也

空空如也

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

TA关注的人

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