自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 BZOJ 2301 莫比乌斯反演

题意:对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数。。将一个询问拆成四个询问,原问题即为: ∑ni=1∑mi=1[gcd(i,j)=k]\sum_{i=1}^{n}\sum_{i=1}^{m}[gcd(i, j) = k]。令f(k)f(k)为gcd(i,j)=kgcd(i, j) = k的方案数

2017-09-28 20:34:37 188

原创 BZOJ 1066 / POJ 2732 最大流

题意:在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外。 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴可以跳到平面距离不超过d的任何一个石柱上。石柱都不稳定,每次当蜥蜴跳跃时,所离开的石柱高度减1,如果该石柱原来高度为1,则蜥蜴离开后消失,以后其他蜥蜴不能落脚。任何时刻不能有两只蜥蜴在同一个石柱上。每个柱子拆点限制容量,对每个点对

2017-09-28 18:16:20 223

原创 BZOJ 1088 模拟

题意:现在棋盘是n×2的扫雷游戏,第一列里面某些格子是雷,而第二列没有雷。由于第一列的雷可能有多种方案满足第二列的数的限制,你的任务即根据第二列的信息确定第一列雷有多少种摆放方案。只要确定了第一行的前两列是什么,后面都可以唯一确定。因此讨论一下即可。#include <bits/stdc++.h>using namespace std;namespace solver { int n, t[

2017-09-28 16:17:50 213

原创 codeforces 864D 莫比乌斯反演

简略题意:给出nn个数,任选kk个数,若gcd(a1,a2...ak)>1gcd(a1, a2 ... ak) > 1, 他们对答案的贡献是k∗gcd(a1,a2...ak)k*gcd(a1, a2 ... ak),问所有可能的方案的总贡献是多少。枚举gcdgcd,那么我们要计算的就是当前gcdgcd对答案的贡献。 令f(i)f(i)为所有方案中gcd=igcd = i对答案的贡献,F(i)F(i

2017-09-28 14:37:54 361

原创 BZOJ 2005 莫比乌斯反演

简略题意:∑ni=1∑mj=1(2∗gcd(i,j)−1)\sum_{i = 1}^{n}\sum_{j = 1}^{m} (2*gcd(i, j)-1)假设n<mn < m, ∑ni=1∑mj=1(2∗gcd(i,j)−1)\sum_{i = 1}^{n}\sum_{j = 1}^{m} (2*gcd(i, j)-1) =−n∗m+2∗(∑ni=1∑mj=1gcd(i,j))= - n * m

2017-09-28 11:48:52 170

原创 BZOJ1061 费用流

题意:有一项工作需要n天完成,第i天需要AiA_i个人来工作。 有m种人可以雇佣,第i种人工作Si−>TiS_i ->Ti天,雇佣费用CiC_i。 问最少花费多少天完成工作。本意是想学单纯形做的这个题目,结果学到了费用流的强大建图。抽取题目中的有用信息可以得到: 令雇佣第i类志愿者的数目为Xi令雇佣第i类志愿者的数目为X_i。 Minimum:∑Mi=1Ci∗Xi,Xi≥0|i∈[1,m]M

2017-09-27 14:10:11 702

原创 codeforces 864E 背包

简略题意:若干个物品暴露在大火中,拯救第i个物品需要消耗tit_i时间,在did_i时这个物品就会被烧掉,这个物品的价值为viv_i,问能救下的物品价值最大是多少。首先要让物品有序,被烧毁的时间就是天然的序,按摧毁时间排序之后就是基础的DP。 dp[i][j]dp[i][j]代表当前处理到第i个物品,需要花费的时间是j,直接枚举之前救下的的物品转移即可。#include<bits/stdc++.h

2017-09-26 18:03:18 262

原创 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 238

原创 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 155

原创 codeforces 864D 模拟 + 贪心

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

2017-09-26 11:16:48 266

原创 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 376

原创 codeforces 855C 树DP

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

2017-09-26 10:48:00 1421

原创 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 366

原创 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 200

原创 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 388

原创 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 425

原创 codeforces 461B 树DP

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

2017-09-25 11:27:50 238

原创 BZOJ 2002 分块

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

2017-09-22 22:55:52 191

原创 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 752

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

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

2017-09-21 17:51:14 329

原创 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 209

原创 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 330

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

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

2017-09-19 17:14:33 516

原创 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 393

原创 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 458

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

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

2017-09-18 12:22:14 983 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 336

原创 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 320

原创 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 310

原创 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 294

原创 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 302

原创 HDU 6196 卡时搜索

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

2017-09-13 13:47:07 399

原创 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 932

原创 后缀数组小结

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

2017-09-13 10:46:40 366

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

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

2017-09-13 10:00:22 260

原创 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 228

原创 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 266

原创 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 304

原创 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 278

原创 POJ 3693 后缀数组

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

2017-09-12 17:25:52 257

空空如也

空空如也

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

TA关注的人

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