![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
codeforces
文章平均质量分 74
冷月残星
这个作者很懒,什么都没留下…
展开
-
勾股定理(Pythagorean Triples,cf 707C)
只能说以后编程要先讨论清楚各种情况,保证不重不漏了,再开始编写程序吧。百度勾股定理,发现推论一只。勾股数组勾股数组是满足勾股定理的正整数组,其中的称为勾股数。例如就是一组勾股数组。任意一组勾股数可以表示为如下形式:,,,其中均为正整数,且。定理用途已知直角三角形两边求解第三边,或原创 2016-08-21 03:56:07 · 610 阅读 · 0 评论 -
贪心,优化(Sockets,cf 732e)
http://www.cnblogs.com/iRedBean/p/5975480.html像这种O(n^2)匹配的问题一般可以用优先队列,集合或者多重集合优化成O(nlogn)。贪心的思路很简单,先尝试匹配,然后每个socket添加一个adapter,继续,重复31次。最多加三十次就变成1了。这么贪心为什么对呢。添加adapter后的socket匹配潜力肯定是减弱了的转载 2016-10-19 20:06:07 · 502 阅读 · 2 评论 -
思路题,树的直径(Anton and Tree,cf 734E)
给你一棵树,节点的颜色非黑即白,因此树被分成很多联通块,每个联通块的颜色非黑即白,每次操作可以改变一个联通块的颜色,问你至少要操作几次才能使得所有节点颜色相同。方法就是先对联通块缩点建树,然后求出新树的直径M,答案就是(M+1)/2。讲具体一点就是新树是黑白相间的,我们只需要找到树的中心u,然后对这个节点进行(M+1)/2次操作,纯色的联通块就会一圈一圈的扩大,在(M+1)/2操作后扩原创 2016-11-28 17:27:02 · 511 阅读 · 0 评论 -
模拟(Epidemic in Monstropolis,cf 733C)
cf就是这样,过了pretest屁用没有的,可以理解为盲交了。他的数据量很大但是很弱,WA on test 92 只是因为有一个非常大的错误。AC很具有迷惑性,一旦AC了就一点都不想再查错了,然而若WA就会很坚定的找,然后往往很快就能找到BUG。只能说以后就无视掉AC吧,这就是一个盲交的比赛。AC代码#include#define maxn 510using namespace原创 2016-11-01 09:04:31 · 377 阅读 · 0 评论 -
数学(Anton and School,cf 734F)
首先要知道 (a&b)+(a|b)=a+b我也不知道怎么才能想到这个,只能说按位运算是有很多规律的,以后遇到类似的题可以尝试着去寻找一些规律。讲解:已知 b[i]=∑(a[i]&a[j]),(1 c[i]=∑(a[i]|a[j]),(1根据公式,易得 b[i]+c[i]=∑(a[i原创 2016-11-29 13:41:49 · 267 阅读 · 0 评论 -
思考题(Sleep in Class,cf 733E)
仔细思考就能找到规律,那就是这些楼梯就像浪潮一样的把你往两边推。遇到反向的就被挡回来,但你只能挡我一次,之后你就变成了浪潮的一部分。n那么大既然不能模拟,那就只能计算啊。比如说当前是'U',那么我就往上走,如果遇到‘U’,那就是我的助推器,我会一直向前走,并把沿途所有‘U’都变成‘D’。(所有助推器在使用过后都变成了反向的助推器)直到我遇到了‘D’,这个‘D’就会变成‘U’,然后我就被原创 2016-11-23 00:33:52 · 475 阅读 · 0 评论 -
树链剖分,最小生成树(Drivers Dissatisfaction,cf 733F)
首先要证明只修一条路是最优的。只证两条路的情况,多条路同理。假设同时修了两条路x,y。如果这两条路最后都没有在最小生成树中,那么修理都白费了,不如把资金都投入到其中一条路上,这样这条路才有可能成为新生成树的一部分,从而减小总长度。如果有且只有一条在最小生成树中,不妨设x在,y不在。那么花在y上的钱都白费了,不如全花在x上,让总长度进一步减小。或者把花在x上的钱花在y上,试图让y原创 2016-11-24 15:46:45 · 523 阅读 · 0 评论 -
二分图(Arpa’s overnight party and Mehrdad’s silent entering,cf 741C)
看了别人代码才会写的,所以只能说说自己的理解吧。就是说建一个图,有2n个点,然后给所有(2i-1)和(2i)连一条边(1(2i-1)和(2i)的食物一定不同。而任意的连续3人一定包含了某对(2i-1)和(2i)。看完题只能想到图论呀,图论只能想到二分图呀,二分图只能想到构造呀,然后不知道该怎么构造呀。。。然后就乱搞呀。。。其实应该顺着构造的思路走下去,不该迷路的。。。有一些原创 2016-12-07 14:21:48 · 425 阅读 · 0 评论 -
数学题(Vladik and fractions,743C)
哎,总觉得是搜索(记得埃及分数问题吗),或者是解方程。。。然后。。。感觉自己天天跪数学题,亏自己还是数院的学生。。。可能自己那天晚上太累了,连scanf都写不好了。至少说还是学到了一些东西,以后做题就有更新的思路了。代码#includeusing namespace std;int main(){ int n; scanf("%d",&n);原创 2016-12-15 10:13:54 · 430 阅读 · 0 评论 -
图论(PolandBall and White-Red graph,cf 755E)
道理还是那么的简单,多动脑子,少动键盘。如果解法不对,写代码只是在浪费时间。如果解法正确,写代码是分分钟的事情。1k的范围看上去那么正常,这是出题人用来迷惑你的,事实上k>3都无解。如果让自己去证明G和G的补图G'的直径不能同时>3,那么我兴许会证出来。但是如果没有这个方向感觉真的很难想到。其实所有的“很难想到”都是因为自己不熟练或者根本不会。其实现在自己有点后悔翘了图论去搞ACM,本以为原创 2017-01-16 14:25:34 · 1025 阅读 · 0 评论 -
记忆化搜索(Mahmoud and a Message,cf 766C)
学习任何东西都是这样吧。如果长时间没有练习就会生疏和遗忘。大概唯一的办法就是长时间的反复练习。或者专题训练+打比赛也是不错的。学而时习之,不会忘乎。。。。。。。。。。希望自己能越来越会学习。官方题解是动态规划,我的是记忆化搜索,不过都大同小异了。dp[i]表示后缀i的答案,dx[i]表示后缀i的最少划分。然后就一路记忆化搜索过去即可,最多有n个状态,时间复杂度为O(n)原创 2017-02-08 13:12:44 · 394 阅读 · 0 评论 -
并查集(Mahmoud and a Dictionary,cf 766D)
用并查集维护单词的集合,在同一个集合内的单词互有同义或反义的关系,在不同集合内的单词没有任何关系。那么每个集合内的单词,可以分为两个类别,同一类别的互为同义,不同类别的互为反义。我们可以用d[x]来表示这个类别,并在并查集递归与合并的过程维护d[x]即可。由于不同集合内的单词可以事先判断出没有任何关系,所以所有单词都可以只用两种不同的记号来标记类别,取记号0,1就很方便。一是因为很顺手原创 2017-02-09 10:19:28 · 278 阅读 · 0 评论 -
动态开点线段树(Radio stations,762E)
基本意思就是开1e4棵线段树,每棵线段树维护1e9个坐标。第i棵线段树维护频率为i时坐标区间上一共有几个可以匹配的点。由于点最多有1e5个,频率最多有1e4种,所以只需要开一棵大一点的动态开点线段树就ok了。具体解法就是先对点进行排序,排序为对半径降序。然后由于k很小,所以可以枚举所有相近的频率,并在对应的线段树中进行坐标区间查找。枚举完毕后,将这个点加入对应频率的线段树中。原创 2017-02-15 19:50:19 · 3435 阅读 · 0 评论 -
线段树优化连边(cf 786B)
转载别人的看一看,记录一下。http://blog.csdn.net/jinglinxiao/article/details/65638659我的代码:#include#define mid ((l+r)>>1)#define ls (now<<1)#define rs (ls|1)using namespace std;typedef long long ll;转载 2017-03-28 20:20:20 · 918 阅读 · 0 评论 -
分块算法(cf 785E)
学习了分块算法。转载一发。http://blog.csdn.net/aozil_yang/article/details/62396346我的代码:改成longlong就能AC了。#includeusing namespace std;const int maxn = 200010;int n,q;int p[maxn];int siz,num;vectorv转载 2017-03-29 12:15:27 · 512 阅读 · 0 评论 -
组合数学(Anton and School - 2,cf 785D)
就当背一下公式以及学一下思路吧。http://www.cnblogs.com/chendl111/p/6561079.htmlhttp://www.cnblogs.com/Dragon-Light/p/6559771.htmlhttp://codeforces.com/blog/entry/50996代码#includeusing namespace std;t转载 2017-03-29 14:06:15 · 434 阅读 · 0 评论 -
动态规划(Funny Game,cf 731E)
参考代码 blog.csdn.net/sdfzyhx/article/details/52832832第一步是要确定状态,dp[i]表示前i个缩成一堆的情况下先手的最大值。dp[i]表示前i个缩成一堆很好想,关键是表示什么的值。题目要求求先手的最大值,因此表示此值十分合理。然后是状态转移,自己做的时候不知道该怎么处理两个人,因为一个人的最优解得根据另一个人的最优解才能求出,所以我就转载 2016-10-17 21:33:05 · 775 阅读 · 0 评论 -
区间的交并(80-th Level Archeology,cf 731D)
为区间的交并苦恼了很久,看了别人代码才过。要求n个字符串变成字典序,而不是每一位都非降。一开始处理方法就错了,问题在于没有好好思考自己的解法是否能正确完成题目要求。代码#include#define maxn 500010#define maxc 1000010using namespace std;int n,c;vectorvec[maxn];int qj原创 2016-10-17 16:31:53 · 873 阅读 · 0 评论 -
并查集(Destroying Array,cf 722C)
并查集,以前只会用来做模板题以及实现最小生成树。所以做题时从来没有考虑过用并查集优化什么的。通过这次比赛,学到了。#include#define maxn 100010using namespace std;typedef long long ll;ll n;ll a[maxn];ll d[maxn];ll f[maxn];ll v[maxn];ll s[maxn]原创 2016-10-02 17:00:51 · 433 阅读 · 0 评论 -
动态规划(Memory and Scores,cf 712D)
http://blog.csdn.net/jasonvictoryan/article/details/52502382数组开的不够大也是会导致超时的,宏定义max只比调用max快一点。快10%不到。滚动数组以及用O(1)更新的方法挺不错,学到了。#include//#define Max(a,b) (((a)>(b))?a:b)//#define Min(a,b)转载 2016-09-12 11:38:19 · 594 阅读 · 0 评论 -
树(Persistent Bookcase,cf 707d)
觉得无非就是存起来或者原路找回去。存起来需要太多的空间,肯定不行的。讲道理,原路找回去好难编程实现,一会往前一会往后,而且多走了很多路。这就是为什么要用某种数据结构建模的原因吧。真的能显著降低编程难度,而且思路十分清晰。看到这种回溯的东西,应该要想到树的。。。用了树之后访问顺序有所变化,但这反而少走了很多路。建模思想还不够吧。。。n个点的多叉树,必有n-转载 2016-08-21 19:13:39 · 315 阅读 · 0 评论 -
动态规划(Coloring Trees,cf 711C)
#includeusing namespace std;typedef long long ll;const ll INF=0X3F3F3F3F3F3F3F3F;ll n,m,K;ll c[110];ll cost[110][110];ll dp[110][110][110];int main(){ scanf("%I64d %I64d %I64d",&n,&m,&K原创 2016-09-01 02:46:33 · 694 阅读 · 0 评论 -
树形dp(Centroids,cf 708C)
dp[i][j]表示:i等于0时,表示j往下(包括j)点的数量。i等于1时,表示j往上(不包括j)点的数量。qie[i][j]表示:i等于0时,表示j往下(包括j)能切的最大值。i等于1时,表示j往上(不包括j)能切的最大值。显然最大值往下就包括,往上就不包括。这是一个非常好的方法,细细体会。dfs时可以先枚举子节点进行dp,然后再dfs。可以解决许多难以求原创 2016-09-01 03:57:03 · 293 阅读 · 0 评论 -
树状数组(Garlands,codeforces 707e)
看了别人的代码写的。不是官方解法。所以速度比较慢。把STL和结构体都去掉后才勉强过。而且还钻了题目的空子。在多达10^5个询问中,ASK却不会超过2000个。因此这种解法才可行。否则空间都开不下。但比官方解法编程难度低。离线算法。用了二维树状数组。#include#define maxn 2010#define maxq 100001原创 2016-08-22 16:58:22 · 491 阅读 · 0 评论 -
动态规划(Generate a String,cf 710E)
一直想着用优先队列dfs呢。。超时。。动态规划真是好东西。#includeusing namespace std;typedef long long ll;ll dp[10000010];ll n,x,y;int main(){ scanf("%I64d %I64d %I64d",&n,&x,&y); dp[1]=x; for(int i=2原创 2016-08-23 00:56:34 · 392 阅读 · 0 评论 -
除法逆元(ZS and The Birthday Paradox,cf 711E)
这题真挺不错的,需要一些数学知识,对细节要求高。一些资料与参考:除法逆元 http://blog.csdn.net/acmmaxx/article/details/18409701逆元详解 http://blog.csdn.net/acdreamers/article/details/8220787参考代码 http://blog.csd转载 2016-09-01 20:29:22 · 380 阅读 · 0 评论 -
扩展欧几里得算法,中国剩余定理(Two Arithmetic Progressions,cf 710D)
理论知识http://blog.csdn.net/xiaofengsheng/article/details/4813170参考代码http://blog.csdn.net/miracle_ma/article/details/52290256http://blog.csdn.net/wust_zzwh/article/details/52287769WA在转载 2016-08-24 16:20:07 · 530 阅读 · 0 评论 -
二分法,互动(猜长方形,cf 713B)
第一次做互动的问题。就是你输出一次,它输入一次,它的输入是根据你的输出决定的。给一个n*n的格子(2因为两个长方形不重叠,因此你总可以或横着切一刀,或竖着切一刀,把这个n*n的格子分成两部分,一部分有且只有一个长方形。那就横着二分一下,找不到就竖着二分一下。然后问题就转换为两个相同的更简单的问题:在一个格子内确定一个长方形的位置。分别二分上下左右边界,然后就找到原创 2016-09-14 21:52:56 · 431 阅读 · 0 评论 -
动态规划,离散化(Sonya and Problem Wihtout a Legend,cf 713C)
http://blog.csdn.net/miracle_ma/article/details/52537208具体讲解上面博客写的很清楚了。然后我又想了想为什么不能跳过ai-i,然后dp时循环到j-1。原因是ai的范围是1到1e9,如果直接dp严格递增,那么dp就得从1循环到1e9,这样无论是在空间还是时间上都是不允许的。然而转化ai-i后,问题转化成了非严格递增,那转载 2016-09-15 21:13:41 · 1162 阅读 · 0 评论 -
水题(Checkpoints,cf 709B)
在数轴上,给出n个点的坐标和你现在的坐标。输出最少的行走距离,使你访问至少n-1个点。其实就是选一个点不访问,这个点选最左或最右即可。可以先往左走,再往右走。或者先往右走,再往左走。1个点直接输出0。一开始分了9类在那讨论来讨论去的,最后还错了。可能是我觉得分得详细,每一类就相对简单,不容易错,而且每一类都保证不重不漏。但是有时候,真的,有些情况你忽视掉原创 2016-08-25 18:58:55 · 337 阅读 · 0 评论 -
构造(Recover the String,cf 709D)
构造题的其中一个方法是,先构造一个基础串,然后再想办法改造成目的串。一开始还WA了。交代码之前一定要保证对所有输入都能处理得不重不漏。首先分类方法以及应对各种情况的算法一定要对。然后主要考虑最小值的特例以及最大值在计算过程或结果是否会溢出。#includeusing namespace std;typedef long long ll;int ans[原创 2016-08-25 19:14:33 · 372 阅读 · 0 评论 -
枚举,模拟(Too Much Money,cf Canada Cup 2016 E)
一开始想只用放某个大于等于所有硬币的硬币是最优。后来发现能出解但不一定是最优解。当时就是想,第一次取的硬币的大小一定是大于等于最大的硬币。那么我就枚举所有可能的取值,如果都可以被凑出来,那就说明无解。如果凑不出来了,那就取最小的那个。当时觉得如果第一步都能凑出来,那么以后也一定能凑出来。如果第一步都凑不出来,那也就没有以后了。事实上,如果你放大硬币,这个推论确实是对的。然而可能会存在某个小硬币原创 2016-10-23 10:46:19 · 459 阅读 · 0 评论 -
水题(Maxim and Array,cf 721D)
一开始读错题目,导致码了半个小时交上去WA,然后不够时间重做了。赛后补题,觉得不会爆int就没用long long,改了就过了。一定要仔细读题目,不管是第一遍,还是码到一半去确认一下,都要看清楚,别把一个量的范围看成另一个量的范围了。会不会爆int一定要仔细思考,当然也可以无脑用longlong。#includeusing namespace std;typed原创 2016-10-01 13:13:34 · 378 阅读 · 0 评论 -
启发式合并(Peterson Polyglot ,cf 778C)
又抄了一波答案。。先说下自己对树上dfs的时间复杂度的理解吧。在很久很久以前,树形dp也不会,dfs序也不会,时间复杂度也不会分析,所以当时一遇到树上的问题就只会dfs里面套个dfs2,然后O(n^2)超时,从此以后便完全否定了这种方法,认为这样做一定妥妥的O(n^2),但是其实并不是这样,有些细节还挺有意思的。dfs里面套个dfs2,大概有两种吧。。第一种dfs2是可以往转载 2017-04-03 18:47:08 · 2249 阅读 · 0 评论