
Thinking Training
LowestJN
强省弱OIer
展开
-
[二分 单调队列] Atcoder AGC003 E. Sequential operations on Sequence
首先可以发现,如果 xi>xi+1x_i>x_{i+1} 那么 xix_{i} 就是没用的,所以我们就倒过来求一个递减的序列然后考虑第 ii 次操作后的数列,肯定是由第 i−1i-1 次操作后的数列循环几次再加一个前缀得到的而那个前缀也是由之前的某个前缀得到的,那么就二分一下,记一下每次操作会执行几次(也就是被后面的操作覆盖几次)瞎搞一下因为每次操作最多二分log次,所以总复杂度是 O(nlog2n原创 2017-12-07 18:00:16 · 471 阅读 · 0 评论 -
[补集转换 DP] Topcoder SRM 509 DIV1 Hard. NumberLabyrinthDiv1
令 fi,j,kf_{i,j,k} 表示第 ii 个点通过加了 kk 个点到 jj 的方案数 gi,j,kg_{i,j,k} 表示第 ii 个点通过加了 kk 个点到 jj 且不经过其他点的方案数gi,j,kg_{i,j,k} 可以通过补集转换计算出 然后DP就很简单了// BEGIN CUT HERE // END CUT HERE #include <vector> #includ原创 2018-01-04 16:02:40 · 508 阅读 · 0 评论 -
[差分约束] Topcoder SRM553 Div1 Hard. YamanoteLine
可行的长度肯定是一个区间约束条件可以建城差分约束系统,那么判无解就是判是否有负环记一下负环上关于总长度的系数,二分就可以了#include <cstdio>#include <iostream>#include <algorithm>#include <vector>using namespace std;const i...原创 2018-03-07 13:23:13 · 558 阅读 · 0 评论 -
[矩阵乘法优化DP] Topcoder SRM554. TheBrickTowerHardDivOne
dpfi,sfi,sf_{i,s} 表示第 iii 层的状态为 sss 的方案数转移是一个矩乘的形式用矩乘快速幂优化#include <cstdio>#include <iostream>#include <algorithm>using namespace std;const int P=1234567891;typedef...原创 2018-03-07 18:58:39 · 465 阅读 · 0 评论 -
[容斥] Topcoder SRM555DIV1. MapGuessing
经典题了枚举初始状态的磁头位置,求出哪些位置可以随意改动,然后大力容斥#include <cstdio>#include <iostream>#include <algorithm>#include <vector>#include <cstring>using namespace std;typedef lo...原创 2018-03-08 07:53:42 · 461 阅读 · 0 评论 -
[网络流] Topcoder SRM556DIV. OldBridges
只有一个人的时候,可以把图建出来看是否满流但是两个人的时候会出现特殊情况把b1和b2反过来在跑一遍就好了#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>#include <vector>#include <...原创 2018-03-08 14:51:58 · 974 阅读 · 0 评论 -
[线性基 贪心] Topcoder SRM557Div1. XorAndSum
对数列建线性基,求出最大异或值那么不在线性基里面的元素可以把它变成最大异或值在线性基里的元素,可以把最高位的元素变成最大值,然后把其他数异或上最大值#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>#include <vec...原创 2018-03-08 15:45:00 · 685 阅读 · 0 评论 -
[最小割] Topcoder SRM558Div1. SurroundingGame
对网格黑白染色黑的格子和源点连边,白的格子和汇点连边因为如果保留benefit就必去删去cost或者所以和他相连的格子的cost大概是这样 跑最小割#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>#include &l...原创 2018-03-08 18:40:45 · 602 阅读 · 0 评论 -
[数学] Topcoder SRM560 Div1 1000. BoundedOptimization
可以枚举每个元素的值是上界、下界还是中间值,总共有 3n3n3^n 种情况若存在两个元素 xi,xjxi,xjx_i,x_j,它们都取中间值,且xixjxixjx_ix_j 不在式子中,那么设表达式为 axi+bxj+caxi+bxj+cax_i+bx_j+c,可以发现最有情况肯定是 xixix_i 或 xjxjx_j 达到边界值设 kkk 为取中间值的元素的个数所以表达式可以写作...原创 2018-03-23 11:59:49 · 420 阅读 · 0 评论 -
[期望] Topcoder SRM561 Div1 1000. Orienteering
首先每条边至多走两遍,可以选出一条最长的链,这条链上的所有边走一遍,其他边走两边。那么答案就是 2|E|−|P|2|E|−|P|2|E|-|P| 其中 EEE 是边集,PPP 是最长的链这个的期望就是 2E(|E|)−E(|P|)2E(|E|)−E(|P|)2E(|E|)-E(|P|)E(|E|)E(|E|)E(|E|) 可以枚举每条边,求这条边存在的概率E(|P|)E(|P|)E...原创 2018-03-23 14:49:58 · 428 阅读 · 0 评论 -
[DP] Topcoder SRM 562 DIV1. InducedSubgraphs
分类讨论当 2k≤n2k≤n2k\le n 时,两边是树中间是一条链,枚举链然后DP当 2k>n2k>n2k>n 时,中间部分为一个联通块,这个联通块一定过重心,求出重心后DP#include <cstdio>#include <iostream>#include <algorithm>#include <vector>...原创 2018-03-24 13:51:31 · 517 阅读 · 0 评论 -
[DP] Topcoder SRM 552 DIV1 Hard. HolyNumbers
fi,jf_{i,j} 表示前 ii 个质数,能组成小于等于 jj 的方案数 转移简单,但是记忆化会爆内存 倒过来考虑, fi,jf_{i,j} 表示用了后 ii 个质数的方案数,那么当 p2i>jp_i^2>j 时就可以用二分查找解决// BEGIN CUT HERE // END CUT HERE #include <vector> #include <list> #inclu原创 2018-01-04 09:07:02 · 517 阅读 · 0 评论 -
[矩阵树定理 容斥 meet in middle] Topcoder SRM 551 DIV1 Hard. SweetFruits
枚举最后的树中有多少个是truly sweet的 答案就是 ∑i=0nfi×gi\sum_{i=0}^n f_i\times g_i其中,fif_i 表示选出 ii 个水果使其价值和不超过Limit的方案数 gig_i 是有 ii 个truly sweet的生成树个数fif_i 可以meet in middle 设图中前 ii 个点是truly sweet, i+1i+1 到 kk 是s原创 2018-01-03 15:21:00 · 633 阅读 · 0 评论 -
[暴搜 & 网络流判定] Topcoder SRM549 DIV1 Hard. CosmicBlocks
n很小可以暴搜所有情况合法性用上下界网络流判断// BEGIN CUT HERE // END CUT HERE #include <vector> #include <list> #include <map> #include <set> #include <deque> #include <stack> #include <bitset> #include <a原创 2018-01-03 09:24:19 · 518 阅读 · 0 评论 -
[状压DP] TopCoderSRM549 DIV1 600. MagicalHats
对帽子状压,0表示没选过,1表示选过但是没有硬币,2表示选过且存在硬币。 可以先dp出每一种情况是否合法,然后dp显然只要DP出最多能得到几个硬币就好了(magician肯定会从小到大给你硬币) 对于状态S,枚举选择哪个帽子,magician会在“在这个帽子里放硬币”和“在这个帽子里不放硬币”选择较小的。记忆化搜索一下// BEGIN CUT HERE // END CUT HERE #l原创 2017-12-14 13:04:28 · 515 阅读 · 0 评论 -
[DP] TopCoder SRM548 Div1 450. KingdomAndDice
把B排序一遍,然后记忆化搜索一下用 fx,y,k,zf_{x,y,k,z} 表示a数组中第x个零,枚举到 b[y]+kb[y]+k,且 ai>aja_i>a_j 的点对 (i,j)(i,j) 有z个的情况是否可行,这样数组大小是50*50*50*2500的, bitset存一下就好了…没打过这么暴力的程序#include <cstdio>#include <iostream>#include原创 2017-12-11 20:33:37 · 550 阅读 · 0 评论 -
[矩阵快速幂] Atcoder AGC003 F. Fraction of Fractal
很神的题!!!首先观察一下每次转移如果初始的图案存在某一行 ii,满足行的两个端点为黑,且存在某一列也是满足这样的条件,那么答案就是1,因为原来就连通的黑块转移后的图案也是联通的。如果行和列都不满足,因为每次转移答案都会乘 xx, 那么答案就是 xk−1x^{k-1} ,其中 xx 为初始图案中的黑块数量。如果只有行满足这样的条件(列满足的话转一下图案),设 xx 等于黑块的数量, yy 等于初始图原创 2017-12-07 20:48:33 · 600 阅读 · 3 评论 -
[博弈]Atcoder AGC002 E. Candy Piles
把A排序一遍,设刚开始在(0,0)点,那么操作一相当于右移,操作二相当于上移,这就可以用SG函数来解决。边界的SG值为0,而且可以证明(x,y)的SG值和(x+1,y+1)的SG值相同,但是(x+1,y+1)不是边界那么x,y同时加1,直到到达边界之前,然后算一下就好了。#include <cstdio>#include <iostream>#include <algorithm>using n原创 2017-12-06 20:48:39 · 735 阅读 · 0 评论 -
[计数 DP]Atcoder AGC001 E. BBQ Hard
答案是求 ∑i≠j(ai+aj+bi+bjai+aj)\sum_{i\neq j}{a_i+a_j+b_i+b_j\choose a_i+a_j}这就相当于从平面内的 (−ai,−bi)(-a_i,-b_i) 走到 (aj,bj)(a_j,b_j) 的方案数把点放到平面上,DP就好了#include <cstdio>#include <iostream>#include <algorithm>原创 2017-12-06 20:47:43 · 466 阅读 · 0 评论 -
[构造] Atcoder AGC001 D. Arrays and Palindrome
很神奇的构造题…首先有一个结论,就是当给定数列的奇数的个数大于2的时候,就无解然后把奇数放在两端,输出 A1−1,A2…Am−1,Am+1A_1-1,A_2\dots A_{m-1},A_{m}+1 就好了#include <cstdio>#include <iostream>#include <algorithm>using namespace std;const int N=110;int原创 2017-12-06 20:47:17 · 596 阅读 · 0 评论 -
[FFT] Atcoder AGC005F. Many Easy Problems
每个点的贡献是这个点出现在多少个方案中 方案数是 (nk)−∑(Sik){n\choose k}-\sum{S_i\choose k},SiS_i 表示删去这个点后剩下的子树的大小那么答案就是n(nk)−∑i=knai(ik)n{n\choose k}-\sum_{i=k}^n a_i{i\choose k} aia_i 表示有 aia_i 个子树大小为 ii 展开后得到1k!∑i=knai⋅原创 2017-12-22 18:50:51 · 511 阅读 · 0 评论 -
[二维区间DP?] Atcoder ARC004E. Salvage Robots
可以让出口移动,robots不动 fu,d,l,rf_{u,d,l,r} 表示出口活动的区域为 (x−u,y−l)(x-u,y-l) 到 (x+d,y+r)(x+d,y+r) 这个矩形时最多能救多少机器人。转移的话,画画图可以知道哪些区域求不了#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>u原创 2017-12-14 21:30:14 · 496 阅读 · 0 评论 -
[矩乘优化DP] Topcoder SRM550 DIV1 Hard. ConversionMachine
每个位置显然是先变成正确的,然后进去若干循环这样就可以算出最多进行多少轮变换,令 fi,j,kf_{i,j,k} 表示进行了 ii 轮变换,有 jj 个位置差一次变换, kk 个位置差两次变换直接DP肯定不行,可以用矩乘优化// BEGIN CUT HERE // END CUT HERE #include <vector> #include <list> #include <map>原创 2018-01-03 11:20:24 · 617 阅读 · 0 评论 -
[补集转换] Topcoder SRM563 DIV1. CoinsGame
枚举两个点,如果经过一系列操作使得一个留在棋盘上一个不在,那么这个点对是有价值的那么合法的放棋子的方案一定包含至少一个有价值的点对但是点对个数是 O((nm)2)O((nm)2)O((nm)^2) 的,直接容斥不行补集转化一下,可以发现如果点对 (a,b)(a,b)(a,b) 和点对 (b,c)(b,c)(b,c) 是没有价值的,那么点对 (a,c)(a,c)(a,c) 也是没有价值的...原创 2018-03-24 13:58:12 · 774 阅读 · 0 评论