2019.1 纪中集训

day1

\(T1\) https://www.cnblogs.com/zzqtxdy/p/12181226.html
\(T2\)
一堆\(01\)串,有一些挖了一个空。要求找到一个填数方案,使没有一个串是另一个的前缀。
trie优化2-sat建图即可
\(T3\) https://www.cnblogs.com/zzqtxdy/p/12181283.html

少打了一个小时。。。
\(T2\)第三次写还是花了一个多小时,数组开小爆了\(30\),码力太菜。。。
\(T1\)只会个两个\(log\)的做法,还爆成\(10pt\)。。。
\(T3\)写了个压状态的\(dp\),根据数据水的程度应该能过,但是来不及调。。。
排名居然还不低
\(T1\)咋对拍啊。。。

day2

\(LOJ6041\)~\(6143\)。。。昨天好像也是雅礼集训\(2017\)的一场。。。
\(6041\) https://www.cnblogs.com/zzqtxdy/p/12184870.html
\(6042\) https://www.cnblogs.com/zzqtxdy/p/12185072.html
\(6043\) 只有大于等于\(4\)的时候需要枚举,搜一下就行了。场上非常\(sb\)地每次修改把环上所有点打标记,这样就多了个\(n\),虽然不知道能怎么卡。

看题花了一个小时,\(T1\)第一眼会个\(n\sqrt{n}logn\)和一个\(nm+n\sqrt{n}\),想来想去也不会正解,\(T2\)大概会个\(n^2\)搞一搞,\(T3\)切了。
然后写完拍完\(T3\)花了将近一个小时,想\(T1\)想了半个小时无果就开始写。
结果剩下将近\(2h\)全用来写\(n\sqrt{n}logn\)了,一看这一堆\(stl\)就觉得自己连\(50000\)都过不去。
\(T3\) \(A\)了,\(T1\)\(n^2\)同分,没碰\(T2\)。神仙\(lxy\) \(AK\)了,被吊打了。。。
\(T2\)场上\(sb\)了,想着把大的那棵子树跟小的平衡一下,就很难搞,实际上插到这个点上就行了。。。
没想到自己码力这么菜。。。应该先把暴力写了。。。
T2并不难想,就是场上\(sb\)+\(T1\)浪费时间,\(T1\)常数又大,码力还菜,早知道写\(n^2\)了。。。

day3

\(T1\)

一棵有根树,每条边有一个容量,给出\(m\)条路径,一个端点是另一个端点的祖先,价值为\(w\)。选出若干条路径,不超过边的容量,最大化价值和。

所有路径都是从下往上的,树上从上往下连边,选一条路径就是选一个环了,然后就可以发现是费用流了。。。
求解最小费用循环流的方法:负边\((u,v,w,-f)\)拆成\((S,u,w,0)\) \((u,v,w,f)\) \((v,T,w,0)\),相当于先假装流满,如果不想流满就得通过中间那条边撤销。

\(T2\)

投骰子,每一面有一个朝上的概率,投\(n\)次,求点数和的期望和方差的期望。

卡精度实在是太毒瘤了。。。
直接\(G-F^2\)算方差会爆精度,把方差中减掉的那个期望\(/n\)后减到点数上,再算一次即可。

\(T3\)

数轴上\(n\)对鞋子,设\(k\)个鞋柜,每对鞋子必须放到同一个鞋柜里,求最小距离和。

神仙题。。。
首先每对鞋子都是选离中位数最近的柜子,把每对鞋子按中位数排序,一个柜子就会贡献到一个区间里,这样就可以很方便地\(dp\)了。

考虑如何快速求出(以排好序的鞋对编号为下标)一段区间内的鞋子的代价。
如果选好柜子那么代价就是所有鞋子到柜子的距离和,所以取中位数即可。
这个要用到所有鞋子的位置信息,查询不能拆开,但是信息满足可减性,所以用主席树维护即可。

然后后加进来的鞋对对中位数偏左的区间影响较大,满足决策单调性。
详细证明:
就是要证不存在\(f_{j-1}+w(j,i)>f_j+w(j+1,i),f_{j-1}+w(j,i+1)>f_j+w(j+1,i+1)\)\(i,j\)\(w(j,i)\)的意思是\([j,i]\)的鞋子的代价。
化简一下就是只要证出对于任意\(i,j\) \(w(j+1,i)+w(j,i+1)>w(j+1,i+1)+w(j,i)\)就得证了。
就是证第\(i+1\)对鞋子放在\([j+1,i]\)比放在\([j,i]\)优。
首先第\(i+1\)对鞋子的中点肯定大于等于\([j+1,i+1]\)的中位数,否则右边的点数不超过一半。
所以往右边加鞋子中位数不左移,往左加不右移。
中位数是偶数个鞋子中中间靠左的数,两边是平衡的,往右加一个数最多右移到原来的下一个鞋子,不会改变原有鞋子的距离和;加完后\([j,i+1]\)中位数比\([j+1,i+1]\)左,跟新加鞋子的距离不会比较小,故加在\([j+1,i+1]\)不会比\([j,i+1]\)劣。

总结

场上看题后会\(40+100+30\),写了\(T2\)\(T3\)暴力和\(T1\)\(10\)分,然后去想\(T1\),期间感觉这题网络流不太能流的样子就没想网络流。
时间不多就写了\(T1\)\(20\),然后这个并不能套到链的\(10\)分上。。。然后就没时间了。

\(T2\)爆精度了,要用题解中的\(trick\)优化精度。。。
然后\(T3\)对拍了还爆成\(10\)分。。。
网络流可能还是差了一点,暴力写挂也是个问题。。。

day4

看题,\(T1\)是个数据结构题,想法不难,写出来可能有点复杂,\(T2\)是个毒瘤题,\(T3\)好像是个\(sb\)
写完拍完\(T1\)花了\(2h\),加上看题\(3.5h\)
然后兴冲冲写\(T3\),写完过不了样例后发现是子序列,只好盲猜状态数不多写个类似麻将那题的做法。
写完后完全不知道\(T2\)怎么写,手玩了一组数据发现\(T3\) \(WA\)了,调到结束都没调出来(事后还经过了漫长的调试。。。)。
结果\(T3\)水过去了,足见\(JZ\)的数据之弱。。。

\(T1\)用的做法太毒瘤了,用前几场\(ZR\)那题的做法不就行了吗。。。
\(T3\)搞个前缀和就可以发现状态数最多\(2^{10}\),没看出来。。。
\(T2\)差点就想出正解了。。。当然我是不会场上去写的。。。
这场发挥得挺不错的,\(T3\)的性质没看出来,对结论题还是不太擅长。。。

\(T1\)

一棵树,支持:
1.路径上所有边反色。
2.对于路径上所有点,对其邻边反色。
3.询问路径黑边数量。

个人\(sb\)做法:
线段树维护区间两端点的颜色,区间\(0\)的个数,\(1\)的个数(整个翻转颜色的时候要交换),连着左右子区间的边的颜色。
整个翻转点颜色就改一下两个端点,整个翻转边颜色就交换一下答案,改一下中间边的颜色。
然后单独维护一下轻边即可。
线段树有很多地方不能套板子,还好这次码力不错。。。
正常的做法:
每个点记父亲的颜色,正常套路每个轻儿子标记挂到父亲,变成区间打标记
一些轻边重儿子什么的还是单独修改一下。
查询也就一些重点颜色链底标记什么的。

\(T2\)

长度为\(n\)的字符串划分成\(k\)段,每一段字典序最大值的最小值(表示成字符串)
\(n,k\leq 2000\)
太毒瘤了。。。
答案一定是子串,搞出所有子串就可以二分了。
可以\(O(n^2)\)\(O(n)\)求出每个点作为划分点,最远能到哪都不进行下一次划分(即字典序在这段区间内都不会过大,字典序很小的话就是\(n\)
然后看看哪些点能作为划分点。首先能走的长度为\(0\)肯定不行,把它们扔掉(具体是能走到的分为包含了这个点的点能走长度--)然后如果一个点变成\(0\)了,那么既然它不能走到原序列上下一个长度\(\geq 0\)的点,那它也不行了。如此这样一个个扔掉,直到剩下的长度都\(\geq 0\)为止。
如果剩下的点数\(<k\)就凉了。这样,只要我们能构造出一种划分次数\(\leq k\)的方案,就可以在每个划分点前面加些划分点构造出\(=k\)的方案了。
所以枚举出发点,一直往下走,维护再走一次能走到的范围即可。
环形这东西实在是太毒瘤了。

\(T3\)

给一个长度为\(n\)的字符串,求长度为\(m\)的字符串与其最长公共子序列为\(1,...,n\)的方案数。
\(n\leq 10,m\leq 1000\),字符集为\(4\)

考虑如何求最长公共子序列,就如果加了一个相同字符,等于一个前缀\(max+1\),否则不变。
这样不太好看出来,改变一下\(dp\)数组的定义,变成到上一个点在第\(i\)位及以前的答案(及定义成存一个前缀\(max\)),每次用差分来转移。那任一时刻一个点的\(dp\)值不小于前面一个,最多比前一个多\(1\),所以状态数不到\(1024\)\(dp\)\(dp\)或状压维护差分均可。

day5

看题后会\(T1\)暴力\(T3\)正解,\(T2\)不太可做的感觉。
\(T3\)\(MTT\)竟花了我\(2.5h\)。。。
然后匆忙写完\(T1\)暴力就结束了。。。

两题都爆了第一个点,\(T1\)是因为太贪了想水分结果\(kmp\)写挂了,\(T3\)是因为暴力的取模位置错了。
考完后发现\(T2\)非常简单,只是我压根没去想。。。
对多项式之类的一些基础不够熟练。。。
\(T2\)这见过类似的题没反应过来,比赛的时候要每题都仔细思考一下。。。
本来能\(200+\)的,太可惜了。。。

T1

一个\(n*n\)的矩阵,每个点上有一个字符,随机选一个点往一个方向走\(k\)步得到一个字符串,求走两次得到相同字符串的期望,\(n\leq 500\)

只要把每个字符串求出来就可以塞进\(map\)中求答案,所以倍增求出每个点每个方向走\(k\)步的哈希值即可。

T2

\(n*m\)的网格上每一个点有一个方向,不会指向边界,染黑恰好\(k\)个格子,求一种染色方案使得第一列每个点出发,要么陷入循环走不到最后一列,要么第一次走到最后一列时经过且只经过一个黑点,\(n*m\leq 10^6,k\leq 50\)

这种题当然是形成基环内向树森林然后搞一搞,走到环的点和没有第一列的点能到达的点可以随便染不染色。剩下的只有不会到达其它第一列的点的点能染色,这些点形成森林,相当于一棵树上用黑点覆盖所有叶子,黑点不能互为祖先关系的问题,直接\(dp\)即可。

T3

\(n*n\)网格的第一列和最后一列有数,然后每个格子等于上面\(*b\),加上左边\(*a\),再加上\(c\),求\((n,n)\)上的数。

MTT:
相当于每个格子的数往右\(*a\),往下\(*b\),移到右下方求和,\(c\)就一开始填在每个位置就好了。
拆开贡献主要就是要求

\[\sum_{i=1}^{n-1} \sum_{j=1}^{n-1} c^i \]

day6

\(T1\)感觉可以\(dp\),写完才发现是\(O(n^4)\)的,然后搞来搞去还是\(O(n^4)\),自闭了。。。
\(T2\)一看就不可做。
\(T3\)一开始没想出来,写完\(T1\)后打个表就会了,然后长剖都没调出来就结束了,只能写个链走了。早知道先写\(n^2\)暴力了。。。
不知道为什么这几天做题越来越慢。。。
\(T3\)爆成\(5\)分,结果是\(OJ\)没有开栈。。。
\(JZ\)的队爷们吊起来打,才发现前几天都是在被人家学校的初中生吊打。。。深感自己的菜。。。

posted @ 2020-01-11 22:04  _lhyyy  阅读(213)  评论(0编辑  收藏  举报