题意:给一个01序列,有5种操作:
0 L R 将[L,R]之间的数字都变成0;
1 L R 将[L,R]之间的数字都变成1;
2 L R 将[L R]之间的数字都取反;
3 L R 询问[L R]之间1的个数;
0 L R 将[L,R]之间的数字都变成0;
1 L R 将[L,R]之间的数字都变成1;
2 L R 将[L R]之间的数字都取反;
3 L R 询问[L R]之间1的个数;
4 L R 询问[L,R]之间连续1的个数最大是多少.
第一眼:这sb题。。
第二眼:这sb题。。
第三眼:哎呀卧槽这儿取反和赋值俩标记咋搞???
大致脑补了一下,很不确定对不对,然后上网看了下别人的写法,也觉得很难想清楚。。
管他的,开始写吧!!
用啥数据结构?线段树?貌似很好写,但是线段树修改都还好,最要命的是询问的时候你还得拼凑答案。
那就treap吧。。treap可以split出来直接读取答案。
写了差不多40分钟终于写出来了,样例1A了。然后往codevs上叫只过了一个点。。
然后就开始2+hrs的Debug。。然后实在找不出错了。。然后就打算另辟蹊径,我不维护两个标记了,我直接维护两个treap!!空间没限制就是任性!!这两个treap每一位都相反,比如说第一个treap是01001,第二个就是10110,各自维护对应的信息,分开保存根。
每次题目要求<0 l r>操作的时候实际对第一个trea