序言
此日志分为四部分。
00:00
是开始打代码的时间。
最开始打完代码(没有debug)大约用了两小时。
part1-20210323
02:30
生成新节点时,没有给随机权值。
02:41
upd中,sum更新时没有先清空,没有加上右儿子的sum。
02:46
操作12没问题
操作3会RE+WA
5 100000
0 0 0 1 1
3 1 5
change1中第7行,merge中顺序反了。
change1中第11行,分裂出的子树错误(\(z\rightarrow y\))。
03:01
split1中if(k>l[i])
应为if(k>=l[i])
分裂左/右子树反了。
03:07
assign中,\(l\not=1\&\&r=n\)中\(lv[y]=x\)的case中,没有拓展同色区间。root=merge(x,node(l,n,v));
改为root=merge(x,node(ll[y],n,v));
1和l看错了root=merge(root,node(1,rr[y],v));
应为root=merge(root,node(l,rr[y],v));
x和1搞错了if(lv[y]!=x)
应为if(lv[y]!=v)
03:10~11:40
睡觉
11:57
change1中,修改y树的根时work(y,1,flag==1?1:-1);
应为work(y,0,flag?1:-1);
12:02
dfs中始终只会spread rootspread(root);
改为spread(x);
12:33
spread中只要有一种标记没有打,则就不会下传标记if(!lazy[x][0]||!lazy[x][1]) return;
应为if(!lazy[x][0]&&!lazy[x][1]) return;
过样例,WA+MLE+RE
12:45
hack:
5 10000
1 0 0 0 0
4 1 5
树的结构错误的变成了
1 1 1
3 5 0
操作4错误
12:55
打模拟赛
14:22
上面的错误是debug错了,输出树的结构没有spread。
15:32
忘记强制在线了,WA-ALL(说明只差一点点了!)
15:32
写了对拍(无加密)
10 100
1 1 0 1 0 0 0 1 0 0
3 3 6
5 1 4
5 4 7
7 7 8
5 5 6
3 10 10
4 6 9
3 8 9
3 5 10
7 2 9
5 6 9
6 3 10
4 1 1
1 7 7
4 4 8
2 4 7
5 5 9
1 9 9
7 1 4
5 3 4
2 2 8
2 9 10
7 8 10
2 2 7
7 3 9
我输出
1
2
2
3
7
std
1
5
4
3
7
为什么修改无效?
16:30
午餐
17:20
午休
18:12
下午好
下午没有做什么,所以暂停了计时。
18:56
晚上好。加油吧,\(Vanilla\_chan\)!
19:25
重写了upd,assign函数
/**************************************************************
* Problem: 5066
* Author: Vanilla_chan
* Date: 20210323
* E-Mail: Vanilla_chan@outlook.com
**************************************************************/
#include
#include
#include
#include
#include
#include
#include
显然这份代码不能过。能过就折寿了。
part2-20210327~20210328
在家与学校之间的地铁上debug。
upd函数中,r[x]-l[x]+1
写成r-l+1
。
重构代码,用指针全部重写。
\(0pts\).
part3-20210329
整个下午都在调指针。
过了自己的样例……还是\(0pts\).
又造出了一组hack数据!
debug……80pts
!
数组开小了,\(3\times 10^6\)。
还是80pts
……
卡常,卡常,跑完操,没吃晚饭。
找lxl小姐姐请求放大时限(然后把最后一组数据调成了8s
)还是过不去。
果然,越可爱就会越毒瘤吗……
part4-20210330
进入了漫长的卡常期……
不delete
废弃的指针(反正不会MLE)
把所有的==
,!=
都改成了^
。
将while(!root->mn[0]||!root->mn[1]) update();
改写到3|4|5|6
内部去,减少四个if
。
将随机数改写成了s*=13
并\(\text{unsigned int}\)自然溢出。
spread
等函数全部inline
,并判断有lazy
时再进入函数操作(if放到函数外面减少调用次数)。
将快读变为传址。
删除无关头文件。
split1/2中的k既不会修改也不会冲突,就去掉这个参数改为全局变量吧。
可以过\(\#27\)了!
将随机数改写成s=(s<<1)+s
.等价于s*=3
。
将ans
变为全局变量,同时就可以不用lastans
了。
对于update
中的\(x\)同理。
我傻了,随机数怎么可以写成s*=3
?那样对于一段内的key
不久全是单调的了嘛!
换成s*=19260817
。
可以过\(\#31\)了!\(90pts\)
将ask,assign,change1.change2
函数中的*x,*y,*z,*t
设置成全局的。
将有\(bool\)变量参数的函数全部分程两个,比如\(change1\)写成\(change10\)和\(change11\),\(change2\)写成\(change20\)和\(change21\),\(assign\)写成\(assign0\)和\(assign1\),\(work\)写成\(work0\)和\(work1\)。
关于随机数,试了s=s*3^3
在\(\text{unsigned short int}\)下虽然跑的很满很快,但是实际效果不如s*=19260817
在\(\text{unsigned int}\)。于是我就换成了s*=1000000009
在\(\text{long long}\)下的自然溢出。
考虑到读取\(3\times 10^6\)个\(\text{bool}\)变量用读取\(\text{int}\)的快读还是可圈可点的。所以写了readbool
inline void readbool(bool &xx)
{
ch=getchar();
while(!isdigit(ch)) ch=getchar();
xx=ch-'0';
}
\(\textbf{2021-03-31 08:00:25 thus,AC.}\)
第129发过了。