**错误改了一上午。

先做熟练泼粪

k<=5,因此我们可以模拟这个过程,在线段树上把标记建出来然后pushup时候更新就好了。

By:大奕哥

 #include<bits/stdc++.h>
using namespace std;
const int N=;
struct tree{
int l,lz,ll;long long s,ret;
}t[N<<];
int head[N],cnt,n,id,bel[N],pos[N],size[N],d[N],f[N],son[N],ed[N];
struct node{
int to,nex;
}e[N<<];
void add(int x,int y)
{
e[++cnt].to=y;e[cnt].nex=head[x];head[x]=cnt;
}
void dfs(int x)
{
size[x]=;
for(int i=head[x];i;i=e[i].nex)
{
int y=e[i].to;
if(y==f[x])continue;
d[y]=d[x]+;f[y]=x;
dfs(y);
if(size[y]>size[son[x]])son[x]=y;
size[x]+=size[y];
}
return;
}
void dfs2(int x,int chain)
{
pos[x]=++id;bel[x]=chain;
if(son[x])dfs2(son[x],chain);
for(int i=head[x];i;i=e[i].nex)
{
int y=e[i].to;
if(y==f[x]||y==son[x])continue;
dfs2(y,y);
}
ed[x]=id;
return;
}
void update(int x,int z)
{
t[x].lz+=z;
t[x].s+=z*t[x].l;
}
void update2(int x,int z)
{
t[x].ll=z;
t[x].ret=t[x].s*z;
}
void pushdown(int x)
{
if(t[x].lz)
{
update(x<<,t[x].lz);
update(x<<|,t[x].lz);
t[x].lz=;
}
if(t[x].ll!=-)
{
update2(x<<,t[x].ll);
update2(x<<|,t[x].ll);
t[x].ll=-;
}
return;
}
void pushup(int x)
{
t[x].s=t[x<<].s+t[x<<|].s;
t[x].ret=t[x<<].ret+t[x<<|].ret;
}
void build(int x,int l,int r)
{
t[x].ll=-;
if(l==r){
t[x].l=;return;
}
int mid=l+r>>;
t[x].l=r-l+;
build(x<<,l,mid);build(x<<|,mid+,r);
}
void paint(int x,int l,int r,int L,int R,int w)
{
if(t[x].ll==w)return;
if(l==L&&r==R){
update2(x,w);
return;
}
pushdown(x);
int mid=l+r>>;
if(mid<L)paint(x<<|,mid+,r,L,R,w);
else if(mid>=R)paint(x<<,l,mid,L,R,w);
else paint(x<<,l,mid,L,mid,w),paint(x<<|,mid+,r,mid+,R,w);
pushup(x);
return;
}
void change(int x,int l,int r,int L,int R,int c)
{
if(l==L&&r==R)
{
update(x,c);
return;
}
pushdown(x);
int mid=l+r>>;
if(mid<L)change(x<<|,mid+,r,L,R,c);
else if(mid>=R)change(x<<,l,mid,L,R,c);
else change(x<<,l,mid,L,mid,c),change(x<<|,mid+,r,mid+,R,c);
pushup(x);
}
void color(int x,int y,int c)
{
while(bel[x]!=bel[y])
{
if(d[bel[x]]<d[bel[y]])swap(x,y);
paint(,,n,pos[bel[x]],pos[x],c);
x=f[bel[x]];
}
if(d[x]<d[y])swap(x,y);
paint(,,n,pos[y],pos[x],c);
return;
}
int main()
{
int x,y,q,ff,k;
scanf("%d",&n);
for(int i=;i<n;++i)
{
scanf("%d%d",&x,&y);
add(x,y);add(y,x);
}
dfs();dfs2(,);
build(,,n);
scanf("%d",&q);
for(int i=;i<=q;++i)
{
scanf("%d",&ff);
if(ff==)
{
scanf("%d%d",&x,&y);
change(,,n,pos[x],ed[x],y);
}
else{
scanf("%d",&k);
for(int j=;j<=k;++j)
{
scanf("%d%d",&x,&y);
color(x,y,);
}
printf("%d\n",t[].ret&((1ll<<)-));
update2(,);
}
}
return ;
}

BZOJ3589动态树的更多相关文章

  1. bzoj3589 动态树 求链并 容斥

    bzoj3589 动态树 链接 bzoj 思路 求链并. 发现只有最多5条链子,可以容斥. 链交求法:链顶是两条链顶深度大的那个,链底是两个链底的\(lca\) 如果链底深度小于链顶,就说明两条链没有 ...

  2. [树链剖分]BZOJ3589动态树

    题目描述 别忘了这是一棵动态树, 每时每刻都是动态的. 小明要求你在这棵树上维护两种事件 事件0: 这棵树长出了一些果子, 即某个子树中的每个节点都会长出K个果子. 事件1: 小明希望你求出几条树枝上 ...

  3. BZOJ3589 动态树(树链剖分+容斥原理)

    显然容斥后转化为求树链的交.这个题非常良心的保证了查询的路径都是到祖先的,求交就很休闲了. #include<iostream> #include<cstdio> #inclu ...

  4. BZOJ3589 : 动态树

    对于既要支持子树修改又要支持链查询, 需要树链剖分 然后求出DFS序,DFS的时候先DFS重儿子, 然后子树是1个区间,链是$O(\log n)$个区间 这道题对于查询若干条链的并: 由于K<= ...

  5. bzoj千题计划214:bzoj3589: 动态树

    http://www.lydsy.com/JudgeOnline/problem.php?id=3589 树链剖分 用线段数维护扫描线的方式来写,标记只打不下传 #include<cstdio& ...

  6. BZOJ3589 动态树[树剖/暴力/容斥]

    操作0,显然直接线段树解决. 操作1,瓶颈在于重叠的链只算一次.在线段树上来看,如果一个区间被覆盖了,那么只算这个区间,子树里面也就不管了. 考虑对节点打标记来表示是否覆盖.但是,如果统一打完之后,并 ...

  7. bzoj3589 动态树 树链剖分+容斥

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3589 题解 事件 \(0\) 不需要说,直接做就可以了. 事件 \(1\) 的话,考虑如果直接 ...

  8. 【BZOJ-3589】动态树 树链剖分 + 线段树 + 线段覆盖(特殊的技巧)

    3589: 动态树 Time Limit: 30 Sec  Memory Limit: 1024 MBSubmit: 405  Solved: 137[Submit][Status][Discuss] ...

  9. 【BZOJ3589】动态树 树链剖分+线段树

    Description 别忘了这是一棵动态树, 每时每刻都是动态的. 小明要求你在这棵树上维护两种事件 事件0: 这棵树长出了一些果子, 即某个子树中的每个节点都会长出K个果子. 事件1: 小明希望你 ...

随机推荐

  1. 【译】第四篇 Replication:事务复制-订阅服务器

    本篇文章是SQL Server Replication系列的第四篇,详细内容请参考原文. 订阅服务器就是复制发布项目的所有变更将传送到的服务器.每一个发布需要至少一个订阅,但是一个发布可以有多个订阅. ...

  2. 差分约束系统+spfa(B - World Exhibition HDU - 3592 )

    题目链接:https://cn.vjudge.net/contest/276233#problem/B 思路和上一个一样,不过注意点有两个,第一,对dis数组进行初始化的时候,应该初始化成ox3f3f ...

  3. UNIX环境高级编程 第5章 标准I/O库

    本章是关于C语言标准I/O库的,之所以在UNIX类系统的编程中会介绍C语言标准库,主要是因为UNIX和C之间具有密不可分的关系.由于UNIX系统存在很多实现,而每个实现都有自己的标准I/O库,为了统一 ...

  4. App测试需注意

    APP测试的时候,建议让开发打好包APK和IPA安装包,测试人员自己安装应用,进行测试.在测试过程中需要注意的测试点如下: 1安装和卸载 ●应用是否可以在iOS不同系统版本或Android不同系统版本 ...

  5. webpack4.5.0+vue2.5.16+vue-loader 实战组件化开发案例以及版本问题中踩的一些大坑!!!

    一 vue-loader 我们先不管脚手架,只说vue-loader,简单讲就是可将.vue文件打包,实现组件化开发,即一个.vue文件就是一个组件,开发中只需要引入这个.vue组件就可以了! 然后. ...

  6. C++ 和 MFC的学习

    1. 在Windows应用程序设计中,既可以使用个C的基本数据类型,也可以使用Windows自定义的数据类型.但要注意,凡是Windows自定义的关键字都要大写. 2. 什么是句柄? 在Windows ...

  7. jmert jdbc request支持执行多条sql语句并设置jdbc字符集

    1.jdbc request支持执行多条sql语句 在JDBC Connection Configuration中的sql连接字串中添加如下内容 allowMultiQueries=true 如下图: ...

  8. SQL SERVER 触发器介绍

    什么是触发器 触发器对表进行插入.更新.删除的时候会自动执行的特殊存储过程.触发器一般用在check约束更加复杂的约束上面.触发器和普通的存储过程的区别是:触发器是当对某一个表进行操作.诸如:upda ...

  9. Executor

    一.为什么需要Executor?为了更好的控制多线程,JDK提供了一套线程框架Executor,帮助开发人员有效的进行线程控制.他们都在java.util.concurrent包中,是JDK并发包的核 ...

  10. HBase混布MapReduce集群学习记录

    一.准备工作 1.1 部署环境 集群规模大概260多台,TSC10机型,机型参数如下: > 1个8核CPU(E5-2620v4) > 64G内存 > HBA,12*4T SATA,1 ...