JSOI 2019 Round2游记

Posted by wyj on April 28, 2019

Day 0

进队可能性严格等于0的我毫无心理压力。试机发现NOI Linux有些卡。住在宾馆里,居然有两室一厅的豪华套间。但是我还是没睡好。

Day 1

这次没有被区别待遇了。我比赛开始之前偷偷看题,看到c++11,吃了一颗定心丸。倒序开题,因为T3乍一看最可做,好像充满了SA的味道。然而仔细想了想并不会做,随机都不会。然后看T2,一开始死活不会做\(k_i\le3\),怎么dp都不行,然后发现是sb容斥。我就开始梦想容斥A题,没有梦想出来。看见神仙snz出去上厕所。

这时候已经过去了1h,我开始看T1,发现好像是个SB线段树优化建图+拓扑序+bitset?我就开始码码码,码完线段树之后发现好像不太对劲。然后我手玩了一个反例:

1 3 2
0 1 1 2
1 1 1 3

输出应该是1 1 0。然后我自闭了。又想了一个小时,发现A活->B死可以推出B死->A活。然后我发现这居然是个2sat。我意识到之前的假算法叫做不建反向边的2sat。所以说2sat是怎么做“钦定一个点为1,查询可能为1的点个数”的?我又想了很久,发现这还是个bitset。这时已经10点半了,我还一行代码没写。很虚。

刚想开始码,过了三分钟我又把自己叉掉了,陷入了更深的自闭。

1 3 2
1 1 2 3
0 1 2 3

输出应该是1 1 0。也就是说,有一些点,无论别的点怎么选,他都会死。我又YY了很久,想出了第三个假算法。我以为一个点能够到达的点是他的支配树子树,就准备开始建支配树。

还好我这时候脑子稍微清醒了点,深深的领悟到了自己菜鸡的本质,于是开始码暴力。我非常sb的建了\(nT\)个点,于是就只有30了。然而我还是想了很久怎么解决一定会死的点的问题。后来发现再来一堆bitset就可以了。于是11点时我终于获得了30分。

然后开始T3暴力,我本以为随机可以做。我以为i可能比i-1更优的解基本在在\((i-30,i]\)区间中间,后来发现这玩意随便卡,对拍也过不去。于是把i-30改成了1变成三方暴力。期望得分还是30。

然后我想了好久是先开T2还是写T1的线段树优化建图(我当时脑子抽了不知道可以直接建)。其实我当时不知道支配树是假的,于是最终选择T1。码完线段树之后,我大概就可以估算出来使用的空间大小了。于是我算了算期望得分,发现MLE到只有60分了,还不如写个bitset方便呢。所以说写两题的期望收益是一样的。写到12:30的时候终于写完了,发现样例都过不去。我调都没调直接果断放弃。但是这好歹是一个真算法了。

于是开始码T2,发现自己代码能力太弱了,想想状压,状压不会码,又想想容斥,也不会码。于是先写了个\((n-1)!\),然后开始思考状压的细节。思考着思考着发现样例应该是6啊,\(5!/5/2/2=6\),然后就很自闭,手玩了样例,真的只找到了6种回路。只好硬着头皮状压,状压完发现大样例也是乘个2就过了。看来这个sb哈密顿回路是不分顺时针逆时针的。这时候已经12:55了,我还不愿放弃,开始\(k\le3\),盲猜一个容斥系数\((-1)^k\),然后乘个A乘个阶乘再乘个n个数中选k个不相邻的方案数即可。开始疯狂码,却发现样例都过不去。仔细思考了一下发现每一对数都可以交换位置,所以还要乘个\(2^k\)。然后就过了手玩的数据。这时候已经13:05了。弃疗。我成为了三道暴力选手。

出考场发现大家得分普遍不高,惊奇的了解到T1压根不要线段树,T3的那个“n个数中选k个不相邻的方案数”居然是个组合数。发现自己智商为0。

然后是经典的转折,snz出来了,并且分数是我的两倍以上。我已经习惯了。

下午看成绩,snz没有FST,于是以脚踩xyx的成绩翻盘,成为吊打预备队大神。我也没有FST,因为众所周知暴力写挂的可能性几乎为0。连jyg都吊锤我。

发现自己排名比去年还低,真的难受。不说了,文化课真有趣