TopCoder部分题解
网上TopCoder题解很少,我自己写了一些放在这儿。虽然说我比较懒有时候自己都不好意思说我写的算题解= =还有由于博主实在是菜,所以只会写点水题...
ymzqwq
这个作者很懒,什么都没留下…
展开
-
TopCoder SRM 713 Div1 500 DFSCount
#include <bits/stdc++.h>#define ll long long#define fr(i,x,y) for(int i=x;i<=y;i++)#define rf(i,x,y) for(int i=x;i>=y;i–)#define frl(i,x,y) for(int i=x;i<y;i++)using names原创 2018-11-01 15:38:09 · 513 阅读 · 0 评论 -
TopCoder SRM 712 Div1 600 AverageVarianceSubtree
卡精度没素质。。。。今天才知道有__float128这种东西,问了一下noip不能用。。。DescriptionDescriptionDescription传送门nnn个点的树,每个点有一个权值,任选一棵非空子树,求其中所有点方差的期望。SolutionSolutionSolution裸的树形DP,感觉不值600,不过之前做过另一道树形DP也是600…反正这种题吧,大概xy肯定会说要...原创 2018-10-31 18:53:05 · 213 阅读 · 0 评论 -
TopCoder SRM 693 Div1 Medium BipartiteConstruction
传送门由于Arena进不去所以代码就没写了,反正这种题重在思维吧。DescriptionDescriptionDescription构造一个二分图使得其完美匹配数量为K(K&lt;=1000000000)K(K&lt;=1000000000)K(K<=1000000000),要求两边点数相同且都&lt;=20&lt;=20<=20,边数&l...原创 2018-10-29 18:23:09 · 250 阅读 · 0 评论 -
TopCoder SRM 690 Div1 500 TreeWalker
一题磨了一晚上,其实根本不难,就是我太菜了。我们稍加考虑,就会发现题目求的实际上是2×∑2n−1−dis(i,j),(i&lt;j)2 \times \sum 2^{n-1-dis(i,j)},(i&lt;j)2×∑2n−1−dis(i,j),(i<j),稍加变形,就是2n×∑2−dis(i,j),(i&lt;j)2^{n} \times \sum 2^{-dis(...原创 2018-10-28 21:08:04 · 217 阅读 · 0 评论 -
TopCoder SRM 691 Div1 500 Moneymanager
学习了DP的新姿势QAQ首先应该不难发现如果无视XXX的话整个序列应该是按a[i]/b[i]a[i]/b[i]a[i]/b[i]从大到小排列的,这个就是个很基础的贪心吧,证明用的也是贪心中最常见的方法:交换相邻元素。然后我们考虑一下这个XXX对答案的贡献其实就是X⋅∑i=n/2+1i=nb[i]X \cdot \sum_{i=n/2+1}^{i=n}b[i]X⋅∑i=n/2+1i=nb[i]...原创 2018-10-28 18:33:16 · 225 阅读 · 0 评论 -
TopCoder SRM 689 Div1 500 MultiplicationTable3
get到了一个新套路我们先把空集也算进来,直接x++假设我们现在构造出了一对(n,x)假设此时的矩阵为aaaaaaaaa那么可以这么构造出(n+1,x+1),因为我们发现集合中只要选了n+1,其他所有都得选,所以只多了一个1到n+1的全集。aaa1aaa2aaa31230还可以这么构造出(n+1,x*2),因为对于之前的每个集合,都可以选择放或不放n+1aaa3aaa3...原创 2018-10-26 18:49:05 · 145 阅读 · 0 评论 -
TopCoder SRM 685 Div1 450 FoxAirline2
这题可以用一个dfs对于每条边,我们尝试将它染成某一种颜色。有一个显而易见的小优化:如果一方的这两个点已经联通,就不用连这条边。其实这样复杂度就对了。。于是我又从网上粘了一个关于复杂度的解释(原文是日语,这是Google翻译的结果,稍微润色了一下,原文)由于N&lt;=10,如果两种颜色都有9条边,则可以形成一颗生成树。出于这个原因,“如果你能以两种颜色重新连接,同时尝试两者”的情况...原创 2018-10-23 16:53:01 · 217 阅读 · 0 评论 -
TopCoder SRM 681 Div1 500 LimitedMemorySeries2
这题假得不行啊…一直感觉O(nlogn)O(nlogn)O(nlogn)是过不了的,结果TC评测机太强了啊,1e7的数据200+ms就跑过去了。。所以说要有信仰啊。。。好的其实这题就是纯暴力,复杂度证明我就直接从网上粘一个过来了。。Let’s look at the max number in the range. Then, we have a recurrence T(n) = min(...原创 2018-10-23 14:47:09 · 193 阅读 · 0 评论 -
TopCoder SRM 683 Div1 500 GCDLCM2
神奇的结论题首先,由于gcd(x,y)∗lcm(x,y)=x∗ygcd(x,y)*lcm(x,y)=x*ygcd(x,y)∗lcm(x,y)=x∗y,然后有个结论小学就该知道了吧,乘积一定时,两个数差得越远和越大,所以,我们应该尽量多做这种操作。考虑将x,yx,yx,y质因数分解,设x=p1a1⋅p2a2⋯pnanx=p_1^{a_1} \cdot p_2^{a_2} \cdots p_n^{...原创 2018-10-23 08:27:51 · 154 阅读 · 0 评论 -
TopCoder SRM 680 Div1 450 BearSpans
做出TC Div1 medium真是开心,尽管一般来说都是450的较水题qwq对于此题,我们要发现几个性质。性质1:每一轮操作过后联通块个数起码减少一半性质2:操作次数只与MST上的边有关性质1先判掉无解。性质2告诉我们不在MST上的边随便连连就好了。于是我们干脆让MST上的n−1n-1n−1条边就是最小的n−1n-1n−1条边,并且这个MST是一条链。由于合并kkk次,我们就只需考...原创 2018-10-22 19:43:36 · 276 阅读 · 0 评论 -
TopCoder SRM 684 Div1 600 DivFree
又是一道神奇的题最开始就想到容斥,结果写完了之后过不了样例,意识到我那个容斥好像并不满足容斥那个组合数的条件。。然后标算的容斥刷新了我对容斥的认识= =先预处理出dp[i]dp[i]dp[i],表示长度为iii的不合法序列数(dp[1]dp[1]dp[1]事实上是合法的,但还是把它算出来)我们用h[i]h[i]h[i]表示长度为iii的合法序列个数,考虑我们在h[i−1]h[i-1]h[i...原创 2018-10-22 11:48:17 · 293 阅读 · 0 评论 -
TopCoder SRM 666 Div1 444 SumOverPermutations
感觉是道好题~原来碰到这种排列的dp就一脸懵逼,因为状态特别难设计,每次都感觉只会状压,现在终于有点get到其中的套路了。在这题里我们可以发现几个事实每个位置对答案的贡献只和它左右两边是否比它早确定有关我们可以通过将iii插入111到i−1i-1i−1的排列中得到所有111到iii的所有排列于是我们可以弄一个f[o][i][j]f[o][i][j]f[o][i][j]表示到第ooo个...原创 2018-10-16 21:21:29 · 181 阅读 · 0 评论 -
TopCoder SRM 579 Div2 1000 MarblePositioning
貌似tc的div2 1000有很多这样的水题就是暴枚全排列啊。。水破天际了好吗O__O "…#include &lt;bits/stdc++.h&gt;#define fr(i,x,y) for(int i=x;i&lt;=y;i++)#define ll long longusing namespace std;const int N=10;int r[N],a[N];int ...原创 2018-10-03 21:01:42 · 300 阅读 · 0 评论 -
TopCoder SRM 575 Div1 500 TheSwapsDivOne
每个数只有两种情况,要么在原来的位置上,要么不在。于是我们用一个简单的dp求出两种情况的概率。f[i][0/1]f[i][0/1]f[i][0/1]:Swap了iii次后,0表示不在原来位置上,1表示在,的概率。转移方程f[i][1]=f[i−1][1]∗(n−2)/n+f[i−1][0]∗2/n/(n−1)f[i][1]=f[i-1][1]*(n-2)/n+f[i-1][0]*2/n/...原创 2018-10-03 15:28:04 · 243 阅读 · 0 评论 -
TopCoder SRM 579 Div1 250 UndoHistory
TC250日常乱搞简单地讨论一下如果前一个串是当前串的子串,那么可以选择不Undo,直接在后面输入(然而有时Undo一下更优2333,所以还要两种情况取minUndo操作就是找一个最长的和它相同的前缀,这个用字典树可以轻易做到#include &lt;bits/stdc++.h&gt;using namespace std;const int N=2501;const int M...原创 2018-09-27 15:01:18 · 233 阅读 · 0 评论 -
TopCoder SRM 577 Div1 500 EllysChessboard
考虑将整个过程倒过来考虑,那么每次就是消除距离最远的点对中的一个点。我们就爆搜消除哪个点,把点状压起来,用map加个记忆化。很诡异的是,我一开始只对所有’#‘状压,结果极限数据根本跑不过去,后来改成对所有点状压就突然跑得飞快,什么鬼啊,点多了不应该更慢了??而且这两种方法在所有点都是’#'的情况下应该是一模一样的啊。。。#include &lt;bits/stdc++.h&gt;#defi...原创 2018-09-27 09:14:09 · 821 阅读 · 0 评论 -
TopCoder SRM 579 Div1 450 TravellingPurchasingMan
其实是个很水的状压DP,我还WA了三发。。用f[i][j]f[i][j]f[i][j]表示访问过的商店状态为iii,当前刚从jjj出来,所需的最小时间。然而有一些细节。。#include <bits/stdc++.h>using namespace std;const int M=16;const int N=51;int f[1<<M][M],m;int ...原创 2018-09-18 14:55:19 · 272 阅读 · 0 评论 -
TopCoder SRM 581 Div1 250 SurveillanceSystem
为啥感觉这个250比500tmd难啊啊啊。。TC 250pts的题解真心难写,都是些乱搞,主要靠意会。。我们先把containerscontainerscontainers存入桶,然后我们再对于每个桶中的监控求出可能放的位置有哪些(用前缀和,看有多少长为LLL的区间里XXX的数量等于监控看到的数量)。 假设某个桶中有aaa个监控,这些监控可以放在kkk段不同区间。若a==ka==k...原创 2018-09-13 21:03:29 · 182 阅读 · 0 评论 -
TopCoder SRM 581 Div1 500 TreeUnion
一个环肯定是由两棵树中的边与中间连接的两条边组成的 那么我们就可以用c[0/1][k]c[0/1][k]c[0/1][k]表示两棵树中长度为kkk的链的数量 最后的期望就是c[0][i]×c[1][K−2−i]×2×(n−2)!n!c[0][i]×c[1][K−2−i]×2×(n−2)!n!\frac{c[0][i]\times c[1][K-2-i]\times 2\times (n-2)!...原创 2018-09-13 14:30:30 · 308 阅读 · 0 评论 -
TopCoder SRM 589 Div2 1000 FlippingBitsDiv2
感觉讲不清。。#include &lt;bits/stdc++.h&gt;using namespace std;const int N=2501;string s;int n;int f[N][2],d[N][2],a[N][2];template&lt;class T&gt; void checkmin(T &amp;a,const T &amp;b) { if (b&lt;原创 2018-09-12 07:30:39 · 387 阅读 · 0 评论 -
TopCoder SRM 589 Div1 250 GooseTattarrattatDiv1
由于每次相同的字母都是一起变的,所以相同的字母可以看作一个整体。 先在原串上跑一遍回文,用并查集维护哪些字母要变成一样的。 然后修改的时候当然就是把出现次数少的修改成出现次数多的……一开始智障以为是像合并果子一样的…结果发现只要全都合并到最大的那个上就好了 于是代码就被我魔改成了堆排???//tc is healthy, just do it#include <bits/st...原创 2018-09-11 22:15:59 · 414 阅读 · 0 评论 -
TopCoder SRM 589 Div1 450 GearsDiv1
QAQ果然最多也就做个450pts的…至于500pts…呜呜对于这题,我们可以发现,最优方案肯定是两种颜色的齿轮往同一个方向转,另一种颜色往另一个方向转。比如说R和G都是顺时针旋转,那就要把R和G之间的边都删掉,我们发现R和G以及它们之间的边可以看做一个二分图,删去最少的点之后使所有点都不相连,剩下的一定是最大独立集。于是跑一遍最大匹配,匹配数就是要删的点数……#include <...原创 2018-09-11 21:39:24 · 303 阅读 · 0 评论 -
TopCoder SRM 617 Div2 1000 MyVeryLongCake
答案为n−ϕ(n)n−ϕ(n)n-\phi(n)//tc is healthy, just do it#include &amp;lt;bits/stdc++.h&amp;gt;using namespace std;template&amp;lt;class T&amp;gt; void checkmin(T &amp;amp;a,const T &amp;amp;b) { if (b&am原创 2018-09-07 08:35:18 · 137 阅读 · 0 评论 -
TopCoder SRM 599 Div2 950 SimilarNames2
暴力求出每个单词的前缀数量f[i]f[i]f[i] 那么如果我们要将这个单词排在第LLL位,前L−1L−1L-1位的方案数就是(f[i]−1L−1)(f[i]−1L−1)f[i]-1 \choose L-1,然后最后n−Ln−Ln-L位就乱排。#include <bits/stdc++.h>using namespace std;const int N=51;const i...原创 2018-09-07 09:06:43 · 186 阅读 · 0 评论 -
TopCoder SRM 639 DIv2 1000 BoardFoldingDiv2
可以发现行和列其实没什么关系,于是我们愉快地分开处理,最后相乘。比如说现在在处理纵向的折痕: 我们先把每列压成一个数,存入数组aaa,这样就可以O(1)比较两列是否相等。 然后我们再预处理出f[i]f[i]f[i],表示以i,i+1i,i+1i,i+1为中心的回文长度。 再用dp[i][j]dp[i][j]dp[i][j]表示折成第iii列到第jjj列是否可行,枚举折在哪里即可。复杂...原创 2018-09-07 10:05:01 · 222 阅读 · 0 评论 -
TopCoder SRM 583 Div2 900 GameOnABoard
这题竟然用最短路就可以过。。 然而我用了deque… 有点类似bfs吧,只不过碰到’0’就push_front(),这就保证了每个点被bfs到时都是最短距离。#include &amp;lt;bits/stdc++.h&amp;gt;using namespace std;const int N=41;const int dx[4]={0,0,-1,1};const int dy[4]={1,-1...原创 2018-09-03 20:50:18 · 258 阅读 · 0 评论 -
TopCoder SRM 581 Div2 1000 TreeUnionDiv2
好水。。 先把两点之间的距离预处理出来,然后暴力全排列就行了。。。#include &lt;bits/stdc++.h&gt;using namespace std;const int N=51;const int INF=1e9;int n,a[N][N],d[N][N],c[N];class TreeUnionDiv2 {public: int maximumCyc...原创 2018-09-03 07:53:46 · 243 阅读 · 0 评论 -
TopCoder SRM 577 Div1 250 EllysRoomAssignmentsDiv1
又是一道细节题? 按题意一轮一轮分组就行了,最后一轮可能分不满,反正贼麻烦= =#include <bits/stdc++.h>using namespace std;const int N=2501;string s;int n,a[N];class EllysRoomAssignmentsDiv1 { public: double getAve...原创 2018-08-31 07:46:31 · 265 阅读 · 0 评论 -
TopCoder SRM 580 Div2 1000 WallGameDiv2
可以发现,Eel完全可以把路堵得很死,使得Rabbit只有一条路可走。 并且Rabbit很聪明不会没事找抽往回走的。 于是问题就转化为,从左上走到最后一行路过格子的权值和最大是多少。 可以很容易地用DP解决,f[i][j][k]f[i][j][k]f[i][j][k]表示走到(i,j)(i,j)(i,j),且接下去方向为k的答案。 特别需要注意的一点是走到最后一行就会立刻结束。PS:感...原创 2018-09-02 19:28:07 · 278 阅读 · 0 评论 -
TopCoder SRM 577 Div2 1000 EllysCoprimesDiv2
自己装了插件貌似哪里没弄好。。不太懂为什么这种题也是1000// BEGIN CUT HERE// END CUT HERE#line 5 &quot;EllysCoprimesDiv2.cpp&quot;#include&amp;lt;bits/stdc++.h&amp;gt;using namespace std;int gcd(int a,int b){ return b==0?a:gcd(b,a...原创 2018-08-30 14:07:04 · 273 阅读 · 0 评论 -
TopCoder SRM 576 Div1 250 ArcadeManao
一开始写了个智障版bfs,样例都没过。。 然后心血来潮写个并查集,结果各种FST。。并查集的思路很简单,就是维护哪些点能相互到达,然后不断延长梯子,直到最底下一层和金币联通……二分+bfs估计也是可过的。#include <bits/stdc++.h>using namespace std;const int N=51;const int dx[4]={1,-1,0...原创 2018-08-29 19:04:14 · 219 阅读 · 0 评论 -
TopCoder SRM 576 Div2 1000 CharacterBoard2
TC的插件突然不见了。。游戏体验极差= = 呜呜呜插件真好QAQ我们可以枚举模板串的长度,然后就可以知道子矩阵中的每一个位置对应模板串的哪一位了。要判断这个长度是否可行,可以把串中的出现过的每一位记录下来。有些位置可能没有出现,那就是随便选。#include <bits/stdc++.h>using namespace std;const int p=1e9+9;con...原创 2018-08-29 17:44:18 · 257 阅读 · 0 评论 -
TopCoder SRM 574 Div2 1000 PolygonTraversal2
看到数据范围这么小,果断暴力dfs啊。 判断线段相交看着挺奇怪的,可以观察到把两条相交线段四个端点排序后,同一条线段的两个端点会被隔开。要注意的是有相同端点的两条线段肯定不相交。#include <bits/stdc++.h>using namespace std;const int N=15;int n,m,ans;int c[N],b[N];class Polyg...原创 2018-08-28 19:40:26 · 255 阅读 · 0 评论 -
TopCoder SRM 573 Div1 250 TeamContest
裸裸的贪心啊。。(我会告诉你们我智障地FST了一发吗对于每组超过自己组的,我们要让它:最大的尽量大最小的尽量小(于是大的就可以留给别的组)中间的尽量小(理由同上)然后就是sort一下,暴力按这个流程分组,看下最后有几组比自己组大的。#include <bits/stdc++.h>using namespace std;int n;class TeamCo...原创 2018-08-28 16:05:33 · 278 阅读 · 0 评论 -
TopCoder SRM 573 Div2 1000 WolfPackDivTwo
这题被边界问题坑了,我以为不会出事的,结果出了大事,cout,printf,还有不输出的答案全是不一样的,这波操作看得我一脸懵逼。。这题还挺简单的。用f[i][j][k]f[i][j][k]f[i][j][k]表示走了iii步,向右移动jjj个单位,向上移动kkk个单位,DP一波预处理出来。最后暴力枚举到哪个点,统计答案。#include &lt;bits/stdc++.h&gt;usi...原创 2018-08-28 14:19:43 · 290 阅读 · 0 评论 -
TopCoder SRM 572 Div1 250 NewArenaPassword
题目给出的条件是一些相等关系,很容易想到可以用并查集维护。要让每一个联通块都是相同的字母并且修改最少,肯定就是全部修改成出现最多的字母,暴力统计即可。#include &lt;bits/stdc++.h&gt;using namespace std;const int N=51;int n,f[N];int tot[26];class NewArenaPassword {pu...原创 2018-08-28 10:58:56 · 323 阅读 · 0 评论 -
TopCoder SRM 572 Div2 1000 DistinctRemainders
题目说了KKK个数模mmm两两互不相同,有点类似0/1背包,每个剩余类只能选一个,可以用f[i][j]f[i][j]f[i][j]表示iii个在[0,M−1][0,M−1][0,M-1]的数和为jjj的方案数,DP一波。 对于f[i][j]f[i][j]f[i][j],若j≡N(mod&nbsp;M)j≡N(mod&nbsp;M)j \equiv N (mod\ M)且j&lt;=Nj&lt;=...原创 2018-08-26 21:09:49 · 292 阅读 · 0 评论 -
TopCoder SRM 569 Div2 1000 MegaFactorialDiv2
这次的1000好简单啊w(゚Д゚)w 然而我还是FST了。。因为中间忘记模了。。。好像就是个大暴力啊 可以直接根据题目给出的递推式把n!kn!kn!k个各个质因子个数递推出来(不过空间开不下要用滚动数组) 求因子个数有个公式相信大家小学就知道了 若x=pa11⋅pa22⋯pammx=p1a1⋅p2a2⋯pmamx=p_1^{a_1}\cdot p_2^{a_2}\cdots p_m^{...原创 2018-08-13 19:57:25 · 332 阅读 · 0 评论 -
TopCoder SRM 569 Div1 250 TheDevice
对于每一位,都至少要有1个0,2个1,如果不足就要添加。#include &lt;bits/stdc++.h&gt;using namespace std;int n,m;class TheDevice {public: int minimumAdditional( vector &lt;string&gt; plates );};int TheDevice::minim...原创 2018-08-13 20:44:13 · 290 阅读 · 0 评论 -
TopCoder SRM 569 Div1 500 TheJediTest (首次Div1 500!!)
啦啦首次做出Div500 虽然只有250+QAQ 因为还是卡了一会看到数据范围这么小,首先想到了状压 首先显然我们要让每一层的人都尽量是KKK的倍数 我们自下往上逐层考虑 为了接近KKK的倍数,要么由每一层多出来的人往上走,要么就是上面一层的人补下来 把这两种情况状压一下,1表示往上走,0表示走下来 有一个需要注意的地方就是一个人只能走一层,所以移动人数还要和原来人数取min#i...原创 2018-08-13 21:32:13 · 333 阅读 · 0 评论