题解:

lct+链上修改

每一次修改的时候记录lazy标记

如果有了乘法,加法的lazy标记也要相应的随之变化

代码:

#pragma GCC optimize(2)
#include<bits/stdc++.h>
const int M=,N=;
typedef unsigned ll;
using namespace std;
int read()
{
int x=;char ch=getchar();
for (;ch<''||ch>'';ch=getchar());
for (;ch>=''&&ch<='';ch=getchar())x=x*+ch-'';
return x;
}
int n,m,top,cnt,c[N][],fa[N],size[N],q[N],rev[N];
ll sum[N],val[N],at[N],mt[N];
void cal(int x,int m,int a)
{
if (!x)return;
val[x]=(val[x]*m+a)%M;
sum[x]=(sum[x]*m+a*size[x])%M;
at[x]=(at[x]*m+a)%M;
mt[x]=(mt[x]*m)%M;
}
int isroot(int x){return c[fa[x]][]!=x&&c[fa[x]][]!=x;}
void update(int x)
{
int l=c[x][],r=c[x][];
sum[x]=(sum[l]+sum[r]+val[x])%M;
size[x]=(size[l]+size[r]+)%M;
}
void pushdown(int x)
{
int l=c[x][],r=c[x][];
if (rev[x])
{
rev[x]^=;rev[l]^=;rev[r]^=;
swap(c[x][],c[x][]);
}
int m=mt[x],a=at[x];
mt[x]=;at[x]=;
if(m!=||a!=)cal(l,m,a),cal(r,m,a);
}
void rotate(int x)
{
int y=fa[x],z=fa[y],l,r;
l=(c[y][]==x);r=l^;
if (!isroot(y))c[z][c[z][]==y]=x;
fa[x]=z;fa[y]=x;fa[c[x][r]]=y;
c[y][l]=c[x][r];c[x][r]=y;
update(y);update(x);
}
void down(int x){if (!isroot(x))down(fa[x]);pushdown(x);}
void splay(int x)
{
down(x);
for (int y=fa[x];!isroot(x);rotate(x),y=fa[x])
if (!isroot(y))rotate((c[y][]==x)==(c[fa[y]][]==y)?y:x);
}
void access(int x)
{
for(int t=;x;t=x,x=fa[x])
{
splay(x);
c[x][]=t;
update(x);
}
}
void makeroot(int x){access(x);splay(x);rev[x]^=;}
void split(int x,int y){makeroot(y);access(x);splay(x);}
void link(int x,int y){makeroot(x);fa[x]=y;}
void cut(int x,int y){makeroot(x);access(y);splay(y);c[y][]=fa[x]=;}
int main()
{
n=read();m=read();
for (int i=;i<=n;i++)val[i]=sum[i]=mt[i]=size[i]=;
for (int i=;i<n;i++)
{
int u=read(),v=read();
link(u,v);
}
char ch[];
while(m--)
{
scanf("%s",ch);
int u=read(),v=read();
if (ch[]=='+')
{
int c=read();
split(u,v);cal(u,,c);
}
if (ch[]=='-')
{
cut(u,v);
u=read();v=read();link(u,v);
}
if (ch[]=='*')
{
int c=read();
split(u,v);cal(u,c,);
}
if (ch[]=='/')
{
split(u,v);
printf("%d\n",sum[u]);
}
}
return ;
}

bzoj2631的更多相关文章

  1. bzoj2631 3282

    这两题都是link cut tree的裸题之前看Qtree的论文,只会在确定父子关系的情况下连边和删边如果在任意两个点连边删边怎么做呢?这时候我们不能随意的将一个点的父节点设为另一个点,因为其中某个点 ...

  2. [bzoj2631]tree_LCT

    tree bzoj-2631 题目大意:给定一个n个点的树,每个点的初始权值为1,支持:删边加边(这两个操作同时进行,保证操作之后还是一棵树),路径加,路径乘,查询路径和. 注释:$1\le n,q\ ...

  3. bzoj2631: tree

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

  4. BZOJ2631——tree

    1.题目大意:bzoj1798的lct版本 2.分析:这个把线段树改成splay就好 #include <stack> #include <cstdio> #include & ...

  5. 【bzoj2631】tree link-cut-tree

    2016-06-01 08:50:36 题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2631 注意加和乘的标记下传问题. 还有就是split后 ...

  6. bzoj2631: tree lct

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

  7. LCT模板(BZOJ2631)

    用LCT实现路径加,路径乘,断开及加上一条边(保证是树),查询路径和. #include <cstdio> #include <algorithm> #define l(x) ...

  8. 【BZOJ2631】tree

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

  9. 【bzoj2631】tree LCT

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

随机推荐

  1. ASP.netMVC文件下载的几种方法

    第一种:最简单的超链接方法,标签的href直接指向目标文件地址,这样容易暴露地址造成盗链,这里就不说了 第二种:后台下载 在后台下载中又可以细分为几种下载方式 首先,在前台,我们需要一个标签 &quo ...

  2. linux 的nohup & 和daemon 总结(转)

    add by zhj:守护进程貌似跟nohup + &方式启动的进程差不多.都可以实现与终端的无关联.   原文:http://blog.csdn.net/lovemdx/article/de ...

  3. 8.Git撤销修改

    有一个文件内容如下: $ cat README.md the first ... the second ... the third ... - 文件自修改后还没有被放到暂存区,现在,撤销修改就回到和版 ...

  4. mysql 数据操作 单表查询 where 约束 目录

    mysql 数据操作 单表查询 where约束 between and or mysql 数据操作 单表查询 where约束 is null in mysql 数据操作 单表查询 where约束 li ...

  5. mysql 数据操作 多表查询 准备

    为什么需要多表查询: 因为我们不可能把所有数据都放在一张表里 我们把不同数据存储 放在一张一张不同表 方便管理,但我们为了方便管理,把数据拆分到一张一张表去存储. 但是数据还是一个整体,数据之间是有关 ...

  6. Spark的Java API例子详解

    package com.hand.study; import scala.Tuple2; import org.apache.spark.SparkConf; import org.apache.sp ...

  7. CentOS 7 集群使用NTP进行时间同步

    NTP时钟同步方式说明NTP在linux下有两种时钟同步方式,分别为直接同步和平滑同步: 直接同步 使用ntpdate命令进行同步,直接进行时间变更.如果服务器上存在一个12点运行的任务,当前服务器时 ...

  8. java之简单工厂

    1.使用步骤 创建抽象/接口产品类,定义具体产品的公共接口方法:(产品接口类) 创建具体产品类,是继承抽象产品类的:(产品接口实现类) 创建工厂类,通过创建静态方法根据传入不同参数从而创建不同具体产品 ...

  9. SecureCRT 下载,安装,绝佳配色,实用配置,上传下载配置合集

    SecureCRT 下载,安装,绝佳配色,实用配置,上传下载配置合集 chocoball 发布于 2年前,共有 3 条评论 SecureCRT 是一款支持 SSH2.SSH1.Telnet.Telne ...

  10. hdu 5111 树链剖分加函数式线段树

    这题说的是给了两棵树,各有100000 个节点,然后Q个操作Q<=50000; 每个操作L1 R1 L2 R2.因为对于每棵树都有一个与本棵树其他点与众不同的值, 最后问 在树上从L1到R1这条 ...