清北学堂Day 5游记

佛系人生 && rank 47 gg

早上又吃了自己的饭(食堂的饭简直令人震惊),匆匆跑到电脑旁,下题目,打好头文件,浏览一下题,接下来,令人震惊的事情接连发生。。。。。。

T1:妈耶,1000000的数据范围,要线性算法吧qwq?(事实上确实是),想想想,感觉还是可做的......

8:40:妈耶,还是不会,这是T1?算了,写个80分的线段树吧,码码码......

9:08:妈耶,肚子疼,看了看表,线段树码完了,还是去上个厕所吧。

9:38:回来一看,妈耶!赶紧调试,调调调......

10:15:总算从RE变成了WA,大样例过不了。cao,这样要凉了啊,算了,将就一下写个60分暴力,写之前先看看T3,

T3貌似有沙雕的N4的暴力,N3似乎很可做?一看表:10:20,感觉很虚,应该先打打暴力,码码码......

10:30 T1暴力码完了,结果:妈耶!大样例还是没过,脑海中一片空白...................

10:30-------10:45 :发呆,什么也没干。

10:45:彻底弃疗,还剩45min,我还是爆零态,那么,索性心平气和地看看那凉心的题吧,吧,吧.......妈耶!T1读错了,首先n<=1000000,漂亮的线段树貌似可以?其次,不能倒着走,只能正着走!WTF?

10:55--11:31 光速码..........

最终期望得分:100+40+40,实际得分:80+30+0;

结果没有出乎意料,毕竟线段树常数大,但是T3的暴力挂了很不爽(毕竟花了5分钟写完的),而且听说N^3可以过90%数据?那真是太狂野了。

题解:

T1
单调队列

**T2 **
首先我们要一行一行的考虑、

dp[i][][][][] 前i行棋子的状态是? ? ? ?,此时的方案总数

黑棋是每行每列放两个,白棋是每行每列放一个

一行一行枚举时,强制让每行放2黑的,1白的,只要考虑所有列符合条件就可以了。

一个列: 白 放 / 没放 黑 放1个/没放/放两个

所以我们很自然的想到dp[i][a][b][c][d][e][f] 表示前i行,0白0黑的列有a列,0白1黑的有b列,0白2黑的有c列,1白0黑...

由于 a+b+c (0个白的列的个数) +d+e+f(放了1个白的列的个数) = n

所以对于第i+1行,枚举3个棋子放的状态,O(1)转移

O(n^7) -> O(n^6)

对于白棋,因为每行放一个,现在总共放了i行,所以肯定有i列放了白棋。
d+e+f=i。
O(n^6) -> O(n^5)

对于黑棋,每行放两个,所以有
b+e+2c+2f = 2*i
O(n^5) -> O(n^4) n=50

T3
我们先预处理出g[i][j]表示 i 到 j区间的最长的满足条件的区间长度(O N^2)
之后开始解决问题:
先枚举第一段区间的右端点r,当l=1时,求出所有 × (×代表哪些不能放) 的位置,并求出第二段区间能取的最大长度。
随着l往右走,部分×被解锁,更新第二段区间的最大长度(并查集实现),然后更新答案。
f[i]表示在并查集树上的父亲,i的祖先就表示从i出发向右最近×的位置。
x这个位置被解锁了,getf(x+1)表示新增的区间右端点在哪里, 更新f呢,f[x]=getf(x+1);
总之,说的好我选择平衡树

学习笔记:
T1

题解:

T2

原文地址:https://www.cnblogs.com/bullshit/p/9745445.html