codeforces
菜得不行的sb
摸了
展开
-
Educational Codeforces Round 58 (Rated for Div. 2) F (单调dp)
http://codeforces.com/contest/1101/problem/F容易发现对于每种起点终点组合的种类数很少所以考虑对于不同组合的最优答案用dp[ i ][ j ][ k ] 记录对于一个起点 i 到终点 j 分成 k+ 1段其中的最大值对于每个车的最优答案就是 c * dp[ s ][ f ][ r ]假如分成k段的话 可以考虑枚举最后一段或者最前一段假如断点是p...原创 2019-01-12 15:53:24 · 202 阅读 · 0 评论 -
Codeforces Round #441 (Div. 1, by Moscow Team Olympiad) C. National Property CF875C
其实就是检查第i 跟 i+1 序列是否合法 合法就不理它 如果不合法再变一下 最后再拓补检查一下构造出的解是否合法#include <iostream>#include <algorithm>#include <sstream>#include <string>#include <queue>#include <cstdio>#include <map>#include <set原创 2017-10-20 21:07:59 · 293 阅读 · 0 评论 -
Good Bye 2013 D. New Year Letter CF379D
两个串拼接的时候前一个串尾为A 后一个串头为C才可以多一个AC所以考虑两个串的首是否为C 尾是否为C 状态压缩用4个位表示这个东西然后枚举两个串一开始有的AC数 然后暴力check一下#include <iostream>#include <algorithm>#include <sstream>#include <string>#include <queue>#include <cst原创 2017-10-11 16:29:15 · 299 阅读 · 0 评论 -
Educational Codeforces Round 6 E. New Year Tree CF620E
因为最多只有60种颜色所以用ll状压一下 对树dfs序构建一棵线段树 然后区间更新区间查询#include <iostream>#include <algorithm>#include <sstream>#include <string>#include <queue>#include <cstdio>#include <map>#include <set>#include <u原创 2017-10-10 21:25:43 · 377 阅读 · 0 评论 -
VK Cup 2015 - Finals, online mirror D. Restructuring Company CF566D
对于区间操作 用一个并查集来维护每个点往右连续为同一祖先的最右点#include <iostream>#include <algorithm>#include <sstream>#include <string>#include <queue>#include <cstdio>#include <map>#include <set>#include <utility>#inclu原创 2017-10-10 13:14:17 · 395 阅读 · 0 评论 -
MemSQL Start[c]UP 3.0 - Round 2 and Codeforces Round #437 (Div. 1) B. Ordering Pizza
首先全买B 然后考虑能不能把部分替换A提升总价值那么肯定考虑替换ai>bi的 先排个序 对于多出的披萨块ai bi是无影响的额外加入一部分ai bi 为0的数据对于每一个人 要不然就是全部替换为A最优 要不然就是尽量不要替换 所以对每个人都用尽量替换多的A和尽量替换少的A更新一下 #include <iostream>#include <algorithm>#include <sstre原创 2017-10-01 20:54:22 · 434 阅读 · 0 评论 -
Codeforces Round #202 (Div. 1) B. Apple Tree CF348B
对每个点平分数值的话 一定要满足他底下的所有子树能平分 所以考虑对每个节点求一个lcm 并且求儿子中的最小值 然后再用最小值来确定最多可以留下多少#include <iostream>#include <algorithm>#include <sstream>#include <string>#include <queue>#include <cstdio>#include <map原创 2017-10-18 20:47:24 · 312 阅读 · 0 评论 -
MemSQL Start[c]UP 3.0 - Round 2 and Codeforces Round #437 (Div. 1) D. Buy Low Sell High
假如用i->j (i < j) 表示在i天买j天卖 那么i->k + k->j (i < k < j ) 与 上面的费用是一样的 因此这个最优解可以On算出来用一个小顶堆表示之前可以选择购买的物品 假设之前最小的可以在今天卖例如 第2天的可以在第4天卖赚到差价 当遍历到第5天时发现可以以第四天的价格买入赚到差价 这时候就可以把第2天和第4天的都拿来卖而第2天买入第5天卖的价值就等于原先第原创 2017-10-01 20:16:09 · 421 阅读 · 0 评论 -
Codeforces Beta Round #8 C. Looking for Order CF8C
就是个记录路径的dp 但是每次枚举走1个点和走2个点会超时可以注意到明显每次尽量拿2个是比只拿1个更优的 考虑一个三角形 两边之和大于第三边因此对每个状态枚举拿2个 固定一个和枚举一个 这样就能枚举到所有情况#include <iostream>#include <algorithm>#include <sstream>#include <string>#include <queue原创 2017-10-18 13:31:37 · 261 阅读 · 0 评论 -
Codeforces Round #114 (Div. 1) B. Wizards and Huge Prize CF167B
考虑把得到的奖和获取的背包容量两个状态分开来算概率结果再把符合要求的两个状态的概率相乘#include <iostream>#include <algorithm>#include <sstream>#include <string>#include <queue>#include <cstdio>#include <map>#include <set>#include <utili原创 2017-10-12 13:57:24 · 292 阅读 · 0 评论 -
Codeforces Round #300 E. Demiurges Play Again CF538E
首先考虑二分答案 假设是求max 那么把>=mid 的数字都变成1 另外的都变为0假设是A操作的时候那么肯定选一个需要放1尽量少的儿子下去 (因为二分的是mid) 假设是B操作那么要让他底下能选的地方都是1才能让他选到>=mid那么其实这样算出来的其实就是答案了当求min的时候就反过来 A操作的时候要让底下能选的都是0 B操作的时候选一个最少的0的下去#include <iostream>原创 2017-10-13 23:59:31 · 220 阅读 · 0 评论 -
Educational Codeforces Round 9 D. Longest Subsequence CF632D
首先用数组记录一下每个数的数量然后从大到小把i的倍数+上这个数的数量 这样数组就变成了记录某个数字的因子个数#include <iostream>#include <algorithm>#include <sstream>#include <string>#include <queue>#include <cstdio>#include <map>#include <set>#in原创 2017-10-14 15:45:43 · 204 阅读 · 0 评论 -
Educational Codeforces Round 49 (Rated for Div. 2) F - Session in BSU
一个人选一个点 也就是可以看成一条边要选一个点 那么就只要单独考虑一个个联通块就可以了一个点代表一个时间 假设这个联通块的点数<边数 就代表人数>可选时间数 不可行假如 点数 = 边数 也就是所有点都必须选 取最大值假如 点数>边数 说明这是一棵树 丢掉最大值取次大#include <iostream>#include <algori...原创 2018-08-25 11:04:22 · 198 阅读 · 0 评论 -
Educational Codeforces Round 49 (Rated for Div. 2) E - Inverse Coloring
题意: 有一个n*n的方格需要染成黑白颜色 定义方格为beautiful的当且仅当每对相邻行的对应格子都相同或都不同,对列同理。 定义方格为suitable的当且仅当不存在大小&gt;=k的同色子矩阵首先考虑单独一行 可以通过dp算出长度为n的序列中最大连续同色长度为i的总方案那么再考虑列 因为方格是n*n的 所以行跟列考虑其实是一样的 选出了一行方案的再选列的方案就能确定涂完...原创 2018-08-23 22:38:16 · 155 阅读 · 0 评论 -
Codeforces Round #476 (Div. 2) [Thanks, Telegram!] D. Single-use Stones CF965D
看到题目先想到这明显是一个最大流 但是边太多了不可能用模版做 已知有 最大流 = 最小割 那么最小割一定是割了连续l个点 所以直接找最小割就是答案#include <iostream>#include <algorithm>#include <sstream>#include <string>#include <queue>#include <cstdio>#include <m原创 2018-04-26 09:24:40 · 246 阅读 · 0 评论 -
Divide by Zero 2018 and Codeforces Round #474 (Div. 1 + Div. 2, combined) C D
C Subsequence Counting http://codeforces.com/contest/960/problem/C 构造一段一段的 每一段只能跟自己这一段的数字产生贡献int x,d; sdd(x,d); ll now = 1; vector<ll>v; while(x) { int w = 0; ...原创 2018-04-08 12:02:53 · 166 阅读 · 0 评论 -
Codeforces 955C - Sad powers
http://codeforces.com/problemset/problem/955/C假设p=2 那么底数范围是1~1e9 假设p>=3 那么底数范围是1~1e6 并且后面的数的power会递增得越来越快 所以可以考虑O(nlogn)预处理出p为奇数时的x 然后加上p为偶数时的x就是答案很明显p为偶数时是某个的平方 所以注意筛选#include <iostream>#include原创 2018-03-30 14:11:14 · 563 阅读 · 0 评论 -
Codeforces Good Bye 2017 D. New Year and Arbitrary Arrangement
首先考 虑dp [i] [j] 表示 i 个a j个子序列ab 时候执行算法的期望那么转移就是dp[i][j] = ( pa * dp [i+1][j] + pb * dp[i][i+j] ) / (pa + pb)因为长度可以任意长所以首先考虑初始化的位置可以发现当a的个数为k的时候再添加一次b就结束算法了 所以考虑初始化dp[k][x]PA = pa/(pa+pb) , PB = pb/(pa原创 2017-12-30 12:05:00 · 317 阅读 · 0 评论 -
Codeforces Round #344 (Div. 2) D. Messenger CF631D
好久没写KMP 根本想不到这种做法首先先对连续相同的合并一下假设s字符个数为1那么只要长度足够并且字符相同就合法假设s字符个数为2那么左右两边长度都够就可以 但是只有一个位置合法 不能左移或者右移假设s字符个数>=3 那么需要首尾两个长度足够 并且中间的全部相等才行 所以对自身getfail 然后再用t匹配 需要注意首尾的是需要判长度足够就行 所以需要改一下特判#include <ios原创 2017-10-15 10:51:03 · 483 阅读 · 0 评论 -
Codeforces Beta Round #19 B. Checkout Assistant CF19B
记录状态dp[i]表示拥有的偷盗时间 那么买了一个物品就是+ti 偷就是-1 ti的范围很大 但是实际上最多只可以用n个 所以i的真实范围为[-n,n] 把整体范围往右移存在数组内做一个dp#include <iostream>#include <algorithm>#include <sstream>#include <string>#include <queue>#include原创 2017-10-14 17:40:21 · 204 阅读 · 0 评论 -
Codeforces Round #436 (Div. 2) F. Cities Excursions
先对每个点dfs一次标记以点i为起点可以到达的点 然后用类似floyd的方法对每个i->j找出i能到的最小的点o并且o有路径能到达j 将o作为i->j的路径的第一个点 然后在这个图上进行倍增 假设有环那么倍增会一直绕着环跑 这种情况判断一下边界就可以了#include <iostream>#include <algorithm>#include <sstream>#include <s原创 2017-09-30 01:34:15 · 229 阅读 · 0 评论 -
Codeforces Round #435 (Div. 2) E. Mahmoud and Ehab and the function
一开始有很多答案 f0,f1,f2,f3,f4…,fm - n这个我们预处理出来这里是没有绝对值的每次修改l,r 其实只修改了a的总和 假设修改了总值v 那么要求的最小的原式 = abs(v+fj)记录一下改变的总和然后二分一下找最接近的fj#include <iostream>#include <algorithm>#include <sstream>#include <string>原创 2017-09-20 21:44:13 · 502 阅读 · 0 评论 -
MemSQL Start[c]UP 3.0 - Round 1 E. Desk Disorder
一个点连一条边 考虑把这样的关系分成一块一块的假如自己连向自己 包括自己以及前面连到自己的都无法移动 假如连的是链(假设长度为x) 那么选一个地方为空有x种 假如是环那么只能不动或者所有一起动两种#include <iostream>#include <algorithm>#include <sstream>#include <string>#include <queue>#incl原创 2017-09-20 20:21:21 · 263 阅读 · 0 评论 -
Educational Codeforces Round 26 D
显然这是个dp 考虑状态只有因子5的个数和因子2的个数 而1e18不会超过26个因子5 所以用dp[i][j][k]来表示到第i个数已经选了j个有因子5k个时因子2的个数 而这样的三维数组会爆空间 所以滚动dp降低一维 用dp[][][]用来表示某种状态是否存在的时候是会有点浪费的 可以把某一位拆出去#include <iostream>#include <algorithm>#in原创 2017-08-05 00:44:12 · 261 阅读 · 0 评论 -
Codeforces Round #427 (Div. 2) C D
C对坐标维护一个前缀和 sum[i][j]表示以[1,1]为左上角 [i,j]为右下角的数量 每次查询一个矩形只要剪掉上边和左边多余的矩形再加回多减的部分就可以了 因为还有亮度 再增加一维记录每个亮度的星星情况原创 2017-08-04 23:59:11 · 212 阅读 · 0 评论 -
Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) F. Bamboo Partition
可以把式子写成d*sum( (a[i-1]-1)/d +1 ) - sum( a[i] ) <=k(a[i-1]-1)/d +1的取值有sqrt(ai)种枚举这个d再check一下#include <iostream>#include <algorithm>#include <sstream>#include <string>#include <queue>#include <cstdio原创 2017-08-19 01:40:28 · 183 阅读 · 0 评论 -
Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) E Cards Sorting
将数拿走后数的相对位置是不会变的 所以考虑用一个变量记录上一次拿走数的位置 set记录每个数存在的位置 用bit记录区间有多少个数 然后模拟操作#include <iostream>#include <algorithm>#include <sstream>#include <string>#include <queue>#include <cstdio>#include <ma原创 2017-08-18 13:39:11 · 191 阅读 · 0 评论 -
Codeforces Round #428 (Div. 2) D
从大往小枚举gcd 再减掉每个gcd的倍数的答案#include <iostream>#include <algorithm>#include <sstream>#include <string>#include <queue>#include <cstdio>#include <map>#include <set>#include <utility>#include <stac原创 2017-08-17 00:08:57 · 243 阅读 · 0 评论 -
Codeforces Round #421 (Div. 2) B D
B题意:对正n多边形找一个角使得最接近给出的角度对一个正n多边形来说 它的n个点一定是在一个圆上的 而三个点组成的角度例如∠abc 一定是由ac两个点决定大小 因为在圆上两个点形成的圆周角是一定等于圆心角的一半 对两个点容易算出其圆心角也就能算出圆周角因此枚举两个点的就可以了 第三个点可以任选原创 2017-07-21 21:47:38 · 221 阅读 · 0 评论 -
Codeforces Round #426 (Div. 2) A B C
A 水题 检测是否为顺时针逆时针或同时符合原创 2017-07-31 01:17:38 · 369 阅读 · 0 评论 -
Codeforces Round #408 (Div. 2) C
给一颗树,删除节点,每次删除节点会使未被删除邻居和未被删除邻居的邻居权+1,问删除整棵树遇到最小的最大权是多少。原创 2017-04-13 19:30:24 · 320 阅读 · 0 评论 -
AIM Tech Round 4 (Div. 2) D. Interactive LowerBound
假设可以暴力找k次,剩下的就是1999 - k次随机 找不到的概率就是1 - ((n - k)/n)^(1999 - k)用随机数询问 记录最靠近答案的 <= x的位置 然后暴力#include <iostream>#include <algorithm>#include <sstream>#include <string>#include <queue>#include <cstd原创 2017-08-26 02:20:46 · 310 阅读 · 0 评论 -
Educational Codeforces Round 27 G. Shortest Path Problem?
对每一个可以走成环的地方记录一个可以改变的费用想要异或的值最小那么一定是尽量跟小于等于自己的异或只需要保存这个环跟原来已记录的费用异或出的最小费用(为0表示无变化)代码学习了qls的(#include <iostream>#include <algorithm>#include <sstream>#include <string>#include <queue>#include <cstd原创 2017-08-23 01:48:49 · 190 阅读 · 0 评论 -
Educational Codeforces Round 29 E. Turn Off The TV
离散一下 然后检查每个点被覆盖多少次 然后再用一个数组来记录被覆盖情况的前缀和#include <iostream>#include <algorithm>#include <sstream>#include <string>#include <queue>#include <cstdio>#include <map>#include <set>#include <utility原创 2017-09-23 22:02:42 · 286 阅读 · 0 评论 -
Codeforces Round #435 (Div. 2) D. Mahmoud and Ehab and the binary string
先改第一个位置的看看是1还是0 然后二分区间询问查找另一个数字的位置#include <iostream>#include <algorithm>#include <sstream>#include <string>#include <queue>#include <cstdio>#include <map>#include <set>#include <utility>#inc原创 2017-09-20 14:44:07 · 222 阅读 · 0 评论 -
Codeforces Round #435 (Div. 2) C. Mahmoud and Ehab and the xor
首先无解的情况只有n=2,x= 0 ,因为不能有相同的数考虑n>1 构造出n个数满足所以异或起来等于1^1^2^2^3^3……^x 但是不能出现相同的数字数字的要求是<=1e6 但是数据给的都是1e5以下的数 所以可以找到第一个大于1e5的 num = 2^a 构造一个数为x^num^1^2^3^…… (需要注意不能变成0) 剩下的数为1 , 2 , 3 …… 还有num#include原创 2017-09-20 13:17:54 · 169 阅读 · 0 评论 -
MemSQL Start[c]UP 3.0 - Round 1 D. Third Month Insanity
从第上往下做dfs 把比赛的关系图看成一个二叉树 对于[o][i] 表示在编号为o的比赛中i获胜了 算出所有可能性 把概率加起来 乘上新加的分数就是新加的分数的期望#include <iostream>#include <algorithm>#include <sstream>#include <string>#include <queue>#include <cstdio>#i原创 2017-09-19 21:44:28 · 487 阅读 · 0 评论 -
Codeforces Round #431 (Div. 2) D. Rooter's Song
确定任意两点x,0 y,0交叉点在x,y x,0去x,y需要时间为y另一个需要x 时间相等才能相碰 y + tx == x + ty 所以 x - tx == y - ty 此时这些note将会相碰这些相碰的note的规律如下 大概就是平移一下 模拟一下平移的操作#include <iostream>#include <algorithm>#include <sstream>原创 2017-09-02 22:48:33 · 229 阅读 · 0 评论 -
Codeforces Round #430 (Div. 2) E. Nikita and game
一条直径有两端 考虑把直径的端点分为两部分(被直径中点分开) 那么只要维护两端的直径端点就可以了当加入一个新点的时候检查是否更新了直径如果更新了直径那它就会成为直径一端的唯一一个点 然后看他是到左边的那些端点长还是到右边那些端点长 假如是左边那左边的点都是另一端的点 再检查一下到右边的点的距离有没有跟新直径一样的 将它加入另一端的集合如果没更新则检查最大距离是否与直径相同 相同则加原创 2017-09-01 00:27:14 · 579 阅读 · 0 评论 -
Manthan, Codefest 17 C. Helga Hufflepuff's Cup
树dp 三维状态 dp[i][j][k]表示 点i 的数字状态为j k为已经有的特殊颜色的个数变成一个背包#include <iostream>#include <algorithm>#include <sstream>#include <string>#include <queue>#include <cstdio>#include <map>#include <set>#in原创 2017-09-25 12:12:41 · 198 阅读 · 0 评论