这是一个非常艰巨的任务,但我一定要完成。因为中间有一些题目当时就已经弃了,所以这不仅需要时间更需要能力与勇气。
20170117 JYB的GR1
这是我test文件夹内的第一场比赛。很有实际意义。是图论,代码太丑了讲真的。
T1多组数据,判断一个图是否是二分图。当时太单纯,以为联通块只有一个。DFS很短,但我当时用的是BFS。BFS千万不要忘了原始写法。
T2最短路裸题,当时不谙世事还专门下放点权,太麻烦。
T3并查集+DP,写的实在太丑!!!居然还用链表,让我十分难堪。
唉,成长啊。现在大概30分钟内就可以结束了。
20170119 JYB的GR2
T1是一个极其简单的拓扑排序,但是我的写法太难看,所以当时调的也很伤心。
T2把数据抽象成图后缩点,统计入度为0的点。
T3给你一个无向图,选择一些边使得所有点均联通,询问所选边的权值的最大值最小是多少。显然这里的最大值就是最小生成树的最大边权。但是当时JYB却并没有意识到这一点,居然写了二分。当时一直不明白,现在终于懂了。原因请见刘汝佳蓝书的最小生成树部分,中间是有一道类似的题目。只是那道题是有向图,从点1开始能够到达其他边。这是必须要二分的,原因是最小树形图的特性。
当时我的代码太丑了!
20170121 idy的DS1 DFS序、 ST表、线段树练习
T1简单线段树
T2简单线段树
T3树套树或ST表,真的不知道当时从何处来的意志让我敲出了二维的ST表
还是太丑了
20170122 idy的DS2 LCA 值域线段树 加 复习
T1给定一棵树,询问任意2点的距离。ST表倍增
T2给定一棵树,修改询问单点子树
T3裸的值域线段树
现在看来都水的不行
20170123 idy的DS3
T1是一道裸的重链剖分,求2点距离(注意链剖时跳的顺序,swap时比的是top)
T2询问一条链上的中位数,可以可持久化线段树+树上差分搞出一条链,想当年1月24号放假(所以也是1月24号开黑……那一天idy讲了splay,sbt,点分,扫描线,分块,莫对,K-D tree),T1和T3我做的很快,但是这道题搞了我一个晚上。很迷乱,最后让idy来check。他check了很久,最后没有发现错误。我就很伤心了,一个年都过得很不愉快。这给我留下极其深刻的印象,以至于让我后来很害怕DS。2017年10月9日,本人用了半个下午,凭借“强大”的调试能力终于发现了背后的一切。
是IDY的STD有problem,而ta可能因为时间原因没有对拍,其他都是对的,可是……我不信ta不会写主席树,可是这个地方确实很有可能出错,就是nd对fa的完全继承,这是极其重要的。因为idy忘了这件事情,导致值域线段树变成了不可重集。而且ta求链长(用的是dep[u]而非root[u]->cnt)是正确的,所以更加恶心。我试着像idy一样错(很好改),就A了这道题。当时的问题终于得到了解决,为什么我却感到如此空虚?
T3修改询问子树路径,链剖+线段树挺简单的
代码风格被idy好好改造了一番
20170206 CKY的DP1
T1是求“最少插入多少个字符能把一个串变成回文串”。如果能在原串S中找到最长的子序列L,这个子序列是回文,那么我们就能知道要插入多少个字符是的原串成为回文。所以只用求原串S与逆串S’的LCS(最长公共序列,为什么没有nlgn做法?)
T2就是著名的SCOI2009粉刷匠,当时常数过大,我优化到了一种境界。但是已经卡不下去了……
T3数的变换,可以转化为结点和边的关系。因为大结点的“出边”只连向小结点且“出边”至多一条,所以说这个图无环。但注意到这是一个无向图,所以这是一个森林。很容易发现答案要求的就是最长链,而这条链一定在1号结点所在的树。所以建好边搞2次DFS就好了。
T4是一道不错的树形DP。给定一棵树,一个人最开始在1号结点,一共能走t条边。第一次到达某点时即获得该点的权值(≥0),求最大权值。可以开三维的数组f[u][i][0/1]表示在u的子树内走i步是否返回u的最大权值。当时转移方程有3个,但我当时真的死活只认2个。现在看来觉得很不严谨,又把方程修正了一下,轻松易懂。成长啊。更深入的思考。
20170207 CKY的DP2
T1是裸的LIS,离散化+树状数组其实很方便,但是有一种方法很巧妙:单调栈+lower bound。这样的话,实际上是多支队伍齐头并进,一层盖过一层,很有气魄。
T2是一道挺有意思的树形DP。其意为:给一棵树,请选择k个点染色,使得染色的点互相联通且染色点与非染色点的交接边最少,输出最少的交接边数。显然k个点有一个顶,于是就很好转移了。
T3状压DP,多米诺骨牌,1表示侵下一行(竖的),0表示不侵下一行(被前一行侵或是横的)。发现状态不用组合数,只需判定可行性,即是&了为0,|了之后一段0是偶数个。
T4有若干个硬币,求在恰好拿出和为k的硬币时,可以凑出那些面值的硬币?发现二维即可,方程很好转移,题目怎么给你就怎么设。
20170209 CKY的DP_STRING3
T1是一道挺好的题目。KMP匹配,但是1,2,3和4,8,9是可以匹配的。我们可以使用树状数组,使用类似康托展开(与前面相比)的方法进行动态排名。还是要好好搞定KMP、SA、AC自动机和SAM。
T2是在AC自动机上DP+矩阵快速幂。因为结点最多只有100个,所以矩阵最大为100*100。
T3求2个串的LCP(最长公共子串)。可以把2个串拼在一起用特殊字符分隔,然后求出height易得。或是二分答案+hash,看上去也很清真。
这套题确实挺难得
20170211 idy的MA1
T1求二元一次不定方程。ax+by=c,应该先算出d=gcd(a,b)。如果c%d!=0则无解,否则将abc均除以d。然后用exgcd算出ax0+by0=1的解,因为有bx1+(a%b)y1=1的解,故x0=y1且y0=x1-a/b*y1。临界条件是b==0,则有x=1且y=0。得到了x0和y0,于是可以推得x=x0*c+k*b且y=y0*c-k*a。必须注意的是,要abs,不然很不好。
T2是广义的CRT,即是模方程的合并。当时挂了,是因为不行之后直接返回了,这一回少读了就必须下一回读。多组数据的坑啊!
T3是递推用矩阵快速幂加速。单位矩阵很有趣。做法有2种,一种是原来的*大幂,另一种是大幂*原来的。
T4是打表算出2^f(n)%107,f(n)为catelan序列。
这段时间的总结我曾经写过(那时我还没有blog),现在放在总结(20170218~20170310)上了。此处只略写我现在的理解。
20170218 NOIP10
T1模拟,滚动数组。但要注意,因为新单词可能为0,所以原始的开法不能开0。
T2是DP,只有4种卡片,所以可以直接开4维,连long long都不用开。
T3就是著名的关押罪犯。给定一个普通图,你可以将每个结点染为2种颜色之一,使得相同颜色结点之间的边的权值的最大值最小。2种做法:1.二分答案+二分图染色,让最大值最小二分答案是很好的,把低于mid的边都无视掉,其他的边上的结点颜色必须不同(就是二分图)。2.排序+并查集,因为只是让最大值最小,所以可以贪心。开2n个结点,1~n表示在一个并查集中,n+1~2*n表示不在该并查集中。于是按边权排序,发现如果已经被迫在一起就不行了,否则该怎么连怎么连。
T4就是著名的引水入城。如果有解,每一个蓄水厂就会对应沙漠上一段连续的区间。于是变成了区间覆盖问题,爱怎么做怎么做。当然最快的还是用线段树了。单点查询区间修改。
20170224 FRI1
T1是一道经典题目,旅行商TSP问题。就是在一个带权完全无向图中,找一个权值最小的Hamilton回路。普通的方法是使用状态压缩动态规划,但是使用模拟退火也能得到不错的近似解。
T2也是一道不错的题目。老张到了地方才关灯,所以只能一层层向外关(像个洋葱),不然不优。一层层就是一个连续区间,在关掉[i,j]这段区间所有的灯时,老张一定在区间某端点。此时[i,j]之间的灯都已关掉,于是只有到i-1或j+1去,中间要走一会儿而其他的灯就又会耗能,直到再多关了一盏。使用前缀和就可以很方便的转移,而空间是O(n^2)的(如果你非要开滚动我不拦你),时间也是O(n^2)的。
20170225 NOIP08
T1模拟,0和1显然非质。T2范围太小,当时直接打表,效率还很高。T3是在矩阵中选取2条无交点的道路使得权值和最大,test上我写的不对且对,题目上不允许一个点经过多次而我做成了不允许一个点的点权获得多次(但点权均为正)。正解是强制一起走,曼哈顿距离不变一起走就很好去重了且四维变三维。
T4双栈排序真的很好,栈的那个很强的结论使得我们可以任意排出两两的栈矛盾,发现如果有解就是二分图。于是贪心染色,只为让字典序最小。最后按颜色模拟就好了。☆☆☆☆☆☆
20170303 NOIP05的一半
T1就是一个区间的不断覆盖,问最少碰石头几次。考虑到L很大但石头很少,所以在石头之间完全可以大步跳跃,即是把问题离散化。
T2篝火晚会不过是一道模拟题,但当时写的拖泥带水。不过有了致命的错误居然还能有80分……
20170304 NOIP09
T1就是模拟,注意读题。T2挺简单的,分解质因数稍处理一下就好了。T3最优贸易也是经典题目,tarjan或是SPFA。T4是著名的靶形数独暴力搜索题,用好const和位运算能够大大优化搜索。
20170310 NOIP11D1
T1就是模拟(当然不是全局暴力染色)。
T2倒是不错的题,但我的写法确实不是DP。其实就是统计,注意去重和漏掉情况。
T3就是暴力搜索MAYAN游戏,可是为什么调不出来……
这两场也有出处,现在放在了总结20170317那一周上。
20170317 MHY的MA
T1真的是一道大水题,询问1~n的排列中有多少个单峰数列。很简单,定最大值和最小值,每一种剩下n-1个数,于是为2*2n-1种,然后发现只有顺序和反序有重复,所以减2。只是观看数据范围,显然需要快速乘。
T2求逆元的板子题。三种写法那时就已总结完毕。
T3是一道非常非常好的数论题,超立方体。我在SIP中再讲。
20170318 IDY的DS4
我觉得当时7月份已经总结得很好了,可以直接看:旧题新做:从idy的视角看数据结构
现在看来,T1根本不需要开双倍数组,也不需要循环。直接统计就能出答案啊。
T2现在再品,尤觉得是一道好题。对于每个节点,存储区间内的最高值与抽出区间后能看见的楼房数。build时单点值很好处理。中间只需要多写一个函数,可以算出一段区间在前面有h挡着能看见多少。如果左区间的最大值太小,那么只需要访问右区间。反之,右区间不变,只需要查询左区间。update时就可以这样方便地向上传递。考虑区间修改,自然可以打flag,pushdown肯定很方便,只是要掌握好pushdown的时间。考虑区间查询,最好的方法还是把所有相关的区间都抽出来,然后for一遍解决。因为内部操作最坏是O(lgn)的,所以大概是O(nlg2n)的复杂度。可是,居然暴力跳跃也可以过,我也是很惊讶的。
T3就是一个维护双向值的树链剖分,注意不要把方向搞混了。
20170325 CKY的DP_STRING4
好题。
T1当时居然傻到认为这样可以A掉。明明是一道裸的DP,当时以为DFS也可以(复杂度mn≈2020)!!!意识到是DP,就是水题了。值域范围是7500。把7500当0使,-7500~7500就变成了0~15000
T2是一道挺简单的数位DP。数位DP是完全是有套路的。一般情况下定义状态为f[i][j][...],表示一个i次幂(对于一个bit位数有0~bit-1次幂)首位为j还有其他的一些信息。计算f数组时通常可以使用记忆化搜索,转移一般不是很复杂。统计时一般统计0次幂的所有数到bit-2次幂的所有数,然后从bit-1位开始逐渐填满,在有必要的地方break掉。我觉得当时我写的有很大问题。
T3当时整个人陷入了迷茫,虽然手算都可以30。还记得那时我问WSQ这题怎么做,ta说这不是水题么!这句话还让我感慨了好久。其实这道题并不难,题意是一个4行*N列的矩形(N≤15)上染256色,要求每一行的颜色单调非减,同时要求一些位置的颜色都相同(要求数≤100),询问方案数。发现一个一个颜色填就好了。要填就把之后的填了,但拓扑序还是很奇怪。不懂不懂!
T4是棋盘,DP转移的比较暴力,就是一个64*64的矩阵快速幂,当时代码实现能力太弱没有调试出来……这种应当hash一下的。
20170327~20170331 LINYIN五日游
省选之前,去玩了一圈……
有不少很好的题目,如果有时间我一定会回来做总结。
当时实在太弱了啊!
20170403 JYB的GR3
T1是JYB搬砖,最开始有一排n块砖。有两种操作:1.把x所在的那一堆砖摞到y的那一堆上。2.询问x号砖下面有几块砖。题号为POJ1988。
T2本来是一道极其简单的题目。但是,为什么高速公路是单向边!!!为什么这样的题庇护SPFA而专门卡DIJKSTRA!!!不过也确实学到了,k与边的倍数差有关。
T3就是判断一个有向图是否是一个半联通分量。tarjan+拓扑排序。BZOJ上的半联通分量是要求最大的半联通分量和方案数,所以需要一些辅助数组方便更新。但是此题只是判断一个有向图是否是半联通分量,这句话意味着当且仅当拓扑排序是一条链。这意味着拓扑排序时队列中时刻只有一个元素,就不需要辅助数组了。(当然不能直接判出入度)
T4是给一个n点m边的带权无向图(n≤2000,m≤200000)。除此之外,你还有k个方案(k≤2000),一个方案是指你可以使用一些代价获得若干条给定边。你必须选择仅一个方案,问选边使得整个图完全连通的最小花费是多少。虽然m很大,但是最后的结果一定是选择了一个方案然后配上了若干条最小生成树中的边。预处理出最小生成树的n-1条边,枚举m个方案,然后再在这n-1条边中选择。总的复杂度就是nk的。总之不要忘了,在最小生成树中任意一条边都是连接两个集合边权最小的一条边。
20170404 IDY的DS5
这个也总结过。T1重点在于线段树标记下传的顺序。T2就是一个矩形面积并,思路是加上一个类永久化的完全覆盖标记,注意这里还要存覆盖了几层以方便进退。这个地方其实还有一层意义我当时并没有想到。就是中间并没有pushdown,modify时也只是修改了标记。就是说,一个节点有两个值cov和sum。cov就是标记,而sum是指如果没有完全覆盖该区间的。发现并不用pushdown,因为一来对应一去,并不会没事儿找抽。而且只询问根,如果
T3就是一个普通的树状数组套线段树,处理询问时成捆来就好了。但是vector实在太慢。
20170405 JYB的GR4
T1是一道差分约束。时刻牢记差分约束的定义,就不会搞混。
T2是一道很有意思的题目,T组询问,每一组询问s+1~s+n是否能和1~n完全匹配,匹配的条件是属于s+1到s+n的那个数是属于1到n的另一个数的倍数。看上去就是普通的n3的匈牙利,可是s和n竟然达到了1e9!!!首先,有一个很显然的事实:如果s<n,那么s+1~s+n能与1~n完全匹配,“当且仅当”n+1~s+n能与1~s完全匹配(但我不会证必要性)。这可以用于缩小n的规模,但这不是最重要的。上面这一事实告诉我们询问可以做到完全无交集。这样的话,只要n>600,就可以保证s+1~s+n中一定有质数且显然该质数>n。原因是s≤1e9,而JYB的N其实合法的就只有30多(可能是ta当时并没有认真出数据)。
T3是要把层次图先跑出来,然后BB掉非层次图的边,在此基础上用DINIC跑最小割。(保证不能沿层次图行军就够了)
T4是一道很好的题目。初始时给你一个带权无向图(n≤100000,m≤200000),然后逐渐在图上加边并询问当前非桥边的权值和。可以用tarjan预处理出未加边时非桥边的权值和,而边双缩点后得到的是一棵树。于是之后再加边事实上是让两点路径上的边都变成了非树边。这个使用树链剖分+线段树可以很方便地维护。我觉得这个思路和BZOJ1576安全路径其实挺像的,建立出最短路径树,非树边会对树上的一条路径产生影响。而如果没有修改,就像次小生成树那样,使用倍增来维护一条路径。
20170406 IDY的MA2
上一次是二月份,下一次是八月份。
T1扯掉外衣就是一个裸的求组合数。我说过的,求组合数有很多种方法(杨辉三角,预处理阶乘与逆元(+CRT),(拓展)Lucas(+CRT),线性筛暴力拆分)。但是IDY并没有意识到在ta的数据中逆元一定是存在的,所以根本不需要CRT。
T2要算3x%MOD(x≤10100000)。并不是不会十进制快速幂,只是这东西有循环节而且很小啊。3488540Ξ32(mod 1e9+8)这里之所以是9,因为1e9+8是9的倍数。于是连字符串都不需要,像读优那样就够了。
T3询问∑[c(n,i)%p==0]。这道题的变种后来在20171020的T3中出现了,而T3更难。此题的i∈[0,n],而后来那道的i∈[L,R]。前者可以公式化,而后者是一道五进制的数位DP。但实质上,就是看你如何理解Lucas的。
T4就是算错排数。f[i]=(i-1)*(f[i-2]+f[i-1]),就是i扔到i-1个位置之一的x,如果x不在i号位置就是f[i-1],如果x在i号位置就是f[i-2]。
T5就是普通的积性函数计算。套路。
20170407 CKY的DP_STRING5
T1是区间DP,因为要求各个匹配不相交。破环为链后,就可以很好解决了。但是枚举k的时候,显然i和k可以匹配,或是k+1和j可以匹配。于是可以使用链表进行优化,速度可以快很多很多倍。
T2就是一个树形DP+分情况讨论,挺有意思的。
T3是KMP+DP,当时被CKY坑了。其实求出匹配的方案数,而f[i]=f[i-1]+f[i-L]*(i-L+1~i是t)。
T4给你一个长度不超过3000的序列,问其中最长的fabonacci子序列。空间复杂度O(n2),时间复杂度为O(n2lgn)。其实和普通的LIS挺像的,只是因为多一维枚举,时间和空间都要加倍。另外,因为LIS只要求偏序关系,所以树状数组就够了。而这里要求的是准确值,所以需要使用平衡树(map)优化。但还是要注意枚举顺序,我当时写的那份就可以被卡成O(n3)。
20170408~20170409 SCOI2017
因为出题人泄密,所以这道题涉及了很多争议。直到现在,网上都看不到SCOI2017……
D1:T1是一道送分的长链剖分,但我当时写成了重链剖分考场上还不知情。T2是一道动态点分套树链剖分,WSQ写出了正解,而HZX则用BFS骗了分。T3是一道算几,有的东西可以合在一起算。
D2:T1是一道送分的期望DP。T2是一道线性RMQ+math。T3就是搞砸SCOI2017的题目,导致NSOI的string颇受人诟病,但确实是一道很好的题目。
我觉得这套题挺好的,本来如果找得到,还能再改一改。然而可惜了,可惜了。
20170422 CKY的DP_STRING6
挺好的一套字符串题。
T1是一道前缀和hash,中间使用了选主元的思想。
T2让我终于明白CKY的KMP写法到底是有多玄学。使用蓝书上的写法,就只用多维护一个栈就好了。
T3就是一个AC自动机的模板题,觉得当时写得好丑啊。如果使用泛式AC自动机就不用处理失配了。我觉得当时我写的很有问题,应该递归地去找所有匹配成功的模板。
T4是一道SA的模板题。询问一个串有多少个本质不同的包含字母a 的子串。预处理出sa(排名)数组和height(公共长)数组以后,统计其实很简单。
20170501 NOIP13D2
反正当时只有160。
T1当时有两种做法,一种是不需要数组,另一种从最高点向两边用到了单调栈,最开始两个算法都看不懂。后来看懂了第一种,想法十分巧妙。就是把整个积木竖着看,就可以发现数的是实际段数。这个取最上面的就好啦!所以是if(now>pre) ans+=now-pre。
T2给你一个序列,问最长波浪子序列。Liurunda有一次出的题是询问n排列是波浪序列的方案数。后者是DP,前者就很显然了。去重过后就只用统计拐点就好了,首和尾显然都可以作为拐点存在。注意特判一个数的情况。
T3就是大名鼎鼎的华容道。做法基础是“空格先移到大王旁,然后空格绕着大王转,或是大王和空格易位,最后大王到达终点”的过程。这个可以使用一个二维状态(大王在哪儿,空格在哪个方向)的SPFA进行解决。“空格先移到大王旁”的过程可以使用BFS,但要注意空格不能走到大王上。之后,“大王和空格易位”很容易处理,但“空格绕着大王转”就需要预处理了。为了快捷(特别是因为图小但询问组数很多),进行预处理,使用4*4*n的数组进行存储的值。这个用的BFS和前面那个BFS是一样的。使用pair来表示一个坐标点很方便,但要处理好这个和数组的衔接。
T1和T2都是贪心,大概是考虑到大家调试T3会比较费心费力吧。
20170505 NOIP2013D1
也是一套好题。
T1就是一道考你矩阵快速幂的题目。在x的人,玩了10^k轮,每轮动m步转圈圈。显然就是(x+m*mpow(10,k,n))%n。如果是从1开始编号,就是(x-1+m*mpow(10,k,n))%n+1了。
T2是一道挺不错的贪心。首先肯定一一匹配最优,但当时没有仔细读完题目(该sha!),以为可以任意交换问题就变成了数环。但其实是相邻交换,题目保证各不相同,就是普通的求逆序对了(如果没有各不相同的限制,就是YJQ讲杂题的那个就近原则了)。但是这个求逆序对还是要处理一下。先把b离散化了(按值排序就知道第几个位置排名多少rank),然后把a排个序。现在是相邻交换,让a变得像b一样。就是a'[i]=b[i],就是a序列中排名第b[i]的位置应该附一个新值i了。至于逆序对,mergesort和Binary Index Tree都是可以的。
T3竟然也是贪心。建出最大生成树,然后进行倍增。只是当时过于naive,倍增的第二个for的退出条件写错了(顺手写成了p于是不会访问p==0的情况)。犹记得当时还调试了很久很久,整个人颇为绝望。小地方出大事情啊。
20170506(YLS的DP1)
20170520(YLS的DP2)
20170601(NOIP模拟--YUCAI共8试)
day1(55=0+50+5+0)
犹记得当时踌躇满志却被当场打脸的尴尬情景。发现我旁边那个人非常沉着,我觉得ta一定很强。之后才发现,ta居然从高一下才开始学。这个人呢,就是我亲爱的朋友Amphetamine啦。
这一场我以前是写了心情的,参见:东北育才 NOIP模拟赛第1场。
T1当时确实有很多人A了,我当时却无脑贪心。当我今天再次看到这道题时,居然想到的还是sort+unique,看来是不到黄河不死心辣(其实很显然,10个10的排列怎么可能才只有10的价值呢)。给你一个长为n的序列,你可以任意排列这n个数,使得有最多的数比前一个大。贪心的考虑,每一次可以选取一段最长的LIS,可以获得的价值是长度-1。就是说每一次取都会失去1的代价,所以要取最少次数。这个显然就是出现次数最多的那个数的出现次数。这个显然for一遍就好了,但我当时实在是脑洞大开。我开了一个数组,不停的往里面塞数,刷出来一些新的位置。刷出来多少就得减多少,实质上就是出现次数最多的出现次数。但是这个方法明显可卡,当有14143个相同的数时,就会轻松破亿。
T2这东西显然可以像数位DP那样拆成前缀和相减。统计也很方便。但我最后是挂掉了50分,原因是引入快速乘的数大于了MOD。这就很值得反思了,因为我也因为往快速幂里扔了负指数而直接TLE的经历。以后像这种,要治本,就只有在函数内部模一模,在该模的地方一定要反复查看模了没有。我觉得一场考试在最后结束之前应当一个一个字节的读一遍代码,自己都容易绕进去的东西能不写就不写,保证全文流畅顺滑是很有必要的。平时提交前如果可以也应该如此。
T3提到了仙人球。仙人掌是每一条边最多只属于一个环,相当与是树上有若干非树边,它们最多只在交界处相交。而仙人球是每一个点最多只属于一个环,就是仙人掌的弱化版本。这道题询问仙人球上两点简单路径条数,并不用tarjan来缩点,直接用DFN找环就好了(中间存一下后继或是开个栈)。把每个点的归属环找出来,算出每个“环”的贡献(真环贡献为2)。当时只有5分,是因为倍增跳错了,后果很严重。但其实现在想来是自作孽,写成那个鬼样子,我真的很愤怒。
T4是一道很扯的题目。保证了的x1==y1完全就是骗人。但是一定要按照x1==y1做,而且只能取x1而不能取y1。贪心的做法是牵绳子,一定是绷紧的时候最短。题目用了数据结构优化DP,因为ta的转移是从前面若干位置转移过来的。其实真的是naive啊。
day2(100+100+0+70=270,chocolate day)
啊巧克力真好吃。
T1是求裸的组合数(小n,m模小质数)。我常常说求组合数有四种方法:杨辉三角(克制小数据)、floor和inv(nm较小,常模质数)、(拓展)LUCAS(模小质数或小质数多次幂)、线性筛(nm不是太大质因解)。这一次用了最后一种,但是统计十分暴力。
T2算∑n/gcd(i,n),稍微变一下形可以证明这是积性函数。可以直接线性筛,但当时没有意识到。于是居然可以暴力统计∑d*φ(d),居然还A了……
T3就是一个BFS,但二维的离散化确实比较恶心。
T4就是个打表辣!但是正解就是著名的数集公理化构造。
day3(100+10+40+0=150)
很不喜欢这一套题,讲真的。T1如此水题数据也水(我没有去重也过了TAT),T2是什么鬼东西,T3是什么鬼东西,至今不知道T4想说些什么。
day4(100+100+30+90=320,chocolate day)
T1真正的经典大水题,T2就是一个简单线段树,T3当时完全不会做只会写暴力,T4就是一个很简单单调队列当时却想复杂了(虽然也是单调队列)而当时只有90分因为爆int了
T3的解决方法很优秀。因为∑≤1e6,所以本质不同的值只有1e3个,这个1e6的01背包就变成了一个1e3的多重背包。使用二进制拆分+bitset,速度就是1e6*1e3*log1e6/64,不知道快到哪儿去了。
day6(100+30+0+10=140)
Day5没有考试。记得这套题我没有怎么改错……
T1是一道不错的期望,现在看来是一道不错的鹰蛋。而这个东西收敛的很厉害,发现只要警告次数大于10就会全部变成同一个值(因为次数已经足够二分了,但不能直接输出log,因为这里是离散量与log存在差异)。边界也很有意思。
T2就是那道给我了很深很深印象的三角形。当时只会暴力30分。这是一道很优秀的计算复杂度的题目。重点是k次一下的暴力重构。对于询问,每一次处理n行的前缀和,然后处理出k次操作对询问的影响(分类讨论较多),整体是O(q(n+k))。对于修改,只是记录一下。而重构则需要把近来k次的修改都集体处理了,中间每一行使用差分,这样一次修改在重构中的体现就是O(n)的,而如此算来一次重构的复杂度就是O(n2+kn)。重构了q/k次,总的就是O((q/k)*(n2+kn)+q(n+k))的。显然k~n时最优。
T3是一道BFS预处理+二分答案BFScheck。处理出每个点离最近怪物的距离,二分答案跑一跑并不难。
T4还被lemonoil搬去做过vijos胡策题。因为m最大才15,所以不会影响前面的位。后面的位一个个枚举其实挺好转移的。
day7(40+40+0=80)
T1就是当时JIJI掉很多分的那道。两个问题:缩点以后,有多少个点入度为0?至少要加几条边使得整个图成为一个SCC?对于第二个问题,当时没有想清楚。但题解说的很好(在下面)。而注意需要特判原来就只有一个SCC的情况。
要为每个入度为0 的点添加入边,为每个出度为0 的点添加出边
假定有n 个入度为0 的点,m 个出度为0 的点,如何加边?
把所有入度为0 的点编号0,1,2,3,4 ....N -1
每次为一个编号为i 的入度0 点可达的出度0 点,添加一条出边,连到编号为(i+1)%N 的那个出度0 点,这需要加n 条边
若m <= n,则加了这n 条边后,已经没有入度0 点,则问题解决,一共加了n条边
若m > n,则还有m-n 个入度0 点,则从这些点以外任取一点,和这些点都连上边,即可,这还需加m-n 条边。
所以,max(m,n)就是第二个问题的解
T2是一道很好的题目。给你一个500*500的01图,询问有多少个矩形中的1不少于k个。先统计出二维的前缀和,这样子矩阵的和可以O(1)算出。之后枚举左右边界O(n2),然后下边界移动O(n),发现上边界可以使用单调队列滑窗。总的是O(n3)
T3是一个二分图匹配。但我有WA还有T。具体问题出在:link和used的空间使用问题(其实并不用开2倍空间),读入的处理问题(很可能是题读错了),以及find不到应该break掉。
T4?!没有T4了。
day8(100+5+20+0=125)
嗯,阳光长跑可真阳光……这套题当时也懒得改……
T1是一个挺简单的模拟,虽然说是方案构造。1~n的排列对应一个a+b,显然一个1~n的排列可以凑出来1~n(n+1)/2中的所有数。怎么证?题解说得很好:“从大到小贪心,设当前剩余分数为X,当前枚举到i,若X>i,则取i,否则说明只剩下一个比i小的分数j,则取掉j。”
T2是一道丧心病狂的好题。首先,题目中提到了一种区分前导0的做法,在最前面加一个1(后来我有一次打CF时也用到了虽然很显然)。当时居然还naive到把这道题当搜索做。此题可以使用状态压缩,f[s]就表示题目所求。考虑到“进化”是把前缀copy搬尾部该前缀再从头删几个,整个转移是O(n2)的,这个n指长度。而这个“进化”也可以理解为:删掉一个前缀,把一个更长的前缀copy搬尾部。然后可以进一步拆分,就是非常恶心的位运算技巧了。
T3据说是清华校测题,是一道非常恼人的模拟。
T4挺经典的。题意:给定一个二分图,问有多少种方案能使断掉一条边后的最大匹配数减小。这道题当时并没有调试。
沈阳就这样了,但题单真的好长好长啊(继续下去的动力所在啊)……
20170701 NOIP15D2
记得当时好像T1炸了,之后才好好探究了一番二分答案。
未完待续……