TopCoder SRM 刷水

怎么样快速提高姿势水平呢?自信说应该做TopCoder!

于是我就看到了很多XJOI题,BZOJ题……好像可以搬些题呢!

 

简单整理一下,方便未来搬题(雾

为什么好多题都没有官方题解啊QAQ

 

6.23:对比了下jiry的博客,感觉我写的好简略啊QAQ,不过这篇博客只是用来搬题的对吧(捂脸 

 

301C:用f_{i, j, k, l}表示第\(i\)个等式的前\(j\)个字符匹配上目标串\([k, l]\)这一段的方案数,大力转移~

302C:状压DP

303C:斯坦纳树

304C:有点厉害的题,后面的操作可以和NIM游戏相对应,用归纳法证明[XOR = 0],后手必胜……

305C:对指数跑容斥,也就是说算个莫比乌斯函数就行了

307C:显然是把若干个数和成一个数,然后把它拆开&这样是最优的,于是暴力枚举两侧哪些数合并在了一起

360C:添加的数没几个,爆枚一发然后大力判断 

455C:点数这么少,于是暴力的把模式树扔到原树中匹配,把可行的匹配方案记录下来,然后暴力对边跑发状压DP就行了~

462C:先考虑从某个点出发,其出边有不能走的边,到终点距离在最坏情况下的最小值。再考虑从某个点出发,还不知道不能走的边在哪时,到终点距离在最坏情况下的最小值。前者枚举每条出边跑最短路,后者反着跑最短路,然后和前者的答案取较大值。

463C:BZOJ2454,一个点最多只有三种转移,某些情况下只有两种,如果以这些点为根来看,整个转移的结构就是一个无向的二叉树。如果 两个状态 到 从起点到终点的路径 距离相同 且 到起点的距离相同 且 到根的距离相同,那么这两个状态对答案的影响是没有本质差别的,可以合并

464C:用\(f_{S,i,x,y}\)表示在\((x,y)\),已知\(S\)集合中的颜色是安全的,\(i\)这个颜色危险的,不经过危险的地方到达终点的概率。用\(g_{S,x,y}\)表示在\((x,y)\),已知\(S\)集合中的颜色是安全,最多经过一次危险的地方到达终点的概率。前者用类似最长路的方法从终点开始扩展着跑,后者结合前者的结果来跑

465C:注意到如果某个点离终点的距离是小于等于\(d\)的,那么它到达终点的概率就一直是\(frac{1}{d}\)的。也就是说如果走了\(n\)步后,每步获胜的概率是一定的,那么只要求出前\(n\)步每个人获胜的概率就行。这玩意直接对两个人分别上dp

466C:考虑哪些黑色格子被剩下了,然后跑容斥,考虑哪些黑格子被选了,直接求答案

469C:注意到对于任意一种方案两个人不可能都弃疗,那么只要用总方案分别减去两个人不合法的情况。什么时候会不合法呢,令\(x\)为J先审的电影,\(y\)为B先审的电影,\(sum = \sum_{i=0}^{totx}{timeJ_{x_i},  minlow = \min_{j=0}^{toty-1} ( \sum_{i=0}^{j}({timeJ_{y_i}-timeB_{y_i}}) - timeB_{y_{j+1}} ) } \) 那么只有 \(sum + minlow < 0 \)时才会不合法,那么只要看每本电影是给第一个人呢,还是给第二个人,更新一下\(sum\)和\(minlow\)就行了

471C:听说TC会出模拟退火?

472C:一道大分类讨论题……

473C:令\(f_{c,x,y}\)表示\(c\)种颜色的车占领了\(x\)行\(y\)列的方案,\(g_{n,x,y}\)表示\(n\)辆同样颜色的车占领了\(x\)行\(y\)列的方案,后者用容斥搞,前者用后者搞

475C:注意到如果某个集合可以被选中,那么其中的兔子都可以视为选到了最大值,其余的兔子都可以视为取到了最小值,这样就不用考虑每只兔子有多种的得分的可能性了。为了避免重复计数,枚举集合中的最小值,大力DP即可

476C:对于树边,向根的方向的船的个数要大于等于\(crewSize\)。对于环边,向左走到环顶的最小值加上向右走到环顶的最小值之和要大于等于\(crewSize\),记录当前向左走的最小值就可以dp了

477C:对于一棵子树来说,最多只有一条边从其中连出去,因为子树的父边一定得走。那么直接纪录有没有边就可以树D了 

478C:分别考虑每箱苹果的贡献。对于一种选取箱子的方案,影响它对答案的贡献有:这箱苹果有没有选,剩下选了的苹果的总个数。于是只要求出不取某箱苹果,但总苹果数为\(x\)的方案数。因为苹果箱子的顺序与总的结果是无关的,所以可以把这箱苹果看成是最后转移的,这样只要跑一个转移的逆过程就行——就是一个差分

479C:每个人最多只能被卡住一次……

480C:靠虑反向的过程,第一次操作后序列会变成若干段连续的数字。注意到一段连续的数字最多被切开一次,记录一下上个数字是啥就可以dp啦,注意不能有前导零啥的

481C:二分答案,这样的话只要在每次转移之前判断一下能不能在结束前做完,就可以扔掉打印机移动的时间。直接跑状压dp,用\(f_{i,j}\)表示当前在\(i\),而启动的打印机集合为\(j\),合法的最短时间

482C:没有标记的砝码之间的和差 都是可以介出上下界的,直接在未标记的砝码的周围寻找有没有解

483C:这题非常exciting/二分答案是有反例的。更大的船可能不会更优……但是注意到两艘船的载重量之差如果大于等于了最重的,那么较大的船一定较优。于是可以二分出一个大致的解,然后暴力向上扫一扫即可。

484C:怎么样区分出两个数?只要有一张卡上一个数出现了一个数没出现即可。于是考虑这样一种贪心:把一个数放进0张卡中,把若干个数分别放进1张卡中,把若干分别放进2张卡中……这样做可以保证卡上的数字总量最少,并且每张卡上的数字个数是差不多的。二分答案即可

487C:讲道理这场的C比B要简单(捂脸)。这题真的是突破天际啊……

1 int getNumber(int m, int n)
2 {
3     f[0] = f[1] = 1;
4     for (int i = 1; i <= n; ++ i) f[i] = (0ll + f[i - 1] + f[i - 1] - (i == m) - (i - m - 1 < 0? 0: f[i - m - 1]) + MOD) % MOD;
5     return (f[n] - f[n - 1] + MOD) % MOD;
6 }
View Code

488C:列出不等时候大力讨论

489C:BZOJ????,考虑从小向大插入每一棵树,那么被覆盖的面积是可以被确定的,于是就是一个插头dp状物。

490C:你看横行这么窄,直接上倍增!用\(i,j,k\)表示从第\(1\)个矩形的第\(1\)行第\(i\)列,走到第\(k\)个矩形的第\(r\)行第\(j\)列的最短距离

491C:二分答案,匹配建图,大力跑费用流

492C:把图建的好看科学点,跑dij

493C:大力dp咯,状态是有四种的(捂脸

494C:高斯消元求自由元数量

495C:一种方案可以停靠的位置是分层的,是一种大循环节内有小循环节的结构,然后有两种层(画图可知)。于是只要记搜就行了

496C:考虑把这个哈密顿路径补成哈密顿回路,可以证明将0,1放在一起的哈密顿回路和最优的哈密顿回路是一样长的,那么只要贪心就行了

497C:BSGS。可以求出 \(0k\) ~ \(mk\) (\(m\)是一个任取的数)每一项的值,那么在 \(ik\) ~ \((i + m)k\)中符合条件的那些数肯定对应了其中的几段权值区间,二分出边界即可

498C:如果不考虑坏点的话,行列可以分开dp。考虑坏点的话,就是加一个dp+容斥,把不合法的情况给roll掉

499C:A,B,C,D个数相同的串都可以互相达到,因此根据字符的个数来建边,然后上tarjan+DP

500C:枚举9 6 8 4的个数,就可以得到所有情况,用组合数得到答案

501C:大力dp咯

502C:BZOJ4314 ,先把集合考虑成排列,最后除以\(n!\)可以得到答案。对于没有限制的情况,前\(n-1\)个数可以随便选,最后一个数补成整除。用\(f_{n,m,k}\)表示\(n\)个数,有\(m\)个数和最后一个数是相同的,和被\(k\)整除的方案数。用类似补集转化的方式转移,式子太长太鬼畜写不下(捂脸

503C:大力dp咯,仔细实现即可

504C:以C分段,按区间考虑

521C:记录前三层的状态,大力DP咯……

523C:枚举中点,meet in the middle

526C:这题\(O(n^3 log n)\)竟然不给过……,注意到当\(K\)足够大后,\(K\)增加对答案的影响是一定的,于是就好了

527C:这题是srm669C的加强版(摔,考虑一个暴力DP的过程,可以用 \(f_{x, i, j}\) 表示最小值等于\(value_i\),最大值等于\(value_j\)且和为\(value_x\)的集合的数量,转移时将若干\(value_x\)的区间拼接成一个大小为\(value_{x + 1}\)的区间。如果把\(f_x\)看成一个矩阵,那么转移是就是一个类似于矩阵乘法的东西……于是快速幂优化一下就行了……

530C:似乎是个挺裸的DP,移动的步数等于所有T比S大的位置的T-S之和,于是只需要排序后记录当前位置左侧有多少个数还未确定就行了~

531C:爆枚A, B分界点,左侧全放A, 右侧全放B,分界点上三分一下放了多少个A~三分时似乎会爆longlong...

532C:对每行内部sort一下,再对所有行按字典序sort,这样每张图都会变成阶梯状的东西。对于一个阶梯状的东西,它对答案的贡献为\(n! \prod_{i = 1}^{n}\frac{m!}{col_{i,1} \cdot col_{i, 2} \cdot ...}\)(第\(i\)行出现了\(col_{i,j}\) 个\(j\)颜色)。然后就可以大力DP啦!记\(f_{i, p, q, r}\)为对于阶梯中连续的\(i\)行,还有\(p\)列需要考虑,当前是考虑到第\(r\)种颜色,且对于每列来说,前面有\(q\)个第\(r\)种颜色的列。转移时枚举一下分界点就好啦!时间复杂度\(O(n^2m^2k)\)

533C:竟然不是哈弗曼树相关……从上向下dp,记录这层,下一层,下下层分别有多少节点,用了多少个数,每次考虑当前这层有多少个叶子节点就可以DP了

553C:二分环长,建差分约束,如果有负环就是不合法的。如何知道当前环长是否太长?只要看负环中环长对应的系数就行了,看它是正的还是负的。

554C:裸的矩阵快速幂

555C:对于某个起始位置,考虑那些修改结果与最终结果没有矛盾的时刻,越晚的时刻合法的位置显然较多,且包含较早的时刻。于是可以得到指针如果从某个位置开始,那么哪些位置必须要被事先涂上颜色。统计有重复?直接上容斥~

558C:BZOJ3774(膜拜一下建图即可AC

559C:考虑圆上的某点到另一个圆的最短路径。它要么是该点向圆心方向引出的一条线段,要么是一个沿圆周走一段再沿着公切线走。于是可以二分答案,然后判断圆上的哪个区域是合法的。

560C:如果和式中如果有\(ab\)这么一项,那么通过调整法可以证明\(a\)、\(b\)至少要有一个数达到了上下界。于是可以枚举每个数有没有达到边界,这样的话和式中的每一项都至少被确定了一个,这就成一次函数的极值问题了

561C:这玩意是棵树,然后就没有然后了 

562C:分\(k*2 \leq n\)与 \(k*2 > n\) 两种情况讨论一下

563C:用类似图哈希的方法知道每个位置的hash值,判断哪些位置是等价的

564C:如果没有限制的话,可以先随便选前\(n-1\)个数,最后一个数配平。于是从高向低位枚举每位的时候只要一个数没有达到上界,那么其他数就可以随意选了。

565C:ABC三个点构成的虚树要么是一条链,要么是星形的,分类讨论一下即可

567C:情况数少,记搜可过 

568C:有两种暴力1.枚举剩下的元素,某些匹配不能放在一边,这是个黑白染色问题,bfs判断是否合法 2. 枚举当前已知的每对匹配是向哪个方向连,然后就可以得到一些限制,某个区间向上连的线的条数的奇偶性,用bfs判断是否矛盾。合起来就行了

569C:肉眼观察法,对了有个式子很有趣\(\lfloor \frac{ans}{k} \rfloor \mod p = (ans \mod p - ans \mod k) * k^{-1} \mod p \)

570C:基佬题(雾,膜拜一下建图即可AC

571C:每个盘子上能到达的区域是个区间,直接SPFA

572C:若有解,则可以将两个字母环分别展开成链,并且对应关系不相交。暴力枚举展开方法后贪心即可,注意合法性

578C:首先暴力枚举一条将两棵子树分开的一条边,令\(f_{i,j,k,l}\)表示 以\(i\)为父亲的\(j\)这棵子树 与 以\(k\)为父亲的\(l\)这棵子树 匹配的答案,转移的时候直接跑 KM,时间复杂度\(O(n^5)\)

583C:令\(P_i\)为\(i\)次操作后仍未结束的概率,那么就有答案\(ans=\sum_{i=0}^{\infty}P_i\)。考虑容斥,令\(Q_S\)为\(S\)这个行列集合没有被选中的概率,则有\(P_i=\sum_{S}{(-1)^{|S|}Q_S^i}\),带入可以得到\(ans=\sum_{S}\frac{(-1)^{|S|}}{1-Q_S}\),然后就可以大力状压dp了

588C:把打开了哪些门状压起来,求此时最多还有多少白钥匙

597C:显然只要判断能不能塞下一个三角形就行了

603C:听说TC会出FFT?由于数据是随机的,同样的数不会太多。出现次数小时用FFT,大的话直接爆枚

608C:枚举两个障碍之间的距离,那么移动后位置关于移动前位置所构成的函数显然是一个分成三段的,S型函数,对于每次操作稍微维护一下就行了

610C:\(x, y\)是独立的,金矿的收益相当于加上一个单调函数,移动的收益相当于平移后取最大值。因此它一直是一个单调函数,大力维护

612C:枚举环的起点,所有的'L'显然是移到其中位数附近,用单调队列维护

613C:挺厉害的DP,用\(f_{i, j, k}\)表示考虑到第\(i\)列,然后左侧有\(j\)列还没有放,右侧已经有\(k\)行被覆盖了的方案数。每次向右转移时,如果左侧有限制到头了,那么就得从未选择的\(j\)列中选出一列将其覆盖。再考虑是将这列是用于覆盖右侧的限制,还是将这列用于覆盖无限制的格子,还是留下在未来用于覆盖左侧的限制

614C:只预处理出边界点的转移,并只对这些点跑高消

615C:如果(红色-绿色)的前缀和一直在0~M之间,并且最终红色的数量是\(M\)的倍数,那么就一定是一个合法的序列,那么直接dp即可

616C:大力插头DP咯……

617C:显然要按位枚举,注意到字符串的长度只有25?因此如果枚举了一个前缀,后面都放那个没有出现的字符,就可以取到最大值,同样的,如果后面如果都匹配上,就可以取到最小值。如果要求的编辑距离在这两个数之间,那么显然可以放这个字符

618C:这题似乎有点神啊?

619C:裸的DP套DP……由于只能修改两次,于是只要把会影响到答案的DP值状压起来(也就是边界的5个DP值,两串最外侧两个元素之间的关系),大力DP上就行了……

620C:……高斯消元求自由元

621C:听说TC会出SAM?然而并不会SAM,膜拜题解……

622C:数位DP……用bitset来存答案

624C:很套路的一道题,求出LCA之和就可以得到答案,这玩意可以上树链剖分,像bzoj3626那样做就行了~

625C:用\(f_{i, j}\)表示已经有了\(i\)个人,然后形成了\(j\)段的方案,转移时不考虑相对顺序及之间有多少空,最后再把它们算进去

626C:看上去一副要反演的样子,反演后就没了……,特判奇数的情况

627C:很神的最小割,不合法当且仅当横的激光和竖的激光之间有交点。于是根据此建图即可,注意一定要拆点,不然不能处理多次转弯的情况,然后你就会在某个点和答案差1

628C:注意到如果要得到两星图,那么一定是用得到二星图概率高的图去跑,于是可以将所有图按照二星图概率排序,然后dp时记录当前有多少张二星图,前面的图只要过了就行,排在后面的那些图一定要打到二星。

629C:套路题……很容易就可以列出dp方程\(f_{n, k} = f_{n - 1, k - 1} * n + f_{n - 1, k}\),注意到确定了\(k\)后,\(f\)关于\(k\)的\(2k\)次多项式,上拉格朗日插值法咯……

651C:问题可以看成求\(\prod(x^{price_i}+1)\)在\(x^{require_i}\)这项的系数。直接跑DFT就行了,取长度为\(3507\)。TopCoder不能传入这么大的数组,过不了233

653C:这题的限制是非常紧的……把限制列出来解一下就行了

654C:将两个根提起来,搞成一条线段,如果其中的某棵子树被放满了,那么东西就不能从一侧去往另一侧。用\(f_{l, r}\)表示只有\([l, r]\)中所有的房间都被放满的方案数。每次向一端添加节点转移

656C:注意到最终一定会变成两块,一侧高一侧低,这玩意的结果可以DP直接出解。然后跑一个搜索就行了。转移情况有限,状态数不多。

657C:大力搜索哪些元素在同一行,哪些在同一列,最后乘上个组合数。状态数只有\(10^5\)这个量级,因此搜索最内层的复杂度搞成\(O(n^2)\)即可水过。(不过标算好像很高明

658C:跑匈牙利,如果找到了完备匹配,那么完备匹配就是一组解。不然会在某个点会找不到增广路,这次找增广路中访问的所有匹配一定构成了一组合法的解。用dfs的过程即可说明

659C:先枚举一个传送器。然后在dfs的过程中找第二个传送器的合法位置。注意到如果有两个点之间的距离大于X的话,那么它们最终的路径一定是需要经过传送器的,两个传送点之间距离越远则越可能不合法。每次加入一个节点用线段树判断一下最长环长能是多少。这种题怎么可能在75分钟内写出来啊(捂脸

661C:先二分一个答案,然后再大力DP咯

662C:……构造题。令\(0 opt x = f(x)\),若\(0 opt 0 = a\),则有\(a opt x = 0 opt 0 opt x = f^2(x)\)。这个性质很有趣,大力搞搞就能做出来了

663C:注意到 A个数相同且第0张卡属于同一个人的两个状态 出现概率是相同的。于是我们可以把这样的状态看成同一个。那么状态数就是O\(n\)的了。因为转移只会在相邻两个节点之间进行,大力DP咯。

664C:答案由两部分组成——概率大于当前的排列,概率等于当前排列且字典序小于当前排列的。由于归并排序的上下层是独立的,因此可以将层之间的结果用多项式乘法乘起来。于是前者直接算,后者用类似数位dp的做法搞/

665C:诶,C题呢?

666C:记录下一个区间左右端的状态:两端的1是否连在一起,左右端有各有几个连续的1,1的奇偶性。然后矩阵快速幂!

668C:如果循环里没有套循环的话,只有当循环内的数的和是进入循环时的数的因数,且两者正负性不同时不会死循环。如果循环内套了循环的话,最外层循环最多执行一次,不然必定是死循环的。这样就可以DP了

669C:考虑根据币值从大到小取的过程,拆完点后这玩意就是一个分层图求两点间路径数。考虑上倍增,令\(f_{i,j,k}\)纵坐标方向走i层,横坐标方向走\(jM^k\)步的方案数 (\(j \leq M, i \leq k\)),大力转移即可

670C:这玩意直接做不好做,考虑求不合法的情况,显然此时形成了几个不同的联通块,联通块之间没有边。用线性基来求指保证这些联通块之间没有边的方案数,由于没有考虑联通块内是否真的联通,因此要再套个容斥……容斥系数好奇怪啊……

676C:把限制列出来,上单纯形

696C:这题一副DP套DP的样子,考虑给定一棵树,如何求其中是否有模式串?显然只需要记录每个点的子树中从下往上匹配与从上往下匹配中可行的长度就行,于是把这个东西状压起来,注意到模式串中没有两个字符相同,于是就不用考虑连续经过一条边的情况,可以大力FWT转移

697C:可以用用prufer 编码来解决有度数限制的生成树问题,然后爆推一波式子?有个很有趣的式子:\((x_1 + x_2 + \ldots )^k = \sum_{d_1 + d_2 + \ldots = k} \frac{k! \cdot x_1^{d_1} \cdot x_2^{d_2} \cdot \ldots }{d_1! \cdot d_2! \cdot \ldots}\)

715C:根据6来分段,段内暴力查询,需要是\(4\)次,段外面建倍增,零散部分预处理前缀后缀,也是\(4\)次,这样需要的预处理次数为\(O(\frac{n}{6} \log \frac{n}{6} + n)\),跑的过

 

posted @ 2017-06-01 12:07 AwD! 阅读(...) 评论(...) 编辑 收藏