1、题目大意:bzoj1798的lct版本

2、分析:这个把线段树改成splay就好

#include <stack>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
#define LL long long
namespace LinkCutTree{
    struct Node{
        Node *ch[2], *fa;
        LL sum, num;
        LL size;
        bool rev;
        LL mul, plu; 

        inline int which();

        inline void reverse(){
            if(this) rev ^= 1;
        }

        inline void pd();

        inline void maintain(){
            sum = (num + ch[0] -> sum + ch[1] -> sum) % 51061;
            size = (1 + ch[0] -> size + ch[1] -> size) % 51061;
        }

        Node();
    } *null = new Node, tree[100010], *pos[100010];

    Node::Node(){
        num = sum = 1;
        rev = false;
        ch[0] = ch[1] = fa = null;
        mul = 1;
        plu = 0;
        size = 1;
    }

    inline void Node::pd(){
            if(rev){
                swap(ch[0], ch[1]);
                ch[0] -> reverse();
                ch[1] -> reverse();
                rev = false;
            }
            if(ch[0] != null){
                ch[0] -> mul *= mul;
                ch[0] -> plu *= mul;
                ch[0] -> plu += plu;
                ch[0] -> num *= mul;
                ch[0] -> num += plu;
                ch[0] -> sum *= mul;
                ch[0] -> sum += plu * ch[0] -> size;
                ch[0] -> mul %= 51061;
                ch[0] -> plu %= 51061;
                ch[0] -> num %= 51061;
                ch[0] -> sum %= 51061;
            }
            if(ch[1] != null){
                ch[1] -> mul *= mul;
                ch[1] -> plu *= mul;
                ch[1] -> plu += plu;
                ch[1] -> num *= mul;
                ch[1] -> num += plu;
                ch[1] -> sum *= mul;
                ch[1] -> sum += plu * ch[1] -> size;
                ch[1] -> mul %= 51061;
                ch[1] -> plu %= 51061;
                ch[1] -> num %= 51061;
                ch[1] -> sum %= 51061;
            }
            mul = 1;
            plu = 0;
    }

    inline int Node::which(){
        if(fa == null || (this != fa -> ch[0] && this != fa -> ch[1])) return -1;
        return this == fa -> ch[1];
    }

    inline void rotate(Node *o){
        Node *p = o -> fa;
        int l = o -> which(), r = l ^ 1;
        o -> fa = p -> fa;
        if(p -> which() != -1) p -> fa -> ch[p -> which()] = o;
        p -> ch[l] = o -> ch[r];
        if(o -> ch[r]) o -> ch[r] -> fa = p;
        o -> ch[r] = p; p -> fa = o;
        o -> ch[r] -> maintain();
        o -> maintain();
    }

    inline void splay(Node *o){
        static stack<Node*> st;
        if(!o) return;
        Node *p = o;
        while(1){
            st.push(p);
            if(p -> which() == -1) break;
            p = p -> fa;
        }
        while(!st.empty()){
            st.top() -> pd(); st.pop();
        }

        while(o -> which() != -1){
            p = o -> fa;
            if(p -> which() != -1){
                if(p -> which() ^ o -> which()) rotate(o);
                else rotate(p);
            }
            rotate(o);
        }
    }

    inline void Access(Node *o){
        Node *y = null;
        while(o != null){
            splay(o);
            o -> ch[1] = y;
            o -> maintain();
            y = o; o = o -> fa;
        }
    }

    inline void MovetoRoot(Node *o){
        Access(o);
        splay(o);
        o -> reverse();
    }

    inline Node* FindRoot(Node *o){
        Access(o);
        splay(o);
        while(o -> ch[0] != null) o = o -> ch[0];
        return o;
    }

    inline void Link(Node *x, Node *y){
        MovetoRoot(x);
        x -> fa = y;
    }

    inline void Cut(Node *x, Node *y){
        MovetoRoot(x);
        Access(y);
        splay(y);
        y -> ch[0] = x -> fa = null;
        y -> maintain();
    }
}
int main(){
    using namespace LinkCutTree;
    null -> mul = 1;
    null -> size = 0;
    null -> plu = 0;
    null -> sum = 0;
    null -> num = 0;
    null -> ch[0] = null -> ch[1] = null -> fa = NULL;
    int n, q;
    scanf("%d%d", &n, &q);
    for(int i = 1; i <= n; i ++) pos[i] = &tree[i];
    for(int i = 1; i < n; i ++){
        int u, v;
        scanf("%d%d", &u, &v);
        Link(pos[u], pos[v]);
    }
    char op[5];
    int x1, y1, x2, y2, c;
    while(q --){
        scanf("%s", op);
        if(op[0] == '+'){
            scanf("%d%d%d", &x1, &y1, &c);
            MovetoRoot(pos[x1]);
            Access(pos[y1]);
            splay(pos[y1]);
            pos[y1] -> num += c;
            pos[y1] -> num %= 51061;
            pos[y1] -> sum += pos[y1] -> size * c;
            pos[y1] -> sum %= 51061;
            pos[y1] -> plu += c;
            pos[y1] -> plu %= 51061;
        }
        else if(op[0] == '-'){
            scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
            Cut(pos[x1], pos[y1]);
            Link(pos[x2], pos[y2]);
        }
        else if(op[0] == '*'){
            scanf("%d%d%d", &x1, &y1, &c);
            MovetoRoot(pos[x1]);
            Access(pos[y1]);
            splay(pos[y1]);
            pos[y1] -> num *= c;
            pos[y1] -> num %= 51061;
            pos[y1] -> sum *= c;
            pos[y1] -> sum %= 51061;
            pos[y1] -> mul *= c;
            pos[y1] -> mul %= 51061;
            pos[y1] -> plu *= c;
            pos[y1] -> plu %= 51061;
        }
        else{
            scanf("%d%d", &x1, &y1);
            MovetoRoot(pos[x1]);
            Access(pos[y1]);
            splay(pos[y1]);
            pos[y1] -> sum %= 51061;
            printf("%lld\n", pos[y1] -> sum);
        }
    }
    return 0;
}

BZOJ2631——tree的更多相关文章

  1. bzoj2631: tree

    #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...

  2. [BZOJ2631]tree 动态树lct

    2631: tree Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 5171  Solved: 1754[Submit][Status][Discus ...

  3. [Link-Cut-Tree][BZOJ2631]Tree

    题面 Description: 一棵\(n\)个点的树,每个点的初始权值为\(1\).对于这棵树有\(q\)个操作,每个操作为以下四种操作之一: + u v c:将\(u\)到\(v\)的路径上的点的 ...

  4. bzoj2631 tree LCT 区间修改,求和

    tree Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 4962  Solved: 1697[Submit][Status][Discuss] Des ...

  5. bzoj2631: tree lct

    要打mul和add的lct 50000+的mod用unsigned int好了TAT (坑爹没打pc('\n');(静态)调了好久,样例竟然只输出一个,orz,也不提示PE T_T) #include ...

  6. BZOJ2631 tree(伍一鸣) LCT 秘制标记

    这个题一看就是裸地LCT嘛,但是我wa了好几遍,这秘制标记...... 注意事项:I.*对+有贡献 II.先下传*再下传+(因为我们已经维护了+,不能再让*对+产生贡献)III.维护+用到size # ...

  7. [bzoj2631]tree——lct

    Brief Description 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: u v c:将u到v的路径上的点的权值都加上自然数c: u1 v1 u2 ...

  8. BZOJ2631 tree 【LCT】

    题目 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2:将树中原有的边( ...

  9. BZOJ2631: tree(LCT)

    Description 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2 ...

随机推荐

  1. CSS3-实现单选框radio的小动画

    在微信上看到一个教程文,觉得制作的小动画还是很有意思的,自己也试验了一下.一开始动画怎么都不执行(我用的HB),因为内置浏览器对css3的不兼容.加上各种浏览器前缀后就好了.但是旋转那个效果,在HB里 ...

  2. JAVA jdbc获取数据库连接

    JDBC获取数据库连接的帮助类 import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManage ...

  3. 如何排查APP服务端和客户端是否支持ATS

    服务端排查 取得客户端直接连接的服务端域名及端口,例如mob.com.cn,端口443,即HTTPS默认端口.针对公网可访问的生产环境地址,建议使用的在线监测工具.https://wosign.ssl ...

  4. You Can Do Research Too

    You Can Do Research Too I was recently discussing gatekeeping and the process of getting started in ...

  5. PHP代码质量优化

    最近总结了一些平常写PHP代码时的一些优化分享给大家. 1.尽量使用绝对路径 相对路径中会检查很多路径,这时我们可以使用绝对路径,但绝对路径不利于后期维护,所以define定义的时候使用__FILE_ ...

  6. nginx和fpm的进程数配置和502,504错误

    502 和 php-fpm.conf 1.php-cgi进程数不够用.php执行时间长,导致没有空闲进程处理新请求. 2.php-cgi进程死掉.php-fpm超时时间短,当前进程执行超时关闭连接. ...

  7. 正则表达式分组()、不捕获(?:)和断言(?<=)详解

    分组 分组在正则中用()表示,根据小菜理解,分组的作用有两个: 1.将某些规律看成是一组,然后进行组级别的重复,可以得到意想不到的效果. 2.分组之后,可以通过后向引用简化表达式(\1 或者$1). ...

  8. Could not load file or assembly Microsoft.Web.Infrastructure

    Error info:Could not load file or assembly 'Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=n ...

  9. NopCommerce源码分析ContainerBuilder builder.Update(container)

    /// <summary> /// Register dependencies /// </summary> /// <param name="config&q ...

  10. 免费SSL证书Let’s Encrypt

    由于我们公司测试环境使用的这个.自己没有亲手搭建使用,但是知道有这个东西.以后使用的话自己直接搞起. 连接文档:http://www.5icool.org/a/201512/a15271.html   ...