作为水到一等的弱省OI蒟蒻,甚至以为自己能听懂SDWC的省选班。去了以后发现除了搜索、仰望大佬和看妹子(还真有妹子很不错)以外啥都不会…每天都是听一小时之后弃疗。
然而唯一有基础的线段树…也是一上来“大家都会写线段树吧”然后丢一道黑题(也就是这道)。同伴在身边大呼简单:“也就差分比较难想。”于是当天晚自习,我们点开了那道题…
写完统计差分数组中连续相等数的长度获得了一堆Wonderful Answer后…发现正确答案比我们的输出小一半后百思不得其解…点开题解,发现要维护什么零散数列长度…同伴果断放弃,我也知道考场上不可能有时间给你看题解,不过面对自己百余行代码不忍弃之…然后怼了一周,终于a掉了。
唉,手残毁一生,特此留念。
题目编码不同,那就不复制了。
https://www.luogu.org/problemnew/show/P4243
正文也没啥可以写的,各路大佬写得都很透彻,我的码力不足,常数巨大,那我总结一下看题解得到的经验。
1.各路大佬都喜欢快读,看来这种水平的题目,刷题者已经习惯快读了;
2.当线段树向上合并操作比较麻烦的时候,可以在线段树节点的结构体中重载加号(我在这道题没写,导致pushup和query的时候写了两遍…);
3.差分数组中第一项为原数组第二项与第一项之差,以此类推,所以差分数组中只有n-1个元素;
4.注意边界问题的处理,区间加的时候看看边界,比如第一项没有与前一项的差什么的;
5.千万不能手残!!!!!!!!!!!!!
#include<cstdio>
#include<algorithm>
#define lll long long
const lll maxn=100002;
lll tt[maxn],a[maxn],n,m,x,y,s,t,i;
char ch[3];
struct node{lll l,r,t,ll,rr,len;};
struct segtree{
#define lson (o<<1)
#define rson (o<<1|1)
#define mid ((l+r)>>1)
lll addv[maxn<<2],vall[maxn<<2],valr[maxn<<2],sumt[maxn<<2],suml[maxn<<2],sumr[maxn<<2],lenv[maxn<<2];
inline void pushup(lll o){
lll lenl=lenv[lson],lenr=lenv[rson];
lenv[o]=lenl+lenr;//此处手残多处,有很多细节
suml[o]=sumr[o]=0;
vall[o]=vall[lson];valr[o]=valr[rson];sumt[o]=sumt[lson]+sumt[rson];
if(suml[lson]==lenl&&sumr[rson]==lenr){
if(vall[rson]==valr[lson]){sumt[o]=1;suml[o]=lenl-1;sumr[o]=lenr-1;}
else{sumt[o]=0;suml[o]