• LCT的一些坑【已经变成坑点集合了233】


    好了蠢蠢的我写了第一个LCT模板就炸掉了QAQ

    开个blog记一下我能出多少锅。

    1.splay写挂了hhh这个你真的是蠢

    2.这个奇怪的东西

    bool not_root(int x){return t[t[x].fa].son[0]==x||t[t[x].fa].son[1]==x;}
    #define not_root(x)	(t[t[x].fa].son[0]==x||t[t[x].fa].son[1]==x)

    奇奇怪怪hhh

    这玩意要是写成上面那个可能会爆栈...至少某谷咕咕咕了hhh

    调了一上午然后从darkbz下了波数据发现没毛病,然后交了一发bz他喵的A掉了...

    所以以后最好写下面那个以防炸掉hhh

    3.又一个奇奇怪怪的东西

    void splay(int x)
    {
        push(x);
        while(not_root(x))
        {
            int f=t[x].fa,gf=t[f].fa;
            if(not_root(f))
                (t[f].son[1]==x)^(t[gf].son[1]==f)?rotate(x):rotate(f);
            rotate(x);
        }
    }

    很明显,中间这个not_root(f)应该是对的,然而[bzoj2049]洞穴勘测 写成了gf也没挂...原因可能是因为那个只是维护连通性。

    这个地方我也不知道为什么改成gf也是对的。哪位爸爸可以告诉我一下吗...

    hhh补一个SPLAY的坑

    void reverse(int x)
    {
    	if(!x)	return;
    	swap(ls,rs);
    	swap(t[x].lmn,t[x].rmn);
    	swap(t[x].lmx,t[x].rmx);
    	t[x].rev^=1;
    }

    这是不是非常正常的一段代码hhh 我这个sb写了个swap(t[ls],t[rs]);这很明显的错误啊 区间翻转变成了类似蝴蝶操作的东西???你该长点脑子了hhh

    hhh我又来补坑了。。一个玄学的东西。

    void access(int x)
    {
    	int y=0;
    	do
    	{
    		splay(x);
    		t[x].son[1]=y;
    		//if(y)	t[y].fa=x;
    		pushup(x);
    		y=x;x=t[x].fa;
    	}while(x);
    }
    

    就是被注释掉的那句。。。我也不知道为什么之前要写...但是很明显y的父亲一直是x...蠢哭...

    经历一番讨论以后SCB神犇和我达成共识,findroot操作是不需要pushdown的,因为access的时候标记已经清空了QwQ

    mdzz真要被自己蠢哭了

    void rotate(int x)
    {
    	//if(!x||!not_root(x))	return;
    	int f=t[x].fa,gf=t[f].fa;
    	int k=(t[f].son[1]==x),p=k^1;
    	//pushdown(f);pushdown(x);
    	t[x].fa=gf;t[f].fa=x;
    	if(not_root(f))	t[gf].son[t[gf].son[1]==f]=x;
    	if(t[x].son[p])	t[t[x].son[p]].fa=f;
    	t[f].son[k]=t[x].son[p];t[x].son[p]=f;
    	pushup(f);pushup(x);//pushup(gf);
    }

    看起来是不是非常正常!!!很好你也中招了。我们先修改了f的父亲,那么我们的not_root函数是不是GG了啊!!!

    md从中午11:30开始肉眼比对了一下午(至少3h。。。)浪费多少时间mdzz..

    留坑待补QwQ

    Update1016

    写了个二维RMQ发现ST表真的一言不合就RE啊

    然后发现了一种写起来十分优秀的写法,省了空间还免RE

    贴一下

    for(x=1;x+(1<<(i-1))<=n;x++)
    	for(y=1;y<=m;y++)
    		w[x][y][i][j]=max(w[x][y][i-1][j],w[x+(1<<(i-1))][y][i-1][j]);

    介个是一个二维的(一维的也一样w)

    这样的话数组用多少开多少就可以了w

    然后还有就是注意log里面不能为0不然也会GG的qaq

    一个悲伤的故事。其中倒数第二次是到test73jf的。总共90组数据。

    好了我已经意念AC了qvq

    upd2018-11-30

    非常舒适的树点涂色(大雾)

    在线段树维护dfs序的时候一定要记得分开dfs序数组和xl数组 建树一定用的是xl

    错了好多次了呢QAQ

    还有LCT的时候是

    if(not_root(f)) t[gf].son[t[gf].son[1]==f]=x;

    QAQ

  • 相关阅读:
    bzoj 5028小Z的加油店(D12 序列gcd)(线段树+树状数组)
    蒲公英
    [APIO2012]派遣(可并堆)(D11)
    AT1219 歴史の研究(回滚莫队)
    [USACO05DEC] 布局
    小B的询问
    [HEOI2012]采花(树状数组)(暑假D11)
    [JLOI2011]飞行路线 (暑假D3 拆点+dijkstra堆优化)
    [POI2012]FES-Festival
    [国家集训队]拉拉队排练
  • 原文地址:https://www.cnblogs.com/hanyuweining/p/10321977.html
Copyright © 2020-2023  润新知