ACM_Codeforces
luke2834
A junior researcher~
展开
-
Codeforces Round #285 (Div. 2) C. Misha and Forest
题意 一个森林,告诉你每个点相邻点数Di,和相邻点编号的异或和Si,求边数和所有边的端点编号思路 森林中边数不超过(n-1),必有叶子节点,考虑到异或的性质:a^b^b=a;a^a=0,得到叶子节点i的Si即是i相邻节点j,直接输出这样一组边,然后Dj--; Sj ^=i,就这样动态的遍历所有叶子节点即可。#include #include #include #includ原创 2015-01-21 21:57:41 · 428 阅读 · 0 评论 -
Codeforces 617E XOR and Favorite Number (Round #340 (Div. 2) E题) 莫队算法 + 异或基本性质
题意给你一个数组和一个数k,然后有m个查询,每次给你l,r,问你[l , r]区间内有多少对(i,j),使得a[i] ^ a[i+1] … ^ a[j] = k思路pref[i]记录a[0] ^ a[1] ^ … ^a[i]的值区间[l, r]的解 = 统计(i, j)使得pref[i-1] ^ pref[j] = k的个数。(因为,a ^ b ^ a = b,所以所有小于i的数被以后两次后原创 2016-01-27 17:12:18 · 532 阅读 · 0 评论 -
Codeforces 617C Watering Flowers (Round #340 (Div. 2) C题) nlogn算法
题意给你平面上n个点,和2个圆心点,问你最短的两个半径平方和,使得所有点都能至少在其中一个圆内或圆上思路 这题暴力就可解了,对一个圆试它的半径,距离可以到第i个点,这样会覆盖一些点,然后算另一个圆半径,即另一个圆要能覆盖到其它所有点这样O(n ^ 2)即可解但是单这么做实现会麻烦一些,我们可以先把点按照到第一个圆心点的距离排序,这样我们遍历到第i个点时可知,此时前i个点会被第一个圆包住,后原创 2016-01-27 17:27:35 · 440 阅读 · 0 评论 -
Codeforces 617D Polyline (Round #340 (Div. 2) D题)
题意给你三个点,你可以画一些水平、竖直的折线来穿过这些点,线不能交叉,自交问你,画完后的图形,最少有几条边思路这题就是个特判的题。。。如果三个点,有一维坐标都相等,则是1如果两个点,有一维坐标都相等,而另一个点的另一维坐标 < 这两个点另一维坐标的小者或者>这两个点另一坐标的大者则是2否者是3实现#include <bits/stdc++.h>using namespace std原创 2016-01-27 17:34:08 · 479 阅读 · 0 评论 -
Codeforces 617B Chocolate (Round #340 (Div. 2) B题)
题意给你一个0、1串,问你有多少中切法,使得每一段恰好有一个1思路简单的乘法原理,预处理一个数组a,这个数组保存连续的0的个数, 记m为数组大小,数组下标从0开始记比如00110, 数组为2,0,1然后如果数组只有一个元素,说明全是0,ans = 0其它情况,ans = ans * (a[i] + 1) (i = 1到m-2) 实现#include <bits/stdc++.h>u原创 2016-01-27 17:40:30 · 393 阅读 · 0 评论 -
Codeforces Round #340 (Div. 2) 完整解题报告
比赛总结这回D题坑了,少想到一种情况。。。主要是没想到D题真就是这么简单特判一下就过了。。早知道就再多想想特殊情况了。。。然后C、D题都先读错题了,也是很醉。。最后还有40多分钟,hack半天就成了1个人。。。其它各种被ntr。。这场真是大家狂hack啊。。早知如此,还不如再细想一下D题呢。。。总体来说,D题这回简单,E题之前不会莫队算法,这回补了补挺好~最后rating还是掉了几分,泪原创 2016-01-27 17:49:47 · 345 阅读 · 0 评论 -
Codeforces 612D Educational Codeforces Round 4 D. The Union of k-Segments 离散化+map
题意给你一些区段,问你被覆盖至少k次的点所组成的区段有多少个,它们的左右顶点是几。思路区段的范围很大,所以我们简单离散化一下就是保存端点信息即可,每看到一个区段,让左端点+1,右端点-1这就需要快速的修改和插入,所以容易想到用map就行了最后从小到大扫一遍map就可以了但是这个思路有一个很大的问题,就是如果区段是一个点时,就有问题了,这个点等于没加过所以,我们需要细化这些点,把一个点原创 2015-12-27 00:05:15 · 569 阅读 · 0 评论 -
Codeforces 609F Frogs and mosquitoes 二分+简单离散化线段树+Multimap
题意有n青蛙和m蚊子(n,m<=1e5),青蛙两个参数,位置xi,舌头长度ti蚊子两个参数,位置pj,权值bj只有当xi+ti>=pj且xi <= pj时,第i只青蛙才能吃到第j只蚊子。如果第j只蚊子能被多只青蛙吃到,那么xi最小的青蛙会把这只蚊子吃了每次青蛙吃了某只蚊子以后,ti会增加蚊子的bj蚊子会按输入的顺序到来,如果没一下没吃掉,蚊子还是会落在原位不动,即蚊子有可能之后被吃掉输原创 2016-01-28 09:56:00 · 855 阅读 · 0 评论 -
Codeforces 615E Hexagons (Round #338 (Div. 2) E题) 二分答案+找规律
题意在一个二维直角坐标系下,铺满了正六边形,然后从中间的正六边形沿着图上给出的方向走n步,问最后所在的正六边形的坐标位置思路首先,可以注意到x,y坐标的尺度不同,x方向上是边长的根3倍为2,y是边长的1倍为2,不过其实这点,也不太重要啦。。。只不过是方便算下坐标而已。。然后,很好想到,每一圈的六边形数是1,6,12,….,所以用等差数列求和可以得到总数,那么二分答案,就可以得到n步之后,在第原创 2016-01-12 10:55:18 · 649 阅读 · 0 评论 -
Codeforces Round #338 (Div. 2) 完整解题报告
前言我终于也可以硬气的写一回完整解题报告了这场其实我打的不太好,中间犯困严重。。比赛里就A了2个题。。幸亏hack成功了2个人~要不rating肯定要掉了。。。总的来看,其实第三题,我还不如直接写E题。。其实比前两个题都好写。。D题主要是a ^ b % m给我卡住了。。。这个之前大牛给我说过一次,但没说结论。。。没想到用费马小定理稍微推一下就解决了。。。还是不善于数论啊。。。解题报告A题很原创 2016-01-12 11:04:13 · 311 阅读 · 0 评论 -
Codeforces 510C Fox And Names 拓扑排序
题意给你n个字符串,问你存不存在一种字母表的顺序,使得这n个字符串是按拓扑序排好的如果存在,给出这种顺序思路这题其实很简单,就是扫一遍相邻两个字符串,建立以字母为节点的有向图然后跑一个拓扑序贴出来的原因,主要是犯了一个特别傻的错误。。当年WA的原因,今天又WA在这了。。。也算是给自己提个醒吧。。错误就是,g[i][j]赋值为1时,没判定原来g[i][j]是否已经为1,就让入度(i) +原创 2016-01-12 18:38:42 · 364 阅读 · 0 评论 -
Codeforces 616E Sum of Remainders
题意给你两个数n,m问你n % 1 + n % 2 + … + n% m为几思路n % i = n - n / i * i (n / i 表示下取整)所以所求 = n * m - sum(n/i * i) (i从1到m)由于,n的第j个因子和第j+1个因子间(左开右闭),的任意数k,有n / k = n / n的第j+1个因子所以我们用sqrt(n)的时间求出所有n的因子即可,然后相原创 2016-01-12 23:25:06 · 662 阅读 · 0 评论 -
Codeforces 620F Xors on Segments DP
题意n个数,m次查询。n<=5e4,m<=1e3每次查询为一个区间l,r,要在n的数的[l,r]区间内选出2个数a,b(a<=b)计算f(a, b) = a^(a+1)^(a+2)^…^b,输出最大的这个值思路我想了好久,想到用莫队+Trie树了。。可是还是没想出来。。标程好像也是这样。。不过我没细看。。之后我会再尝试用这个方法解决~我参考了大神的博客,看到居然O(n^2)也能过。。。然原创 2016-01-29 17:50:51 · 913 阅读 · 0 评论 -
Codeforces 620E New Year Tree dfs + 线段树(区间查询+区间置数) + 位运算
题意给你一棵树n(4e5)个节点,每个节点有一种颜色(60种以下的颜色)有两种操作,修改一棵子树所有节点的颜色为c查询,一颗子树下有多少种颜色思路先考虑,如果是在一个数组里,每次修改一个区间和查询一个区间怎么做?基本想法,就是线段树记录下每个区间内的颜色都有哪些,然后就可以归并了由于只有60种颜色,我们可以用位压缩编码,然后归并的时候,就是按位取或即可所以,这棵线段树维护的就是一个取原创 2016-01-30 14:41:01 · 571 阅读 · 0 评论 -
hdu2147 简单博弈dp
题意一个n*m的矩阵从右上角开始,两个人可以选择向左、下或左下移动,问先手能否取胜思路dp(i,j)表示到达i,j点的状态为必胜态还是必败态预处理2000*2000的dp,之后查询即可注意,空间给的很小,更新dp的时候最好用迭代的方式实现#include <bits/stdc++.h>using namespace std;bool dp[2002][2002];typedef p原创 2016-01-13 21:39:01 · 455 阅读 · 0 评论 -
Codeforces 653A C#写算法题
前言就是想用c#实现一个网络流算法,但是怕有问题,又懒得手写测试(喂)。。。所以就想在codeforces上过点模板题试试。。但是从没有交过c#的题,这次就写个水题试一试。。感觉c#写题好麻烦。。题意给你n个数,问你存在不存在3个连续的数思路hash一下,然后遍历所有hash值,连续3个不为0就yes实现using System;using System.Collections.Ge原创 2016-04-13 14:28:52 · 476 阅读 · 0 评论 -
Codeforces 615C Running Track (Round #338 (Div. 2) C题) Trie + dp
题意给你两个字符串t,s你的目标是使用尽量少的t拼出s对于一个t,你可以做的是,只选取其中一个子串,正着或反着拼到s上最后需要拼出完整的s思路首先,题解说了一句贪心。。。然后我怎么也想不明白是咋样的贪心法。。。可能也和我没认真读题解有关。。我想的是,每次选取s中最长的可以由t得到的子串,这样贪心肯定是对的。但问题是s中有很多这样的子串时,我们不知道挑哪个?我一时想不明白了。。要是有恰好路原创 2016-01-10 23:27:03 · 533 阅读 · 0 评论 -
Codeforces 615D Multipliers (Round #338 (Div. 2) D题)
题意给你一个数n的所有分解质因数的质因子,问你这个数全部的因子乘积模1e9+7得几思路变量:p[i]表示第i种质因子,num[i]表示第i种质因子有多少个我们基本的思路就是,ans = ans * p[i] ^ k[i] 其中k[i]表示第i种质因子,在最后乘积中用了多少次,然后用快速幂就可以搞定那么,我们先来解决k[i]等于多少首先第一个结论,n的所有因子数为d = d * (num原创 2016-01-09 23:09:08 · 713 阅读 · 0 评论 -
Codeforces Round #287 (Div. 2) E. Breaking Good
题意 在一个稀疏图里找到从1号节点到n号节点的最短路,边权均为1,但路分好坏,在找到最短路的同时,还希望经过的好路最多。在最短路径上的坏路需要修好,不在最短路径上的好路要炸毁,问你最后在找到最短路的同时,需要修好和炸毁的路的总和是多少,并给出具体是哪些边。思路 迭代加深的搜索,优先级1是经过的边数,优先级2是经过的坏路数,用最小值堆。就是要注意,需要保存所有搜过的状态,以便回溯找到那些最短路上原创 2015-01-24 19:50:41 · 474 阅读 · 0 评论 -
Codeforces Round #301 (Div. 2) C题 广搜
题意 在矩阵里走迷宫,和普通迷宫不同的是,走过的路变为墙,且终点是墙的时候才算抵达。思路 就是广搜,和普通迷宫几乎一样..#include #include #include #include #include #include #include #include #include #include #include #include using namespace原创 2015-05-01 02:56:49 · 491 阅读 · 0 评论 -
Codeforces 25E 字符串hash模板题
题意三个字符串,问最短的把这三个字符串的作为子串的字符串长度。思路三个字符串A(3,3)种排列方式,可以dfs,但是给定了三个,为方便起见,就手写了6种情况。先判断三个串互相有没有为子串的情况,作为子串的就可以不被考虑了。剩下的串,找前面串的后缀和后面串的前缀的最长公共部分。这可以完全用kmp解决,但是为了练习字符串hash,所以就这么写了~实现#include <cstdio>#i原创 2015-11-13 19:54:49 · 596 阅读 · 0 评论 -
Codeforces 425A multiset使用
题意给你一个数列,你可以最多swap两个元素k次,问你交换后数列的子串中,和最大的可以到多大思路比较暴力的算法,每次看(i,j)这个子串,让它外面的元素有序,内部的也有序,那么最多迭代min(k, 外面元素的个数,内部元素的个数)次,如果外面最大的>里面最小的,那么就交换,否则结束迭代为了优化下复杂度,也为了编程简单,使用了mutiset来维护一个有序的序列复杂度为O(k * n^2 *原创 2015-12-29 14:08:18 · 479 阅读 · 1 评论 -
Codeforces 611D New Year and Ancient Prophecy (Good Bye 2015 D题)
题意给你一个数字组成的字符串把它分成几个子串,使得每个串组成的数,没有前导0,且位置在前的字符串组成的数要严格小于位置在后的字符串问你有多少种不同的分法思路dp,dp(i,j)表示以i结尾的子串,它划分后,最后一个串长度小于等于j的分法数。当更新dp(i,j)时,我们看子串str(0, i-j),它能不能放一个j长的子串,也就是说,如果以i-j结尾的,j长子串 < 以i结尾,j长子串时,原创 2015-12-31 13:40:13 · 795 阅读 · 0 评论 -
Codeforces 611C. New Year and Domino (Good Bye 2015 C题)
题意给你个矩阵,每个位置是空或者不空每两个相邻空的位置,可以放一个木条有q次询问,每次问你一个子矩阵中,放一根木条有多少种放法思路dp(i,j),表示左上角,这块的放法数,mark(i,j) 表示当前位置是否为空(1为空)dp(i,j) = dp(i-1,j) + dp(i,j-1) - dp(i-1,j-1) + (mark(i,j) && mark(i-1,j) ) + (mar原创 2015-12-31 16:04:24 · 733 阅读 · 0 评论 -
Codeforces 609E Minimum spanning tree for each edge 树链剖分+RMQ(st算法)+最小生成树
题意就是给你一个有权无向图,无子环、无重边,问你,要求对每一个边i,必须在生成树里时的最小生成树的权值。思路这题思路不算太难想到,主要是第一次写树链剖分各种卡。。。这叫一个烦。。幸亏CF上可以看数据,要不然不知道调哪辈子去了。。。不瞎扯了,这题就是先跑一个最小生成树,得到权值A。然后遍历每个边,对于边{u,v},如果它本身就在最小生成树中,值就是A。如果不在树里,那么我们就需要看在树中的链原创 2015-12-20 14:08:07 · 949 阅读 · 0 评论 -
Codeforces 609D Gadgets for dollars and pounds 二分答案
题意有点长。。回头再补吧。。思路二分答案,对于第x天,计算它最少的花费f(x),<=s就是可行的,这是一个单调的函数,所以可以二分。对于f(x)的计算,我用了nlog(n)的算法,遍历m个商品,用c[i]乘以前x天里,第t[i]种货币的最便宜的价格,存放到一个数组里,之后排序,计算前k个的和就是f(x)前x天里,第t[i]种货币的最便宜的价格是通过预处理得到的,很容易的计算一下前缀最小值就原创 2015-12-20 01:45:10 · 686 阅读 · 0 评论 -
Codeforces165A 练习使用unordered_map和set
题意题比较简单,就是给你一堆平面上的整数点,问你在这些点里有多少个点满足以下条件,即存在4个点,分别x == xi, y < yi ,x == xi, y > yi , x < xi, y == yi ,x > xi, y == yi思路很简单,n也很小,但是为了练习stl,我是用了两个容器来做,复杂度O(nlog n)实现#include <unordered_map>#include原创 2015-12-09 16:48:32 · 445 阅读 · 0 评论 -
Codeforces 509C. Sums of Digits 贪心 + 模拟
思路各种特判!我真是醉了。。。卡了这么长时间。。。实现#include <iostream>#include <cstring>#include <cstdio>#include <vector>using namespace std;vector<int> ans , pre;int b[302];int n;void init(int b){ ans.clear();原创 2015-12-22 01:58:56 · 481 阅读 · 0 评论 -
Codeforces 597C Subsequences dp + 树状数组
题意给你n的一个排列,问你包含k个数的子序列个数有多少。n <= 10^5,k <= 11思路dp状态dp[i][j] 表示前i个数,包含k个数的子序列个数有多少f[i][j]表示前i个数,以a[i]结尾的,包含k个数的子序列有多少dp[i][j] = dp[i-1][j] + f[i][j] 这个转移很容易想到具体f[i][j]怎么转移,稍微有点麻烦f[i][j] = sum f原创 2015-12-21 22:10:57 · 667 阅读 · 0 评论 -
Codeforces 603B - Moodular Arithmetic 数论 应用群的基本性质
题意一类函数,他们的定义域是{0,1,..,P-1},值域也是这个,但不一定是一一映射其中p是奇数,且是质数就是给你p和k,问你满足,给定的等式的函数有多少个,k是等式中的参数等式是f(k * x % p) = k * f(x) % p。k的范围是0~p-1,p<10^6思路这题主要应用了群的性质,除去0的模p运算,是一个群先不考虑0,让x和k都非0我们先证明k * x % p的值原创 2015-12-06 11:23:14 · 536 阅读 · 0 评论 -
Codeforces Round #336 (Div. 1) 607B Zuma 回文dp小总结
题意给你一个数列,你每秒可以从中删去一个回文子串,问你最少多少秒可以删完这个子串思路其实这类回文dp,方法都是类似的,用dp[i][j]表示从i到j这个子串最少多少秒可以被删完然后我们从中间向两边看更新dp,用dp[i][k]和dp[k+1][j]更新一下dp,再考虑a[i] == a[j]时单独更新一下dp就行了。比如之前做过的最长回文子序列,也是类似的想法具体来说这题,转移,对于一般原创 2015-12-25 00:29:28 · 620 阅读 · 0 评论 -
Codeforces Round #336 (Div. 1) 607A Chain Reaction 简单dp
题意是在一条直线上坐落着不同位置的灯塔,每一个灯塔有自己的power level,当作是射程范围。现在从最右边的灯塔开始激发,如果左边的灯塔在这个灯塔的范围之内,那么将会被毁灭。否则会被激发,留下自己。现在可以从右边放置一个灯塔,位置和power level都可以自己定义。问各种情况中最小的灯塔被毁灭的数量。思路上来我就脑抽,觉得这是一个单凸函数。。。还傻了吧唧的写了个三分法。。。真是晕了。原创 2015-12-25 02:38:15 · 602 阅读 · 0 评论 -
Codeforces 615B Longtail Hedgehog (Round #338 (Div. 2) B题)
题意给你一个无向图,让你找到一个通路,路上的点是依次增大的,点的个数记为len然后找到所有连接到这条路末尾节点的边,数量为num找到最大的num * len思路基本是枚举以第i个节点为结尾得到的num * lennum很好得到,开个数组记录下就好len的话,用了个小dp,dp(j) = max(dp(i) + 1 , dp(j)) 存在(i,j)这条边存图直接只记录从小编号点到大编原创 2016-01-09 22:42:15 · 378 阅读 · 0 评论 -
Codeforces 546E Soldier and Traveling 最大流 C#实现
题意在某个国家有n个城市,他们通过m条无向的道路相连。每个城市有一支军队。第i个城市的军队有ai个士兵。现在士兵开始移动。每个士兵可以呆在原地,或者走到和他所在城市直接相邻的城市判断移动之后,能不能使得第i个城市恰好有bi个士兵。若可以,需给出移动方式思路将源点与各个点相连,容量就是a[i]。将汇点与各个点相连,容量就是b[i]。将i与i+n相连,容量是inf,表示士兵可以留在自己的城市原创 2020-02-12 18:34:44 · 574 阅读 · 0 评论