一日一测(20170923~20171111)

20170923 NOIP模拟10--LIURUNDA

  Scanf在考前说,这是一名很关心我们情况的学长,他也很强。嗯,是的。

  他在题目中乱模,而且还乱出数据(样例数据如此,测试数据更可恶)。

  乱模是什么意思?就是说:

3.念诗.大呼”苟利国家生死以,竹外桃花三两枝”,回复b点膜法值.
一开始你有c点膜法值.之后你的膜法值可以超过c.
香港记者有一个好,脑子转得比谁都快,会选择最优策略.
如果你会被续,输出”SIMPLE”,如果香港记者会被续,输出“NAIVE”

  额。本人当时自我感觉良好,估分200,结果最后只有30。中间固然有数据的锅(T2尤如是),但是自我的判断还是该背很大的锅。当时T1以为可以过80分,但是在老年机上只有20。T2应该是数据的锅。T3原因不详。

  分析一下试题。T1确实很好。当时我用矩阵快速幂,是3方的。但是,如果充分考察矩阵的含义,会发现矩阵大部分内容都没有意义。2次方的矩阵是指,进行一系列操作后从模数i到模数j的情况数。而线性的向量是指,进行一系列操作后从1到模数j的情况数。如此一想,便很清晰了。这就是数学中单位元的实际意义。3次方的转移一下子就变成了2次方的。

  那这个东西抽象一下,只要有运算而且该运算满足结合律就可以使用快速幂。

  如此一想,便可以反思一下了。为什么当时没有想到?应该是当时太容易满足,“以为”80稳了便不再深入。很多时候如果再多想一点点或许就有新思路。猛然想起曾经的一道区间DP题,因为当时害怕会被卡,所以想到了快上了5倍的优化方法。大概就是这样了吧。

  T2其实确实是一道好题,但我只懂了前半部分。因为同一行的任两列之差为定值,同一行的任两列之差为定值。当时利用这个性质去暴力BFS,因为数组开不下于是使用了map映射。而正解是用带权并查集维护差分值(后来一次图论测试也考到了)。之后只需要管是否每一个位置都可以为正,这个可以使用两遍for解决。第一遍for是把集合的root那一列的最小行权值处理出来。显然只有root的最小行才可能出现全局最小值(整行平移)。第二遍for再找到root那一块的最小列(因为整行平移所以差是一定的),处理出root最小行上最小列的权值。这个东西就可以只考虑列之差而屏蔽行之差了(因为干的是同样的事情)。这道题目的那个性质实在是太强了,但"之差为定值->带权并查集"确实也是个好套路。

  T3当时使用记忆化搜索,把一些内容去掉就A了,至今不知为何。实在是不解啊。但是,当我改为顺推时却发现细节不少。大概就是记忆化比顺推好想的原因吧。

  嗯,就这样了。加油!


 20170924 NOIP模拟11--LIURUNDA

  这套题不应该这么惨。

  T1实测50分,但是当时应充分考虑数据分治,使用贪心再50分。因为贪心是对的。

  T2实测30分,原因迷了很久。最后发现,多组数据没有清零!!!但题确实是好题,深入思维两个对称统一。记u子树aa之和=sum[u],则有b[u]=b[v]+sum[ROOT]-2*sum[v],又有b[ROOT]=∑sum[vv]。着实十分美妙。

  T3实测80分,有20分是加爆了。至于为什么加爆,本人也很懵。后来发现如果用宏就会挂,用函数就AC。LMY说宏是c遗留给c++的陋习,歧义是很可能发生的事情,确实如此。

  所以说,对于这套题230实质上是完全可以的,而最后只有160。T3炸掉的原因只能说lemon有鬼,而T1当时不用贪心主要是因为有n方做法又不确定贪心的正确性,实质上就是应该数据分治一下的。


 20170925 CF864 #436 (Div. 2) 

  这场CF很够本~~下午6:35开场,很照顾中国朋友啊!

  基本上全机房参加,这种半ACM半OI的赛制确实很有趣(只是常常在半夜)。PRETEST,罚时,SKIP,RATING都很有意思。我的朋友们大都跟我一样做了4道题,而lemonoil在Ubuntu Pastebin上偷到了E题的代码,结果被SKIP了……首页上几乎所有人都被SKIP了……

  A、B、C和D都是贪心模拟,而E是一道DP。F看上去很有趣。

  可惜只有2个小时,E题最后没有做出来。但是,中间有一部分很巧,很可能再想也是想不到的。


 20170926 XGG的DS2

  额……如果真的是NOIP……

  T1,给你一棵带点权的树,修改一条链的权值,询问一条链的权值。典型的链剖,然而本人发现自己忘记了一个非常非常重要的细节,dep[top[u]]<dep[top[v]]和dep[u]<dep[v]的差别真的是极其巨大的。还有,10^7……

  T2,BZOJ4569,SCOI2016萌萌哒。省选题目好不好!但其实不难,主要是如何把询问变成一捆。STD使用的ST表递增,我用的是暴力分块。STD是nlgn的,而我是n根n的。此题的n≤100000,最开始交BZOJ直接T了。最后发现,fread实在是强啊(这是Amphetamine同志的)!

char *hd, *tl, buf[(1<<15)+2];
#define getchar() ((hd==tl&&(tl=(hd=buf)+fread(buf,1,1<<15,stdin)),hd==tl)?0:*hd++)

  1<<15只有32768,是非常灵活的。

  还有,理论上这玩意儿可以使用线段树优化,空间从O(nlog n)变成O(n)。

  T3,暴力可以60。本人正在调试……最后调出来了,这是一道有趣的结论题,巡游一定沿DFS序,于是可以使用SET维护。原题为BZOJ3991SDOI2015,结果发现自己居然连倍增求LCA都快忘了……


 20170927 MHY的DS

  嗯……hard……

  T1和SIP中的前2道题很像,但是我忽略了这道题的条件。在之前的题目中,数字范围与n等大。但是这道题不一样……可以离线+树状数组,可以离线+主席树,也可以离线莫队。

  T2目前只会写暴力,但是在T3耗时过长,暴力写挂了……之后,经过不懈的努力,最终调试了出来,这是一道好题,题解详见SIP。

  T3试了很多种方法,第一种为TREAP,第二种为SPLAY,第三种为指针线段树,但是效率都不是特别高。于是,最后选择了数组线段树。但是,在考试时耗时确实太长,不过个人认为还是值得的。至少充分复习了一遍,而且能够好好比对一下速率。只是毕竟是考试,应当好好安排时间。最快的是LMY的红黑树(唯一没有TLE的一种平衡树),和STD的对位堆,因为中位数的挪动很微妙的,此消彼长,很有趣。

  胡老说,要学会倾听,要学会尊重,就是虚心学习,在应该讨论的时候好好讨论。应该考虑自己,也应该考虑集体。确实应该好好考虑这个问题。


 20170928 XGG的DS3

  这一套题当时就只有30,60和90了。

  T1是在数据库中插入一个数,询问一个数中与数据库中一个数的或运算、与运算和异或运算的最大值。异或就是用TRIE树,但是或和与会比较恼火。但是数最大只有65535,所以可以使用暴力,分前8位和后8位。因为枚举子集是从大到小,所以可以直接贪心了。与运算枚举的是前8位的子集,或运算枚举的是前8位补集的子集。

  T2是一道好题目。我们知道一个结点出现和消失的轨迹,于是使用在树上使用线段树或是splay(注意旋转到根)合并就可以了,复杂度可以证明这个复杂度是O(nlgn)的。在出现的地方(就是自己的结点)、消失的地方和询问的地方都打上标记就好了。

  T3是用线段树,一个结点的[lf,rg]就是横坐标,中间还有2个参数[lh,rh],表示能够覆盖这段区间的潘多拉贡线段,然后就可以直接查询了。这个其实是李超线段树,潘多拉贡线段就是最优势线段。

  现在看来,实际上不是特别难,只是很巧,而这却是需要积累啊。


20171002 NOIP模拟12--YALI

  如果你知道这几天雅礼中学去了150多个优秀的OIER,你就会明白这套题是干什么吃的。

  最后222(好2啊),这边RANK 1。但是本人还是有遗憾的。

  T1,可以转化为不可重区间覆盖问题,典型的贪心。贪心的正确性我不会证(现在可不一样了……我会证了呢,就是包含剔除包含嘛!),当时就写了树状数组,加上离散化,还是挺漂亮的。在LEMON上过了,但在CENA上会TLE。

  T2,线段树,可以证明一个数的修改是O(lg n)的,而有效的模运算会使一个数至少减半,所以最坏情况下复杂度是lg方的。但是当时担心效率,于是使用了二叉树儿子,而非指针儿子。结果是很惨烈的,因为指针儿子最坏空间是2n,而二叉树儿子最坏空间是4n。其实很显然,但是从来真的没有想到过。想当时学习线段树时还为此引发过一场争论,当时却并不知道是为什么。看来历史就是像这样在曲折中前进的啊。

  T3,是一道好题。如果观察出单调性(很好证的!也很巧妙的!),就可以二分了。两次二分卡出上界和下界,check便用数位DP啦。但是,注意当k为1时需要输出-1(当时还嗤笑出题人,因为一个数一定超过了离它最近的大于它的二次幂数的一半,所以刚好包含那个数),为此挨了18分。细节还是要注意的。


 20171003 NOIP模拟13--YALI

  最后210,主要是T2真的不会写暴力啊!

  T1是DP水题,滚动一扫就是了,我分了5种情况,蒋神分了3种……不过据说湖南有人用并查集水掉,这就让人很迷了……

  T2是灌水,经典但确实不会做。可用DIJKSTRA(说是最小生成树PRIM也差不多),但部分细节还是要再想想。而现在的我想清楚了,每一次选当前最终高度最小的点,找它的四个邻居。如果它的邻居没有访问过,那么看它邻居本来就比它高那它的邻居就一定不能积水了,如果它邻居本身没有它高那么它就可以积水而这个块又一定是该邻居旁边最矮的(因为未访问过),根据木桶效应就可以到那么高了。确实是一种很好的思路,floodfill。

  T3是一道不错的集合构造题,加上容斥其实挺美观的。而且也很巧妙,我当时做这道题的灵感来源于XGG的巡游。同样都是开开关关。

  湖南那边上200的有很多,AK的也很多。那边70的LIYUNFEI最高,260。蒋神水了T3,AK。LMY的T3却是暴力,最后250。

  SCANF说后两题很考模型的转化,其实这样的东西也是套路。但是T2为什么,有份题解说得很好:http://blog.csdn.net/clove_unique/article/details/52938752


 YALI'S TEST 的小感想

  发现自己并不是那么弱,但是确实还有很多漏洞需要去补。像1002的T2,就是当时线段树学的不彻底,可以影射当时新知的学习。像1002的T3,正中下怀,很多时候凭感觉却不是严格的分类讨论,就很容易丢掉很多细节。还有,WYS同学迷之TLE,经过反复思考,想到了原因:lf=rg=263时,循环尚未结束,lf+rg=264将使mid归零。当时并没有如此详细的思考,甚至以前也没有过这样的轮回思维,所以说多见见世面肯定是有好处的。而像1003的T2,终归还是掌握的不灵活。

  关于考试的技巧,自己还是逐步在提高。希望自己可以不停地努力。但是,在考试题目改完后,也应当保持高效率才是。慎独。


 20171004 NOIP模拟14--YALI

  今天只有140,估了150,其实还是挺精准的。但是,不能接受,这样居然都是R1。只能说明大家今天都比较呵呵。

  T1一看上去就来者不善。因为以前有一次NOIP模拟测试,值域只有7却还是T3。但是今天值域变成了26,居然还是T1。大部分人都把时间用在T1的卡常数上,结果反而不好。

  T2是一道DP题,基于未来状态。可以无视行的情况,加上排列组合就很优秀了。详情请见SIP。

  T3看上去是那样,想一想又不一样,再想想就又不一样了。要把m个数变形成m+1个数,再放入trie树。实质上就是模拟你和对手博弈的过程。中间我没有DFS而是倒着for,只有一个儿子的时候另外一个为0(或说是NULL)就可以加起来找到儿子(当然if也不错)。是一道很优秀的题目,当时应该可以做出来,但是说过了,都去卡T1的常数了……


20171005 NOIP模拟15--IDY

  当时想骂出题人。怎么前两道题都长那样?事实证明,只有T2长那样。结果导致T1挂了。

  共得110,胡老说不上150可以退了……从此,机房空了。

  T1挂了,因为不会求割点(我发誓我一定在5天之内学会我学会了!)。点数≤2,输出-1;有割点,输出1;否则,输出2。但是这样的图求割点,tarjan不是必需的,可以使用OIWJJ的分类讨论神方法……

  T2打表找规律,不是一就是二。

  T3是选最少点覆盖区间的树上版本。在序列当中是按右端点排序,右端点相同则左端点靠左的排前面。对于一个区间,如果已经被点覆盖则不用加点,否则必须加点。靠右的话后人好乘凉,所以加点就加又端点。而右端点相同则左端点靠左的排前面,也是为了后人方便乘前人的凉。对于区间而言,按左端点和右端点排序都是可行的,而这道题目只按LCA排序是因为另外一端有2个点。很容易证明这样是正确的,而LCA相同的时候也不用再什么左端点靠左,使用树状数组(区间其实也可以这样)就可以方便地维护了。

20171005 CF868

  想骂出题人。

  T1普及组T1水平。

  T2讨论时逻辑错了!是(a[2]<=t||t<=a[0])而不是(a[2]<=t&&t<=a[0]+360)。

  T3贪心,只需选2个。所以,枚举子集就好了。

  T4是一个DP,但我只会写暴力。然而pretest居然过了。

  一共7道题,YFZ和WSQ都做了ABCD和F。而我最后只有A题和C题,大概这就是差距吧。

20171006 ACM2

  队名XGH,又称修改后、效果好、西瓜红、新公会、徐国华、宣贯会、校工会、徐光辉、新工号、习惯化、香港话、徐光华、徐国辉、星光汇、谢国华、学管会、徐观海、许国华……但其实是XZR、GYK和ZHJ而已。

  一共10道题,是一场水题的盛宴。

  T1素数统计,区加大小不超过100000,所以筛出sqrt内的素数再去筛一遍就好了。但是因为可以取到b=2147483647,所以for( int i = a; i <= b; i++ )就一定会炸。要开long long才行的。(-1)

  T2容斥统计1~n中某些数的倍数,当时以为会TLE。但实际上剪一下枝就好了,不过当时已经蠢到不知道lcm了,WA了很多遍。这道题目有一个玄机,17表示容斥的数都超过了17,所以实际上容斥最多只有6个数,因为17*19*23*29*31*37*41=101,3154,3907。(-4)

  T3是一道以前题目的修改,知道最值那也就可以直接统计后缀和了。

  T4是什么啊!是二维偏序。但当时卡了。个人以为,应当好好钻一下偏序类问题。之后一维树状数组就好了,颇像count的解决方法。

  T5是一道最小生成树的板子题。

  T6是一道TRIE的统计题,还是很好的。

  T7是一道打表题,因为雪球素数只有83个。但题目格式有错,WA了一次。(-1)

  T8是枚举中间点,看左边小的和右边大的。但最开始RE,原因是出题人不守信用。数据里面有0,离散化之后就有0。树状数组遇0就挂,不行啊。不过,程序的鲁棒性还是很重要的。(-2)

  T9是什么啊!tarjan的递归

  T10是一道很不错的模拟题,建立坐标系找规律。

20171007 NOIP模拟16--LIURUNDA

  本应210,但是T2呵呵……且听我娓娓道来。

  T1大水题,2^15=32768,暴力DFS勿忘long long

  T2本来不难,但是没有看出来。给定一个01矩阵,每一次查询一个子矩阵中1的联通块数量。发现可以使用1的数目减去11相邻的数目,都可以使用前缀和。或许是部分分给的太多了,所以直接冲着好写好调的70分去了(事后发现100分确实更“好”调)……但是70分有数据分治,我不确定分治是否正确,就改了一下分治门槛,但忘了改回去。我的50分啊!之后,hfu语重心长的说,有能力就算D1这么挂了,D2也是搞得回来的啊。TATTATTAT

  T2的重点在于无环,所以联通块数目=黑块数目-黑边数目(一条边消灭一个联通块)。

  T3解剖后是对于构造序列求逆序对,很好猜但是很难直接推导,幸好给了大样例,不然是很难验证的。序列长度为1e7,构造公式为xi=(xi-1+a)%mod(a<=1e5,mod<=1e8),不过只给40MB卡空间。当时因为意志不够坚定所以并没有深入,而且有一个+1一直萦绕不去很不爽。想在想来还是要敢想敢做,只要时间够大不了数据分治而已。发现最多跳a次,而且跳得非常有规律,所以可以列首树状数组处理(O(a)<=1e5),之后递减(注意要对最开始的那“半”段进行特判)。复杂度是O(n+alga)的,其实可以把n给省掉,但是分类讨论就会比较麻烦,我不会……或者只是我不想(太懒了!)

20171009 NOIPDP1

  T1简单背包(01+完全)+滚动

  T2状压,1.5h做完后一直在卡此题的常数。滚动+枚举子集记录+枚举上一行,跑得飞快

  T3是SBT,单调栈or二分。

  T4是DAG图拓扑排序水题,但是点权可能为负,所以预处理需要-0x7f7f7f7f(当然-0x7fffffff也不错)。

  好水好水!


 20171010 NOIPDP2

  T1仍旧是水题,不愿说。

  T2是求RMQ,第一次写了O(n)的笛卡尔树+tarjan。裸的RMQ无外乎:暴力for,线段树,ST表,min_element & max_element,平衡树,笛卡尔树+离线tarjan,可持久化trie树,以及更加毒瘤的做法。这个O(n)的做法虽是离线的,但确实很优。让我把BZOJ5042做了吧!!!

  T3是一道优秀的DP,详见SIP。

  T4是连续区间涂色,发现pos一给定区间顺序便已定,所以sort之后用单调队列就很好搞了。当时数据范围给反了,导致我直接使用了完全不同的方法——暴力。

  还有,我会更新时间了。


 20171012 NOIPGR1

  今天挂了……真的挂了,只有70(真的RANK1)……让人很尴尬,人家毕竟估了300呢……

  T1是一道裸的差分约束,当时考虑不严谨,少了一个不等式。之后做了很多实验,明白了查分约束系统的众多特性,却也越来越迷。到底是最大还是最小?

  T2是一道很简单的带权并查集,但是当时考虑不严谨,没有过滤掉无用条件,并查集上硬是有了环。

  T3是经典的车站分级,但数据范围大了一整圈。实际上是要找一个等价的DAG,最开始写的是倍增,实质上是差不多的。但是,当时考虑的太不严谨,虚点也可能没有入度,却完全没有想到这一点,导致拓扑排序完全无法进行。

  T4是一道DP,美其名曰“最短路”。我害怕越界所以写了map,结果题解说bound只有1000,因为bound过大,所以当时直接BB掉了。

  今天挂的太惨,也有前段时间所做图论题太少心中无底的原因。还是应当做做题,顺便与之前的题目融会贯通一下。


20171014 NOIPGR2

  今天挂了,大家都挂了。

  T1不知道为什么,我不知道if到底应该怎么用,lf和rg到底应该怎么规。规出来了一个很奇怪的结论,理论上只有4种。但是只有1种在BZOJ上AC了,然而本地直接用小数据卡出错。本地小数据过了的只有一个,然而交上去WA。(注:BZOJ2654是一道非常玄学的题目,数据实在是太不好构造,跑出来十分奇怪,让我都对此题正确性有了极大疑惑)

  T2居然还过了80分,在BZOJ上直接RE了。查其原因,就是memset的锅。memset内部可以sizeof(aa),也可以sizeof(int)*(n+1),但是sizeof里面是什么一定要想清楚。不然可能没有完全覆盖,或是直接越界RE。如果实在不行,就不要作死,不缺那几毫秒。但是,used可以使用时间戳会快很多很多。

  T3是对抗搜索,发现自己已经写不好了。好好调出来,又可以提升了。后来调出来了,发现当时又是直接ctrl+C的锅。正解是Alpha-Beta剪枝,本人不会不会调不出来。

  T4应该不错的,但是确实是。1号点的in不一定为0(我写挂了的车站分级也是这么回事),然后该BB掉的结点要开始就BB掉。不过,数据本身有问题,STD都A不了啊……

  我觉得T3本应调的出来的,可是T4也要不少时间。但是T4本身未稳,就应该好好思考。

20171014 NOIP初赛

  初赛题做得很快乐。我把90分钟用完了,才把题给做完。觉得题目内容非常有趣,对了答案之后估分大概90。错误的题目有如下几道:

  1.名额7个分给4个班,方案数共有120种。当时最后只剩2分钟,漏掉了24种。

  2.最小割方案共有9种,使用类似对偶图的方法计数。

  3.在n*m矩形内的弹球,是一直向下。穿过了若干层,最后到达终点。需要使用gcd。

  错的原因,就是思路本身有时不严谨。我的图论时常就是这个样子,所以一定要注意。从平常生活中抓起,把事事整理得井井有条,就可以踩过很多坑。

20171009~20171015 一周总结

  这一周有点顾头不顾尾的。时常觉得有太多题可做,反而迷乱了。其实完全没有必要,列一个清单,理一理思路。极其想做的题目不要回避,薄弱的模块要好好去抓。
  在杂题上花了好一些时间,也很有收获。

  好好干,不要后悔。上了道就走到黑,不撞南墙不回头。


20171016 NOIPDP3

  这套题120,小杨老师留下来的题目。

  T1是一道斜率优化。斜率与单调队列傻傻地搞不清……一定要在5天之内彻底搞清楚!

  T2是一道脑筋急转弯,根据题目性质一盏灯一定不会开了再关。所以变成了完美区间覆盖问题,根据题目性质连sort都不用,直接for就能出答案。

  T3是一道状压。还搞不清楚是怎么回事。

  DP出难了还是不简单啊!

20171017 NOIPDP4  

  这套题只有40,原因是七八个人都上台唱了歌……逻辑不对,是因为今天很多人都MLE了,按照规矩应该上台唱歌。

  T1是单调队列,按理不应该直接挂的……结果原因是变量名打混了,一个字节之差……居然还有30,原因是瞬移可以得30(数据过水)

  T2是一道写出来很漂亮的树形DP,手残直接打了“const int N = 5000 +1000;”,数组开的又是“int f[N][N][2]”,直接MLE。根本没有想到这一茬,看来是没有吃过这种亏啊。吃一堑长一智,下一次就要注意了。

  T3是一道简单的区间DP,当时认为([])是非法的括号序列,于是直接模拟栈来DP,于是挂了。我觉得正式考试应该不会出现这样的问题,如果有疑惑就只有问DZKD了。为了防止重复,所以只考虑左端点的情况。要么删掉,要么和区间内的一个数匹配。匹配是暴力O(n)的,总的就是O(n3)的。注意匹配是要用乘,初值是f[i][i]=f[i+1][i]=1,后者只是边界情况而已。

20171019 IDY的MA3

  今天彻底炸了……为什么……我怕是真的离退役不远了……想来想去,就只有仰天长叹。因为说跪就跪真的是挺正常的事情,这时候的水平去做题要么还是根本没有办法只有写暴力要么就是直接流畅地敲出正解,后者常常一点点的偏差就会产生巨大的影响。像20171012和20171017都是这么回事,让人根本不想说些什么。

  T1踩到了一个坑,就是-18/5=-3。这看上去很显然,但是这会产生极其巨大的影响。因为18/5=3是向下取整,而-18/5=-3则是向上取整。之前的模拟都是在正整数范围下的,根本没有考虑到负数。看来以后还是写ceil和floor比较好了(但是为甚ceil跑得很慢)。

  T2踩到了一个坑,当时自作聪明满打满算,没有想到还有下面一层。另外不加多想就优化,以为有的情况会判断到,结果并没有,于是这样就只有70。我终于明白我和mcfx的差距在什么地方了,根本不是思维灵活性,而是思维的严谨性。

  注意!!!注意!!!注意!!!边界赋值!!!边界赋值!!!边界赋值!!!

  T3是一道当时就搅了我很久的题目,是kand的姊妹。MLE了!MLE了!MLE了!当时那道题没有写题解,所以遗忘了。看来我的狠速跟进中确实是很有必要的。今天晚上的重头戏。其实如果把一个数变成它的“补集”,那就是kand。kand是什么?详见SIP。

20171020 IDY的MA4

  今天做题很谨慎,还是有效果的。

  T1就是一道基础的线性筛。IDY把2个函数联合讨论,就变得很清奇。

  T2就是求出a,a2,a3,a4,a5,……在%m的意义下的最小循环节。因为题目保证gcd(a,m)=1,所以根本不恶心。考虑到当且仅当m=1时,序列中才会出现0。所以可以特判,然后用BSGS解决ax≡1(mod m)就好了。但是,不使用BSGS效率会更高。考虑到aφ(m)≡1(mod m),而最小的循环节一定是大循环节的因数,所以可以分解质因数做。效率更高,然而并看不懂idy的代码。

  T3看似无法下手,求解的是∑ri=l[c(n,i)%5==0],最开始我打表,发现图是“德罗斯特效应”。然而根本调不出来。后来,有人说这是一道数位DP。确实很有意思。考虑LUCAS是把一个数五进制分解,那么C(n,m)是5的倍数当且仅当五进制下m存在有位比n大。于是看上去就可以做了,然而我卡了很久很久。数位DP的方法通常是前缀和相减。在计算[0,x]时(x是一个bit位数),统计出所有的0次幂数、2次幂数、3次幂数……一直到所有的bit-2次幂数。然后统计出bit-1次幂位为0~num[bit-1]时的情况,然后逐步定位往后回滚,中间常常有跳出操作。看来要好好补补数位DP了。

20171021 ACM3

  ACM,三个人,配合很重要,选什么人用键盘更重要,这一次就是“吃了这样的亏”。

  A,一道简单排序题。

  B,当时我想的实在是太复杂,忘了二维拆分,最后始终没有做出来

  C,一道2-pointer,就是BZOJ生日快乐。这道题的调试花了很长的时间。

  D,方法众多。我们用的是暴力。

  E,是一道搜索+DP check。原理是DFS搞出k种邮票,然后DP去更新ans。非常巧妙,绝对想不出来的。

  F,是一道搜索。当时做的数据范围是9,需要双向。这一回只有6,所以打个vis就可以直接做了。但7goj实在太敏感。

  G,就是裸的catalan括号匹配。但7goj实在太敏感。

  H,二分答案+SPFA。当时2个都想到了,但没有合在一起考虑。就是01分数规划,但愣没有想到,就是思维的死角了。

  I,就是一个sort以后再sort贪心的过程。因为n>k,所以贪心一定不错。

  J,就是光之大陆。lemon用来做防AK题的。

  总结一下,其实做不出来的都是因为思维的死角。碰到死角,就是应该好好补一补的。做不出来的我并不感到遗憾,只是做出来的题有一些实在卡了太久,这就是策略上的重大纰漏了。实际情况瞬息万变,应该有着充分的机动性。在调试题目的同时,一定不能闲着。

20171016~20171022总结

  这一周过得很快,NOIP已经临近了。固然不能掉以轻心,但如果恐惧就是大大的不对。这一周发现了很多的问题,我觉得大概NOIP能犯出来的错误我这一周差不多都踩到了。对此我很开心,因为好好总结一番就可以成大事。

  关于MLE,一定要cmd+size拖一拖,除以1048576就完了的事情,在这种事情上栽跟头实在不值得。

  关于对拍,bat中是@echo off然后是for /l %%i in(1,1,10000) (...)中间都用%%i,不要忘了。在造数据时,可以int main(int argc,char *argv[])然后atoi(argv[1])的。

  思路一定要严谨,力求无纰漏。如果STL可行尽量不要写一写牛刀。就这样吧。


20171023 NOIP模拟17--成外

  今天一共240,本来以为能有280,但还是觉得不稳所以估了230。看来真是不该得的。

  T1是思维题。写暴力时恍然大悟,一共才60层。可以省掉log。

  T2很多人写了主席树,但其实只用vector+lower_boundupper_bound就好了。

  T3是贪心,但当时没有看出来。于是写了单调队列优化DP,k=1时绰绰有余,但k=2时就不够了。从后往前贪心,可以同时保证段数最少且字典序最小。而判定二分图是否合法,可以使用“关押罪犯”的方式加入敌对点。如果非法就开新段,很简单。如果使用vector来存值域,就可以方便地处理重复点。如果按值域,则非常地不好调。

20171024 NOIP模拟18--成外

  今天一共258,当然个人认为还是跟题目有关的。像T2,90分居然可以那样我也是很惊讶的。

  T1是一道水题,但是一定不能忘了开longlong,一定不要忘了优化%运算,一定不要乱memset。

  T2这道题当时没有想到可以贪心,打算写树形DP,结果发现100%的k=20根本无法下手,但却发现90%的数据k≤3。经过一番推演,发现当k≤3时一共只有8种状态,然后转移是64的很稳。但绝望的发现,转移很麻烦,于是我手动做了64道填空题……志坚不摧啊!正解需要注意,DFS还是需要防止反复走边的。

  T3这道题当时并没有发现k小到了那种境界。发现和BZOJ状态压缩道路修建是很相像的,于是写了一个很稳的状态压缩(len≤16),再加上特判点,就得了68分。正解是什么?考虑把一段区间取反,到底改变了什么。发现只有区间左端点与它的左邻街点与区间右端点与它的右邻街点的异或值改变。这是典型的差分,如果再考虑,发现其实这样的取反是建立在两两消去的基础上的。于是可以BFS预处理一张二维表,问题就转化成了记忆化搜索、只是要注意BFS初始值要设成inf而非-1。

20171023~20171024 NOIP模拟赛总结

  一共498,能得的该得的都得满了。题目知识点不算难,但确实很灵活。只有学会思考,才能稳下来。

  Hfu说WeiJing两天都AK了,这是我等蒟蒻所不可能及的啊。

  我觉得通读题目是很有必要的,不然整个人一定会慌。鸡蛋装进一个篮子里是就绝对错误的行为。像模板这种东西应当早就准备好,不浪费最开始惊魂未定的时间。而文件名一定要反复比对,大样例除了。最后提交前一定要反复查看,freopen是否去掉了注释,中间调试的内容是否会被printf出来,return 0是否有(据说不加会JiJi),再在win+R cmd中size拖一拖除一除,当然最好的是能够在NOI-Linux下实验一下。

  千万不要掉以轻心,固然也不能妄自菲簿或是沾沾自喜。自然面对,自然无事。

20171025 YYR的STRING2

  不可不说,YYR进了THU以后,是整个人变了么……

  ta直接抄原题,在pdf里面大肆膜蛤,而且T2乱造数据……

  T1是一道经典的AC自动机上DP,但是我对AC自动机的理解还是很不到位啊。以为就只是限制方式的走,本以为二维就够了。因为在我的心中,走实边和跳fail再走是有着本质区别的,就在这个地方混了。其实像LRJ的蓝书中,有一种写法就是直接从fail那边继承,因为走实边和跳fail再走本身就是差不多的东西。于是这样就只有三维了,第三维表示欠了多少位。很明显,一个结点不停向上跳fail,最长的单词如果很长就可以直接清0了。总体空间复杂度是O(2ML2),时间复杂度是O(4NML2)的。如果写矩阵快速幂,空间就是O(M2L4),时间是O(M3L6lgN)。太不现实了,因为状态总数就是ML2~1000啊。

  T2当时并没有想到利用KMP性质就可以直接判中间,不知道怎么判中间于是就写了一个hash辅助(每次check的复杂度是O(n)的,但check次数不会太多是常数级别的(不然KMP就TLE了)所以能过)。YYR卡不掉,于是卡空间,而且卡得特别没良心,只有86MB刚好让开2个int和1个char数组的MLE。当时我size出来是85.83Mb,以为并不会MLE,然而发现自己实在是过于Naive。当时想单hash不稳,就把1个int数组换成了2个short数组,然而并没有什么用。因为YYR只顾着卡空间了,并没有意识到ta的LAJI数据的答案就是f[lens]。真正做法是KMP再记录下一个辅助bool数组,但是Lazer说ta只用hash就过了。ta的做法更玄学,直接把答案从n枚举到1,ta说是调和级数,但其实最坏O(n2)。

  T3就是一道特判题,最水。YYR不仅把难度倒置,还把时间和空间开成了毫无良心的2s和512Mb。

  T2因为我的侥幸心理而MLE,看来就是一点侥幸都不能有啊。

20171026 观第38届运动会开幕式有感

  会歌不是“浮生梦醒的释然”,而是“传递火炬”。一堆老师拿着“火炬”跑来跑去,实在是颇有情趣。

  T1是林荫的舞龙,服装看上去都是金光闪闪的。

  T2是大名鼎鼎的斯巴达&雅典娜方阵操,是一部不错的喜剧。想一想,斯巴达三百勇士弃甲曳兵,脱下斗篷现场表演叠被子到底是什么景象……

  T3是一个方阵操,向左向右。

  T4是还在林荫表演过的拉丁舞,三段凑在一起。

  T5是一个方阵操,茉莉花。

  T6是健美操队。

  T7是国际部的火锅店迎宾方阵操。

  T8是初中小朋友的足球方阵操。

  T9是全体体育教师的啦啦操。

  中间有很多方阵操,方阵操是什么?就是百十个人都跳得一模一样,其实不乏滥竽充数者。

20171026 NOIP模拟19--LIURUNDA

  AK了……然而并不意外,因为在第一页LIURUNDA就说:AK了不要biao出题人。

  T1是n阶交替排列公式,这样优秀的式子OEIS上当然有了(LKQ同学眼疾手快)!当然DFS也可以,很多同学觉得16跑得出来,然而经我估算这很困难。所以正解用到了排列,或是使用DP枚举最后的位置。

  T2就是一道特判题,是ATCoder的原题。这种代码不长,但非常搅人脑袋的题最讨厌。与其称其为特判题,实在不如称其为逻辑题。稍有不慎就有特殊情况没有考虑到,写的时候又很难下手,着实令人不快。

  T3看上去着实吓人,但只要读一读题就能大致感受到中间深深的欺骗性。m*(m-1)大到了一种境界,但是都是枚举LCA。发现算死的很绕,就可以只算活的。发现只需要一个辅助数组f,表示每个叶子结点出一只蚊子到u点的存活量。于是就很好办了,siz和dep数组都不需要,DFS只需要一次,写起来非常简单。但是,如果再深入想想,这样的思路和LIURUNDA1T1的期望颇有相似之处。就是数量成倍增加值就相应简单变化,所以只需要存下一个单位元即可。

20171027 NOIP模拟20--LJH

  145。我觉得其实如果多想一想T3,是可以想出来的。所以如果归因,可以说是下手实在太晚,T1耗时实在太久。

  T1就是一个大暴力。当时我想到的是map映射+set维护线段,复杂度是O(nlgn),但事实上卡掉了25分。在这上面耗时实在太久,以致于T3没有真正深入思考。

  T2的正解是启发式合并线段树+二分答案。发现70分可做(30分暴力+40分差分LCA)。实际上敲得很快乐,很好调。时间都砸在T1上了。

  T3最开始看错了题,以为每天k道题完全不覆盖。敲完了,测第一组样例过了很开心,然后挂在了第二组样例上。开始怀疑自己,整个人陷入了崩溃……后来又看了看题,发现一共刷了n-k+1天的题!!!相邻两天有k-1道题目都是相同的!!!这也就是说,每一天都不能保证自己的独立性,前一天的情况会对后一天产生巨大的影响!!!!!!后来才发现,自己对“随机数”这一概念理解的到底是有多不到位。事实上,每一天的期望是可以独立的。因为每道题的难度都是完全独立的随机数。正确的打开方式是,构造一个随机的序列,选择一个区间,它的最大值期望是完全独立的(不受其他区间的影响)。而选择k道题的区间的最大值期望与方位是完全无关的(显然),所以可以算出一天k道题的具体情况,然后*(n-k+1)即可。

20171028 NOIP模拟21--长郡

  今天是炸了。110。T2没有想到割点,于是想到了随机化乱搞做法,可惜常数没有配正确,导致结果很难看(最开始5分,逐渐修正常数后达到了75分)。

  T1就是一个很简单的字符串匹配。可以KMP,也可以hash。但要注意空间的范围。

  T2其实不难,但我确实可能有恐“图”症。有过很多次调不出来的经历,整个人就很畏惧割点。当时整个人就是抱着不写割点的心态去做的,所以说从另一个方向搞到最后一步时也没有意识到只用求割点。再进一步想一想,其实是对“if(dfn[v]≥low[v])”理解的不完全到位。本身没有从一个更生动的角度去思考,就没有办法活用。

  T3挂掉了,原因是自己作死。觉得行压的不够(教训!!!),就把应当写在前面的东西挂到后面去了。而且多组数据没有开换行符,整个人马虎的不止一点半点。我把一个环拓了倍,比其他人跑的都慢。我最后使用了fread来处理一个串才勉强卡过,但是如果是在考场上,我依然会写拓倍的方法。因为如果是尾首相接,细节会多不少,很难简单的把细节完全想清楚,实现的代码也会难调很多。而且,实际上不管拓倍还是不拓倍,理论复杂度都是O(n),只是这道题卡常而已。不过,应该加上的一些优化最好还是加上,不过NOIP一定不要用fread一定不要用fread一定不要用fread。

20171029 NOIP模拟22--14级

  这一套题目是XMJ、XGH他们那届留下来的(其实就是YJQ那届)。

  T1很简单,简单二分+贪心。我想在NOIP2015前都考了这样的题目,他们应该是做得出D2T1的吧。像这道题发现check内部也可以二分,应该跳石头也行吧。

  T2在LIURUJIA口中是经典的多路归并。但这种题目就是已知某些显然的顺序,然后解决一些问题。更多的还有NOIP2016D2T2蚯蚓,我在LINYIN做过的一道骑士大餐斗争。

  T3是一道树链剖分,但我只知道这道题目可以线段树自下而上启发式合并。但是写挂了,而且很难调。而树链剖分又是怎么做的呢?是把树上的结点按DFS序抽成序列,然后进行序列差分。使用树链剖分,段数最少。

20171030 NOIP模拟23--LINYIN_TYH

  今天炸了。只有110。炸和考得差并不完全相同。炸=考得差+事后令人痛心疾首。如果是题目过难,或是出题人犯了错误,是很难令人痛心的。所以到底怎样才能令人痛心?其实就在于“本应”二字。人可以不获得,但如果获得后再失去就会痛心。人可以没有希望,但如果怀揣着极大的希望却又最后落空就会令人失望。前者我们通常称为麻木,但后者就是常见的逆境。麻木是没有办法治的,但逆境却是可以走出的。走出逆境,没有希望则又是不行的。

  故天将降大任于是人也,必先苦其心志、劳其筋骨、饿其体肤、空乏其身,行拂乱其所为,所以动心任性,增益其所不能。

  老祖宗都已经把话抖搂清楚了,以五十步笑百步不可,直不百步耳是亦走也。做逃兵就意味着希望的失去,而如何为进如何为退则每个人应当有自己的分寸。

  攦shai话说够了,现在来分析。

  T1是NOIP原题,但extra test确实有毒。

  T2是一道很好的题目,现在给你两个字符串,要求算出其中最长的GLCS。GLCS是在普通的LCS上加上了限制条件,要求GLCS中的每一个字母返回原串的距离不超过一个值,这个值因字母而异。可以使用二维线段树,也可以使用二维ST表(极其毒性的东西),但最好的方法还是ZYC的方法。空间复杂度O(n2),时间复杂度O(n2lgn),已接近下限。做法水到渠成,最暴力的是O(n4)的,枚举i、j、k、l进行转移(f[i][j]<-f[k][l])。之后发现可以使用线段树把若干个转移捆成一捆(就是普通的线段树优化DP),这里要注意线段树是建立在B串上的,root[j]中的i号位取值即为f[i][j],于是复杂度变成O(n3lgn)。之后发现当i一定时,扫描不同的j有很多部分是相同的。于是可以单调队列进一步优化取值,于是复杂度就变成了现在这样。而且其实可以进一步优化,使用ZKW线段树可以大大加快速度。

  T3是BZOJ2744。在BZOJ上过了,而在我们自家的服务器上却显示TLE,实在没有办法再卡了。这道题当时应该AC的,当时也很小心,却没有意识到错在了两个非常小的细节上(count数一个二进制数有几个一居然写错了,ava的初始值附成了false)。就是几个字节的问题,却是要命的。WXH此题跑得飞快,但我觉得ta使用了错误的贪心。

  就这样吧。

20171031 NOIP模拟24--LINYIN_TYH

  今天TangYuHao又划水水了,三道BZOJ的原题……据说,WXH都坐不住了,看完题就大叫这种题目怎么NOIP第三题居然是仙人掌直接就走了。

  T1是BZOJ2142。T2是BZOJ4565。T3是BZOJ2125。

  当时并没有想到T2可以区间+状压,藏得挺深的,我竟以为是搜索题。Floj上过了,BZOJ上却RE,找管理员要到了数据,然而本地又AC,应该是for爆栈了,然而并不知道怎么解决。

  于是时间都砸在了T3上。只能说我对最小路径树的特性不是摸得特别透。正解说要重新建图,而我是直接在最小路径树上跑。只是每一次query都要多查一些东西,而重新建图的就已经预处理好了。因为是搅在一堆的,所以当时改改写写不停。最后写出来时,与以前并没有什么大的差异。只是思路清晰多了。

  另外,因为2月份做IDY的练习题“询问树上路径长度”使用了cost[N][S]数组,所以一直居然沿用到今天。知道今天,才突然发现,根本不需要。因为dis(u,v)=d[u]+d[v]-2*d[LCA(u,v)],如此显然的差分原理竟然今天才明白。

20171101 NOIP模拟25--LINYIN_WSQ

  差点敲成了1032,我还是tooyoungtoosimple了~~~

  今天的题目是WSQ出的,显然ta很懒,所以ta不写题解。

  T1是一道挺有意思的送分题。给你一个数字,让你转换成罗马数字。罗马数字也是十进制的,这一点很重要。例如有同学以前没有了解过这门学问,就会疑惑49到底是XLIX还是IL。虽然这是常识问题,但在这一点上出题人确实没有讲清楚。如果我也遇到了这样的问题,就只有反复读题,如果无果就只有向监考员提问了。如果我是出题人,我一定会反复审核题面,确保每一个人都明白了。不过,如果搞清楚了这一点,还会有谁做不出这道题啊?

  T2写的挺乱的,我也不想这样。因为已经预估出了我调试这道题会比较困难,所以考试最后也放弃了。而且一些地方的特殊判断也必须加上。因为中间很多东西都超过了long long,所以必须在任何可能导致这一后果的地方用INF进行替换。而关于long long与long long相乘与long long比较时,就只有勉强用double了。题目其实不难,但有些地方确实比较复杂。做法是一层层向下,每一层都能够立即算出其值,中间使用sort然后不停减到正确的区间。注意各种边界情况。因为这道题我没有用STL,所以此题跑的是最快的。

  T3当时已经几乎做出来了,但是有几个小地方:in是入度,中间的转移边也要考虑,nm是long long!!前2个当然很重要,但是因为此前想了太久,所以调试时间不够情有可原(中间行)。但第三个实在是不可饶恕!!!当时写暴力遗留下来的东西改都不改一下!!!

  但T3确实是一道好题,当时还建了图来确保拓扑序。但其实不必要,因为sort过后其实拓扑序都已经出来了,直接for就好怎么建边呢。建边的依据就是二进制拆分位的组合数+DP。当时想到二进制拆分位的时候以为做出来了,结果发现不行。后来想到容斥以为做出来了,结果发现也不行。之后千想万想才想到那个拓扑排序的神奇做法,就只有20分钟了。还是经验不够啊。DAG上用乘法原理跑容斥,这个玩意儿可以出神题啊!!!不知道WSQ到底有没有想到拓扑图呢?

  我T3的代码在FLOJ上跑得飞快,就是因为小数据暴力跑得更快。这大概就是《算导》中复杂度计算中说到的那种情况吧。

20171102 NOIP模拟26--LINYIN_IDY

  学支配树学得头昏脑胀依旧无果,是自己太naive了啊~~~

  T1中IDY本来出了DAG于是可以使用“灭绝树”,但林荫那边颇有不服。于是他们在EXTRA TEST当中出了几组有环的,但我就是学不会支配树啊。

  T2是一道很好的题目,正着看上去有2种选择,但反过来其实是唯一的。所以这其实是模拟,所以说字典序最小就是用来骗人的。但IDY还是十分良心,题面上是字典序最大,输出格式却是字典序最小。我直接用了string,所以根本不用考虑数组越界什么的,实现还很无脑。但string确实挺慢,要在适当的地方用适当的写法。

  T3是一道同样很具有欺骗性的题目。Hfu跟我说,最开始mcfx看到这道题目的时候很愤怒,说这是CTSC的难度,后来他们三个窝在一起讨论,终于恍然大悟。我看这道题目抠了一个多小时的脑袋,最后写了一个计算近似解的暴力,模拟了很多组数据,终于惊为天人。根本就没有什么double,而这导致我直接用int却炸了20分(其实算一下n2会爆int啊)……

  今天的T1暴力应该还是写的出来几十分的,但是没有仔细验证,内部产生了死循环(但其实整个方法就是错的无法避免死循环),导致最后几个WA其余的都RE。而像T3这种隐藏的数据范围之后应当非常小心,如果炸了就太不值。

  今天WSQ又AK了,WXH有250(T1写暴力),YFZ有240(T1写树的那4个点)。

20171103 NOIP模拟27--NORTH

  东北人做了,觉得很好,他们全场只有ZGZ有300,其余就是最高200了。今天200,应该230的。文件错误都犯了出来,实在是不对的啊。

  T1是多塔梵天塔。到底怎么办?我当时是没有想出来。不过,要把i个圆盘利用j个柱子转移,如果j为3可以直接算出((1ll<<i)-1),如果i比j小也可以直接算出(2*i-1),否则我们可以枚举一个k。这个k是什么?就是说,把i个圆盘利用j个柱子转移就是把k个圆盘利用j个柱子转移,再把i-k个圆盘利用j-1个柱子转移,最后把k个圆盘利用j个柱子转移(整个转移一定有一个时刻只有2个柱子上有东西于是可以这么想)。这个可以一层一层的推上去,如果用递推写起来很不方便,使用记忆化则好很多。

  T2是一道很好的字符串理解题。根据rank重构一个字典序最小的串,可以同时根据rank和sa进行递推。使用的方法就是后缀平衡树成功的那一套。如果排布超过了z,就无解了。

  T3跟昨天的T3基本上是一样的,只是多一点处理罢了。注意double与long long的设置。

20171104 NOIP模拟28--IDY

  今天在机房测下来只有150=0+50+100,在floj上测下来只有160=70+10+80。为什么?T1有了MLE,T2写了if(clock()>980) break,T3有一个叫ZJC的人乱搞数据……MLE是因为又忘了size(再说一次50002=2500万!),980是因为忘了linux的特殊性质(我在讲专题分享的时候着重提过),ZJC是因为IDY出错了数据。

  总的来说,220是一个比较正常的东西。220=50+70+100。

  T1可以二分,可以DP,可以贪心。DP是因为一个性质“一一对应”,二分也是“一一对应”,贪心更暴力是直接取连续区间。如果贪心正确,那么二分和DP一定不会错。当时并不会证明,于是写了“四分图”=二分答案+二分图。现在想来,这个东西其实挺显然的。但我DP的初值赋错了,这个地方63已经不对了,127更正确。而二分也是一个对一个。

  T2是一道不错的贪心。Pan-dragon的方法是把每一条边最大化,这个方法看似无法保证正确,但是可以递归地分化证明。而wjj的做法则更传统显然,由浅入深,由小消大,消不净则深入解决。很容易证明这样LCA群是最浅的(dis(u,v)=dep[u]+dep[v]-2*dep[LCA(u,v)])。LMY说,如果2*k=n,这个过程就是一个求重心的过程。虽然并不明白,但却好像有那么一点道理。

  T3是一道方法很多的题目。可以使用倍增下传(BZOJ4569SCOI2016萌萌哒的套路),可以使用并查集(BZOJ1576安全路径的套路),可以使用树链剖分(非常传统的做法),也可以使用可并堆+差分(YYF有一种神奇的“可减堆”,一个‘+’堆一个‘-’堆,‘+’‘-’同源是就必须弹了,ta用随机堆据说更快)。方法之所以如此多,就是因为题目先修改再查询(本质上是离线做法)。而这几种静态树问题解决方法,没用树链剖分的都用了倍增(毕竟要求出LCA)。所以,IDY当时说倍增很多时候只是工具就是这个意思了。

  觉得这套题目挺好的,虽然三道题目都是CF上的(T1831D、T2700B、T3828F)。T1和T3早在8月31号就被考了,那套题目是dogther又一次PY了codeforces,当时我去考了入学考试,并没有做过。T3是很经典的模型,所以方法也会很多。

20171105 NOIP模拟30--杭二+IDY

  前两道题好像是杭二2015模拟,第三道题是IDY留下来“坑”人的。

  T1当时只有60,百思不得其解。最后发现,algorithm的abs(不带std::)只允许扔入int导出int,必须要用自己的abs才行。

  T2暴力50,正解是一个非常巧妙的辗转相除。

  T3送了40,但hfu老师把样例作为第一个点测了(一共有了11个点,前10个点9分一个,最后一个10分),又懒得该数据,就有了45。

  像这种考试190应该不会有问题,但是T1确实敲响了警钟。还是不能完全信赖STL啊。

20171106 NOIP模拟31--高新

  今天140=100+30+10。毕竟是自己的学长出的题,顶一个。

  T1是一个前缀和+鸽巢原理。如果要想到正解,就去想:一定有解么?答案是一定有解,因为如果n个数的前缀和中%n出现了0,则一定有解。否则n个数的前缀和%n就只能取n-1个不同的值,根据鸽巢(抽屉)原理一定有重复的。那就在前面打个标记就完了。但是,如果想不到,random_shuffle序列然后for一遍前缀和的效率也不低(正解1xxms,这个9xxms)。

  T2是一道很好的题目。正解是跑2遍,第一遍找出众数,第二遍算出现次数。众数出现次数超过一半答案才非0,而众数出现次数只要超过一半就一定找的到。所以说可以使用mode的做法取找这样的数。而我当时愣是没有想到,虽然一直把“少的抵消多的挂在口上”,却没有想到正解。于是分治,k≤20时使用1<<20的值域桶(最开始因为边界问题挂了整整30分的Subtask),n≤1e6时使用1e6的数组进行排序,之后使用hash(考试时模数取的大了一点挂了)。电脑跑得快就是好,五千万的模运算也跑得飞快。之后WJJ和YYF又有了新想法,WJJ说可以对m组每组跳3个数判断(如果皆不相同则),YYF说可以随机取样找众数。于是我结合出了一种新玄学做法,对于m组每一组跑若干个数(我取了10个),然后取众数再跑一遍计数。这种做法明显可卡,因为有混循环(如果让我hack我就会造那种前面特长后面卡在一个数上的情况)。

  T3是一道很好的题目。把n个数扔入trie,在trie上面统计。并不需要考虑每一个数,只是不断分化排名就好了。对于一个结点存其子树2m场比赛排名的和与平方和,很好转移。因为每个结点长为m,所以时间和空间复杂度都为O(nm)。

  做完T3,蓦然想到NOI管道取珠。那道题就把a2看作了两个人玩游戏方案相同的情况。而solution也是这么想的,虽然并看不大懂。

20171107 NOIP模拟32--胜利一中

  这套题是山东人出的题目。今天200,虽然事后觉得三道都是水题……

  T1很快破题。枚举乘以b的数目k,算出加上a的数目。然后把该数b进制拆分,k位及以后的不要忘了加上。准确来说这是贪心,k显然很小。

  T2是一道二分答案。有一个很坑的地方,就是可以“以退为进”。于是check就必须要考虑到这种情况。后来可以发现对于任意超过standard的点对(x,y),合法的快速通道点对(L,R)需要满足|x-L|+|y-R|≤standard,很明显是左对左右对右交叉一定不优,那毕竟是1104IDYT1的正确性所在(1104时并未想到)。然后这是二维中的曼哈顿距离啊。于是对于这样的一个点对(x,y),合法的点对(L,R)取值就是二维中一个的正方形。于是check就变成了矩形求交,考虑斜的不方便,于是可以旋转以后重新建系,恰好就是XGG讲过的Manhattan距离处理方法(+,-)。当时时间太紧,差点就没有AC。本来以为是12:00结束,整个人都不好了。于是一错再错。惭愧啊!惭愧啊!惭愧啊!惭愧啊!惭愧啊!!!!!!!纸包不住火,就是这样的道理。我犯错了,我感到羞耻。我感到羞耻。我感到羞耻。我让高新丢脸了。我犯错了。我犯错了。我一定改。这是血的教训,我保证以后一定再也不这样做了。

  注:第二道题为什么有单调性?从check出发,发现当standard变大时,矩形会变少大小也会变大,更容易合法。

  T3也是一道二分答案。当时又想错了。那一回做火柴时以为可以任意交换,于是写了DFS找环,结果是相邻交换应该写逆序对。而今天以为是相邻交换,于是最开始确信的单调性都彻底忘掉了,于是写了一个DS来动态处理逆序对,结果是任意交换应该写找环。说真的,今天第一遍读题就确定了的单调性就那样被我弄没了。而且2*n保证出结果也是有暗示的啊,当时却以为是精心构造数据。方法很简单,是由IOI2015 D2T2去掉交互与方案构造组出来的。

20171108 NOIP模拟33--KuribohG

  今天190,T2当时错得很离谱(不然就是210辣……)。

  T1当时纠结了好久,就是不知道小“次”货是什么。事后百度一下才发现……ctrl+F,“次”替换为“吃”,确定。当时以为“次”是“窃”的意思,弄得一道题目就很难下手了。但因为是“吃”,所以就是一道非常简单的快速幂。

  T2就是O(nsqrt(n))的。分解质因数是sqrt(n),虽然pandragon“有”O(1)的方法。丢了20分是因为边界的赋值错误。

  T3是一道DP。其实不难,但当时有一点完全想错了。i个位置染j种颜色相邻位置不同色不能用快速幂!!!我以为是快速幂,于是非常艰难的试图去计算C(1e6,5e3)%1e9,发现自己失败了……因为根本就不是快速幂,使用快速幂只能保证j种颜色可行,而并不能保证j种颜色都被用到了。最后是f[i][j]表示i个位置染j种钦定好了的颜色且j种颜色的出现顺序一定的方案数,于是外面就有了一个阶乘,C(1e6,5e3)%1e9就变成了P(1e6,5e3)%1e9。这是非常巧妙的,不知道出题人是否有想到这一点。而WJJ的g[i][j]则表示从m种颜色中选出j种去i个位置的方案数,数值上就等于C(m,j)*f[i][j]*j!,整个式子就很难得到展开。而且一切会变得更加可怕,因为需要算出1/C(1e6,5e3)%1e9,本来算起来就十分麻烦,而且逆元可能根本就不存在。如果在测试时遇到这种情况,就必须考虑重新构建g[i][j]数组。这是一个十分根本性的变化,如果我遇到了这样的问题,我认为自己可能很难想到这一步。

  忽然想起早上开门。因为昨晚把U盘留到了2号机房,早上便向hfu老师借钥匙开门。最开始方向是对的,却打不开。于是反着扭,反而把门反锁了。于是再反过来,却卡在了一半。害怕钥匙脆了所以不敢使力,害怕门坏了于是回来找hfu老师帮忙。hfu老师似乎是早就知道了,已经出了门。然后说,我女儿都可以开的门你居然开不开……没有办法,于是再去。开始还是开不开,后来扭着把手再开就成功了。整个人很诧异。而hfu老师说,我们在解决问题的时候就是这样,差一步就是一步。所以还是重在平时的积累与思考啊。

20171109 NOIP模拟34

  一切都快结束了。

  今天230=60+100+70。

  T1看似是一道普通的a*x+b*y=c找正整数解,但a,b,c都可能是0或是负的。这就不能像原来那样不等式移项了。对于a与b中有0的情况需要特判。如果a为0、b为0、c为0,有无数对解。如果a为0、b为0、c不为0,则无解。如果a为0、b不为0、b*y=c有正整数解,则有无数对正整数解,否则没有正整数解。如果b为0而a不为0也是这样。之后拓展欧几里德找出a*x0+b*y0=gcd(a,b)。如果c不为gcd(a,b)的倍数则无解。如果a与b异号,则显然有无数组解。然后再处理a与b同号的情况。

  T2就是一道树形DP。如果一条(u,v)边的影响是在u与v合并时统计就会很不方便,于是考虑彻底把边拆了。就像是20171104那样,分别统计每一条边的影响,于是DP方程变成了访问v然后统计(u,v)边的全局值,然后像普通背包一样处理。而连接u的树边会在把u子树的边彻底更新完返回以后再统计。中间也很有把点和边搞在一起的意思。

  T3的60%就是一个普通的模拟,使用const数组可以简洁很多。然后我再输出n*m-k又骗了10分。

  T1中的情况说明我有很多情况都没有想到,分类讨论确实是一种很重要的能力。马上就NOIP了,不要紧张,就当作一次人生的经历,毕竟两条路其实大同小异。加油!

20171110 NOIP模拟35

  这是考过NOIP之后补上的。题目很简单,Doggu、Lemonoil、yyf0309、ywsama、JMR都AK了。

  T1和T3是入门难度的。T2是一道大模拟,之后HFU说ta很有远见,知道要考大模拟才选了这道题。是一个多项式化简,还是一道好题。通常做法是开2个栈,一个符号栈一个多项式栈。相当于是半个高精度(不进位)加上一个多项式运算。只要是数就直接压入,如果是“(”或“*”也直接压入,而“)”则需要不断弹栈直到有“(”弹出,而“+”“-”则需要弹出之前的“*”。就是运算符优先级的理论,为了方便还在首尾加上了括号。我当时并没有想到,于是使用了DFS对式子进行分割。反正一个*就是O(n2)的,DFS一个O(n2)也没有问题。所以很多时候,思维不能够限得那么死。实在不行就算不完美也可以试一试,例如三贪取最优就是一个典例。

  ZJC没有取模,居然对了30分,还是后30分。而这道题目没有"(-1)"这样的东西,如果有是有必要在中间加一个“0”的。如果要避免次幂被削,就可以使用双hash近似出真0和假0。


20171111 NOIP2017(共2试)

  嗯嗯嗯嗯嗯。就当NOIP游记了。

day 1(应该220=100+100+20)

  当我踌躇满志看过第一遍题的时候,预估了一下。嗯,T1应该是一道不难的数学题目可能和exgcd有关系,T2就是一道题目怎么说我就怎么做的题目,T3应该是一道图论但是方案数应该很多很多到底该怎么办呢?

  然后开始做题。T1gang不出来没有办法1h过去了,只好把T2做了验稳,再去gangT1,还是没有办法。于是绝望了,打算写暴力。30%的暴力太水了,只有60%说得过去。使用exgcd预处理一下,可以O(1)判断一个价值是否有解。但直接for发现很困难,于是再潜心思考加上了二分答案。每一次check是O(n)的,因为这么长都可以那么以后就一定可以了。于是60%就成了,输入了9999和10000得到了一个很意味深长的答案:99970001,再输入9999和9998得到了另一个意味深长的答案:99950005。发现这个数和两数乘积之差或许有点意思,于是开始打表,惊为天人。事后想到60%暴力for当然跑不出来!

  其实T1的端倪是很容易寻的。高一鸣在开考后不久问了T1一个很傻的问题“答案可不可能为0?”,当时只当taNAIVE,而事后我想那时ta应该就已经做出来了,如果那时候分析到了就不会把T1和exgcd扯了那么久(考前做了不少exgcd)。HFU说T1的大数据那么小,就是害怕同学们猜到。而样例是3和7,“”样例是3和10,如果当时想到把3和8与3和9算一下也可能就惊为天人了……但当时没有立即想到确实就是那个样子,之后再议论纷纷也没有什么意义了。

  只是令人痛心的是,做完了我的T3还差不多剩1个小时,虽然已经打了一些预处理,但主体还是缺在那里的。没有办法,写了一个A*,慌乱之中又没有写下真正的A*。虽然只差一点,但毕竟就已是那样。最后的结果还算比较满意,人还是不能太贪了啊。T3的正解挺有意思的,觉得已经完全不能算NOIP了。

day 2(应该250=100+100+50)

  啊。看了一下题,心中有了底。T1大水题,T2构造一棵树,T3就是读不懂题。

  T1是很水,但是按照原题的数据范围有20%的数据中间过程会爆long long需要特殊处理。两份民间的是一五一十扣了20,但“官方”并没有。

  T2写了一个状压。开始是记忆化搜索,跑8是0ms,跑12却要30s,把栈开大了以后依然是10s。只有改成for,先把所有的状态排序保证拓扑序,然后枚举子树状态枚举子树的根枚举根的深度,再枚举子树的子集(保证中间没有根)枚举子集的根再进行转移。看上去有很多很多个for,但中间大概只有3000万次运算,数组大小是O(n22n)的,转移大概是O(n32n)的,但std说ta是O(n3n)的。两个级别相当,我什么都不懂……

  而T3看过题意后发现50%实在太水,水过之后去写80%的平衡树。然而写挂了,也是前面的时间问题。直到现在,我都不知道100%到底怎么做。

最后有必要说一下

  我看过自己的两份民间成绩都是450,最后470是因为D2T1没有卡我。但是那些什么“民间”测出来比“官方”少200分的我真的实在是不能接受,绝对不能去怪“民间”数据,而是应该从自己内部找原因。明明程序写的就是很成问题,居然“官方”也可以对,说明本来“官方”也存在着问题。我们的同学很多验证代码的能力都不够,很多时候我也是这样的。而数据如果不够严谨,就会让不严谨的代码得很多的分。字如其人,代码亦如其人。只有平时生活中就足够严谨,才能写出真正健壮的东西。

注:ZJC同学+1

 


未完待续的结束

  NOIP才考完的时候,回归课堂,同学们依旧很友善,老师们中嫌弃你的依旧嫌弃你。一切都是那么熟悉,却又是那么陌生,有一种恍若隔世的感觉。但还是有一点令人不快活,就是没有键盘可以敲,双手一天到晚都犯痒痒。犯痒痒就得治,方法说形象一点就是立志成才上果冻说的“要想让田间不长杂草就要在上面种满庄稼”。企图用书本掩藏自己百感交集的心,却终究是失败了。主要是迷茫,不知道该走哪条路,因为每一条路都荆棘丛生而又令人向往。那几天,我向很多同学吐露了自己的心声,他们也相应真诚地告诉我:要尊重自己的心性。

  

  加上NOIP的口胡,终于突破了20000字大关。还是挺感慨的。

  神当然这只是因为这篇博客

posted @ 2017-10-10 15:55 Doggu 阅读(...) 评论(...) 编辑 收藏