- 博客(62)
- 收藏
- 关注
原创 hdu 6710 2019 CCPC 网络赛 09题
题意:就是给你一个二分图,左右两边两点之间存在边的概率是0.5,问两点的期望距离是多少?思路:组合数学和dp。设dp[i][j][k][l]第一个状态是当前的步长第二个状态是左边还有多少个点没链接第三个状态是右边还有多少个点没链接第四个状态是当前可用来链接下一批的点是多少个举一个转移的例子,当我们从第一个点出发可以链接到右边的m个点(不包含终点),则第二个状...
2019-08-24 11:12:15
437
原创 CodeForces - 1182D
题意:找到一个点作根,使同一深度的点有相同数目的边。思路:经过简单的观察,实际上这样的树有一个特征:当某一个点作根符合题目要求时,每个相同深度的节点其子树的节点数目是相同的,或者是每个相同深度的节点作根,其子树结构相同。那么答案只有两种情况,一种是叶子,一种是某个点(唯一一个),其每一个所连接的子树的节点数目相等。因此面对判断一个点是否是答案的难题,可以比较每个节点作根时其子树节...
2019-06-21 18:52:08
411
原创 CodeForces - 809C
思路:从起始点开始,每隔(2^n)*(2^n)(n为任意正整数)矩阵之间,不同矩阵中数的和之差为n*n*n,而连续个x个(2^n)*m矩阵之和为(1+x*2^n)*x*2^n/2,因此我们可以快速统计连续2^n区间和,对k进行切割即可。#include <bits/stdc++.h>using namespace std;#define MOD 1000000007#de...
2019-03-28 12:29:44
198
原创 CodeForces - 1117G
思路:如果我们只考虑一个点在一个区间内所提供的贡献,那么只要需要知道左第一个比他大的数离他的距离和右边第一个数比他的距离即可。而两边处理步骤是一样的,因此,可以先算完左边,在算右边。首先先对询问离散化处理,然后使用单调队列预处理出每个点最左或最右的位置,然后使用两个树状数组储存,并计算答案。#include <bits/stdc++.h>using namespace std;...
2019-02-23 10:15:38
203
原创 CodeForces - 1101G
题意:洛谷有中文题意,链接:https://www.luogu.org/problemnew/show/CF1101G思路:其实考虑到子集之间异或最多能够产生的数的数目其实是2^32,而且就是只需要32个数就可以了,所以答案小于32。而转换为二进制以后长度也就32。将其转换位多元一次方程组之后,发现如果子集之间是线性无关的话,必然是满足要求,而矩阵不管怎么变换,秩是不会变的,而且秩也小于32,...
2019-01-25 10:14:28
171
原创 CodeForces - 1101F
题意:洛谷有中文题意,链接:https://www.luogu.org/problemnew/show/CF1101F思路:只考虑一辆车,我们可以很简单的使用二分操作对V进行二分找到答案,运行的时间是可以接受的。因为目前车的数目太多了,我们无法直接进行二分操作,所以我们考虑使用的是一辆车一辆车的V,一步一步地提升V。但是考虑到极端地情况下,复杂度依然很高。其实我们发现其实最终的V只取决于其中一...
2019-01-25 09:54:16
243
原创 CodeForces - 1065F
题目:就是问一次牌子最多能遍历多少个不同的叶子节点。思路:假如牌子会落在当前位置的某颗子树上的一个叶子,那么就需要先统计好其他子树上可以到达并且返回的叶子节点数,然后枚举完所有叶子的可能即可。(如果牌子在两个叶子能上升到达同一个节点,那么他们最高到达的节点是一样的)#include <cstdio>#include <string.h>#include &...
2018-10-20 10:52:24
217
原创 CodeForces - 1009F
思路:对于每个节点,只要统计得出当前深度最小数量最多的深度。暴力的写法就是每次对于这个子树全部搜索。但实际上可以使用启发式合并,每次合并的时候加上小树的深度,顺便判断一下是否答案更新。#include <bits/stdc++.h>using namespace std;#define MAX 1000010int n;vector<int> e[MAX]...
2018-08-12 14:37:30
279
原创 CodeForces - 675E
题意:一开始 你在第一个站 现在告诉每个站可以买一张票去其他地方(只能去比他坐标大的) 最后一个站没有卖n表示 有n张车站于是有n-1张车票车票ai 表示这张车票可以从 i 车站出发 去 i+1 车站到 ai车站的任意一个车站 现在 假设 pij 表示从i 到 j 的车站 最小用票数量求所有的pij的和思路:假设我
2017-09-08 13:41:00
300
原创 codeforces 813e 莫队算法
题意:给你一个区间 问你有总共多少个元素 ? 但是有一个条件 就是如果这个元素超过k个 当k个来算思路:由于题目限制,所以只能是在线算法。如果知道一个区间,往左端加入一个点,只要知道这个的往右数第k个和它相同的数是否在这个区间么就可以了,右端同理。然后计算了一下复杂度和条件,发现可以使用莫队算法。ps:其实可以使用在线的主席树,当时没想到,而且由于只记得莫队算法的思想,所以
2017-06-30 10:29:26
288
原创 codeforces 811C Vladik and Memorable Trip
题意:选择n个区间内所有的元素不能在外部出现,求所有各区间内的集合元素异或和?思路:先预处理可行的区间,然后扫一波即可。#include #include #include #include #include #include #include #include using namespace std;#define LL long longconst
2017-05-27 22:47:15
324
原创 codeforces 556D Case of Fugitive
题意:一条线上有个n个大陆,范围给定且不相交,现在要邻近的大陆搭n-1座桥(桥的两段要在大陆上),给你m座桥的长度,问你怎么分配?思路:其实就是n-1个区间和m个数,从m个数里面挑n-1个数一一对应区间,这个要求不小于左区间,不大于右区间。先对区间的左区间排序,从假设从1开始走,如果遇到左区间就塞入区间,如果遇到超出区间范围就剔除(就是没有匹配到,输出no了),但是如果遇到
2017-05-25 15:11:43
453
原创 codeforces 803G Periodic RMQ Problem
题意:放大版的区间更新的线段树题解:由于实际上操作并不会生成太多节点,而且只有更新才会生成新节点,如果查询的时候发现下面并没有节点,就知道下面没有更新而且原来数组是循环的,所以直接得到答案,如果更新过就会有节点生成,就如同原来一样计算就行,更新操作就像如同原来的线段树一样,只是如果当前节点不存在就给他生成一个。ps:看到有人是用离线算法写的,有兴趣的同学可以去学习下姿势。
2017-05-25 14:57:20
252
原创 codeforces 786c Till I Collapse
题目:将这个数列分割成m段,每一段里面数的种类不超过k,现在询问当 k在[1,n]之间时,对应的m去最小,分别是多少?思路:首先计算所有的集合数量到底有多少 n+n/2+n/3+n/4+n/5.....大约是
2017-05-25 14:41:52
483
原创 codeforces 757e Bash Plays with Functions
题意:给你两个数 n和r 可以做r次分解当r大于0 n可以分解成两个因子u和v u*v=n 当r 等于0 n分解出的两个因子的gcd要为1如题意所给的公式来计算最终结果思路:仔细观察 在 r相同的情况下 25 和 4 30和42 的答案是相同是由于 他们的构成结构相同 即n=(a^x)*(b^y)*(c^z) ...
2017-02-09 19:09:53
568
原创 codeforces 722D. Generating Sets
题意:X集合的数 可以有两种方式变换Y 现在给你一个集合Y 求X 且这个X的里最大的数 尽可能小 (由于是集合 所以集合里的元素相同)思路:贪心假设现在是 a>d>b>c 但是a和d有可能变到c由于我们是要把最大的数变的尽可能小 所以对于任意情况下 必然是变化a比较合适 但如果a都变不了其实就代表结束了#include #include #inc
2016-10-02 02:01:59
605
原创 codeforces 713C
题意:就是把一个数列变成严格递增的数列 求最小花费思路:直接考虑结果的整个数列 必然存在那么几个数 他是从始至终 都没有变过 那么假设有一些数会受到这个数影响 比如一个数ai不变 如果aj 是受ai影响 那么就会消耗 abs(ai-i-aj+j) 那么我把每一个ai-i设为一个基准线 那么dp[ai-i]就是当前基准线花费最小的情况 既可获得答案 #incl
2016-09-29 16:42:52
641
原创 codeforces 717E - Paint it really, really dark gray
题意:给你一颗树 每个节点有黑色 或者 粉色 现在从第一个节点出发 每次经过一个节点 就把他颜色变成另一种颜色 求问全部颜色变成黑色的路径 spj思路:每个点最好只处理一次这样既方便又快捷 而如果最下面的叶子节点 是粉色 肯定要过去的 到达底部要 回溯回去 同理先处理好他的所有子树 如果是粉树 那么直接回去涂起来如果是黑树(如果根节点就直接结束了) 那么最后自己由于不知
2016-09-15 18:17:40
454
原创 codeforces 712d
题意:就是a,b玩游戏,a的起始分数为a,b的起始分数为b,每一轮两个都随机加 [-k k]的一个数 问你a比b的结果有几种思路:因为两个人不互相干扰 看了一下数据范围 直接记下了每一轮的状态 即dp[i][j]表示第i轮有j分数有多少 最后比较一下 ps:虽然很容易想 但是太暴力了 一点都不优雅 后来发现有很简单的快的方法#include #inclu
2016-09-11 19:03:37
420
原创 codeforces 710e
题意:一个空文本 可以删除一个字符a 也可以增加一个字符a 或者复制整个字符串 问如何到达长度为n思路:因为一开始没看到有删除功能直接扑了,以为是简单dp,所以直接错了两发T^T。那么只要多判断有删除的就好了。 如果要后面j个点如果要返回i点的话需要的是到val的最小距离-(j-i)*操作1的值,那么我们把他们记在一个队列里,每次拿出用操作1回到原点最小代价的那个就ok,然后再删除掉
2016-09-04 10:53:03
274
原创 Codeforces 659G Fence Divercity
题意:有n个墙连续在一起 每个高度为ai个砖块 现在要拆砖块,拆的砖块要连着,而且不能拆最下面能一个和要从最上面那个砖块开始拆,问有几种方案。思路:只要每次记录一个前面传导到当前墙壁高度可以连着的值 就可以算出了答案了#include #include using namespace std;#define MAX 1000010#define LL
2016-07-17 08:14:04
269
原创 CodeForces - 675E
题意:一开始 你在第一个站 现在告诉每个站可以买一张票去其他地方(只能去比他坐标大的) 最后一个站没有卖n表示 有n张车站于是有n-1张车票车票ai 表示这张车票可以从 i 车站出发 去 i+1 车站到 ai车站的任意一个车站 现在 假设 pij 表示从i 到 j 的车站 最小用票数量求所有的pij的和思路:假设我
2016-07-13 21:51:02
307
原创 codeforces 641D. Little Artem and Random Variable
pi 表示两个骰子只有 (1 2 3......i) 出现概率 pi= max1+max2+max3+.....maxisuma_i 表示第一个骰子只有 (1 2 3......i) 出现概率和sumb_i 表示第两个骰子只有 (1 2 3......i) 出现概率和qi 表示只有 (i i+1 i+2.....n)出现前面的概率qi=1-
2016-07-11 22:26:41
663
原创 codeforces 645e
题意:在原字符串加上n个字符(1e6) 使得他的不同子串数量最多 字符范围为k思路:先考虑放一个字符 会有生成多少个新字串 ,那么我们来统计现在如果包含这个字符的子串,由于这个字符是放在最后的,所以,字串增加数量就是*2,但是有重复的部分没有减去,那么什么字串会重复呢? 由于是最后一个字符,所以重复的肯定是上次出现字符放到最后以后形成的所有子串,那么减去这个数,就可以得出新加了多少
2016-03-23 10:21:57
485
原创 codeforces 650d Zip-line
题意:求改变原数列的一个数以后 最长上升子序列的长度,询问之间没有联系。思路:设原序列的lis为k,那么答案只有k-1,k,k+1三种。这里有一个结论,如果一个数在lis之中,那么他在lis的位置是一定的。所以只要判断在这个位置上有多少个数就可以知道这个数是否在原序列的lis是必须的。如果是必须的,那么在没有这个数的lis就是k-1,否则就是k。那么接下来只要求出有这个数的数列的lis
2016-03-22 13:35:19
475
原创 codeforces 282e
题意:选一个前缀数列异或和 和 一个 后缀数列异或和 (不能重叠,长度可为0)求他们异或的最大值思路:第一次接触字典树的这种用法T T,可以快速查找一个集合里面和他异或和最大的数,那只要从左到右 往前推一次 就好#include#include#include#include#include#includeusing namespace std;#define LL
2016-03-08 15:03:09
368
原创 codeforces 464c 465e
题意:给你一个数字 然后每次改变一种数 问你最后数字MOD 10e9+7 是多少?思路:我们只要知道某种数最后变成怎么样就好。所以我是从最后一次变化往上推,每一次要变的那种数都是向下一次取得数据进行改造。#include#include#include#include#include#include#includeusing namespace std;
2016-02-26 15:21:14
478
原创 codeforces 628e
好像是被我水过了 因为题目给了5s题意:问图像中到底有多少个z型图像。思路:对于每一个点都有可能是最左下角的点,那么把对于每一个 斜边 看成大区间 区间每一个点都是都有两个值 一个是能到右边的最远距离 一个是到左边的最远距离+i(加权)只要对于每一个点的答案是把右边的最远距离作为区间长度 统计出区间 左边是否能满足比如 3x3zzz.z.
2016-02-24 17:10:10
544
原创 codeforces 626f
这题不会写 看了官方题解才知道 T T 感觉涨姿势了 题意:将数据分成若干组 每组的价值为最大值减去最小值 问不超过可k的方案数 有多少种?思路:虽然我知道是一道dp题目,但是第二个状态总是朦朦胧胧想不出来 首先对数据排序dp状态分为三种:第一个状态是当前是哪个数据了第二个状态是当前还有几组(这些组代表了一定要加)第三个状态是当前至少还会加多少值
2016-02-22 15:54:58
750
原创 codeforces 624d 623b Array GCD
过年玩了20天 都不会写了题意:有两种操作,每种只能用一次,第一种对于一段连续区间进行移除(不能全删完),代价是长度*a,第二种是对于一些数进行+1或者-1,使得最后的剩余的最大公约数大于1思路:由于不能全删完,所以至少会有一个数留着,这个数肯定会是头一个或最后一个,最大公约数肯定是在选中的这个数最后状态中的一个约数,而我们只要先枚举这个数是多少(一共6种),然后枚举他的
2016-02-19 17:04:24
658
原创 codeforces 620e
题意:给你一颗树 (一开始染好色的) 给你两种操作 一种是把当前节点和他的子树染成同一种颜色 还有一种是查询他和他的子树 到底有多少种不同的颜色?思路:假设 他是一根直线 那么就是线段树 区间操作染色 中间合并就是或操作即可 因为他的染色方案不多 但是转换成一棵树的话 我们先进行一次深搜 由于深搜方式可以使得他和他的子节点的编号是连续的 所以就可以使用直线的方法一开始 看题是对树的区
2016-01-28 15:51:45
375
原创 codeforces 617e
题意:m个区间询问 问数组中 区间范围为 l,r 问在区间中 ai, ai + 1, ..., aj =k 的数量思路:对于 ai^ai+1^ai+2....=(a1^a2^..ai-1)^ (a1^a2^..ai^ai+1^ai+2) 即两个端点x-1和y的 前缀异或和的异或和 ,而每次压入一点,假设他的前缀是A 增加的数量就是 当前位置上有多少个 A^k即是增加的数量
2016-01-26 17:18:10
547
原创 codeforces 338e
题意:根据伪代码 求出答案思路:其实他要我们求的是一个符合他条件 a[] 的连续的子串有多少个 这个字串必须满足一个条件 就是经过和b[]任意的匹配后 每一对数之和需要大于等于 一个特定的值 那么 最优的方案就是贪心 子串最大的 和 最小的b[]的匹配 第二大和第二小的 。。。。 如此匹配 虽然源代码得到的最后匹配不是这个 但是如果不满足这个方案 就肯定无解对于每个a[] 我们可以从
2016-01-22 13:28:24
417
原创 codeforces 557d
题意:给你一幅图 问给至少还要几条边 使得这个图还存在奇环。思路:如果是只存在一个偶环 那么表示为二分图 那么图的左边的点之间有联通 那么只需要选择左边任意两个点加上一条边 就可以构成奇环 同理可以算出所有答案。当然还有2种特殊情况 一种是 左边点不联通和 没有边的情况,这些另作考虑(看不懂题目 去查题意 结果看到二分图 于是。。。)#include#i
2016-01-19 16:49:56
406
原创 codeforces 581d
题意:问三个矩形能不能组成一个正方形思路:其实就只有题目给的那2种情况,枚举每个放的情况和顺序就好了#include#include#include#include#include#include#includeusing namespace std;#define N 2000010#define lim 200000#define MOD 10000
2016-01-18 16:00:57
356
原创 codeforces 616D Longest k-Good Segment
题意:求一个最长连续的不同元素数量不超过k的序列思路:利用一个窗口滑动,左端点表示当前位置,右端点表示目前这段数列符合要求, 每增加一个长度,判断是否合理,不然平移左端点。#include#include#include#include#include#include#includeusing namespace std;#define N 1000010
2016-01-15 10:08:23
418
原创 codeforces 616E - Sum of Remainders
题意:计算 n mod 1+n mod 2 + ... n mod m 思路:其实计算 n mod x 可以转换为 n - [n/x]*x n/x=i 是一个连续的范围 比如 10/4 =2 10/5=2 我们只要计算出 n/x=i 的一个范围 ,就可以用等差公式求和了 ps :上网查了一下 有开方的策略 好像才是正确姿势 = = 代码太丑 爆了好多次LL #i
2016-01-15 09:28:28
473
原创 codeforce 590d
思路:从最后一个数开始考虑,是否放入 k-数列 中,因为后面的数不影响前面的数,并且总步数不超过n*n。#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define LL long longint...
2015-11-04 14:52:59
389
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人