BZOJ3589动态树
**错误改了一上午。
先做熟练泼粪
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动态树的更多相关文章
- bzoj3589 动态树 求链并 容斥
bzoj3589 动态树 链接 bzoj 思路 求链并. 发现只有最多5条链子,可以容斥. 链交求法:链顶是两条链顶深度大的那个,链底是两个链底的\(lca\) 如果链底深度小于链顶,就说明两条链没有 ...
- [树链剖分]BZOJ3589动态树
题目描述 别忘了这是一棵动态树, 每时每刻都是动态的. 小明要求你在这棵树上维护两种事件 事件0: 这棵树长出了一些果子, 即某个子树中的每个节点都会长出K个果子. 事件1: 小明希望你求出几条树枝上 ...
- BZOJ3589 动态树(树链剖分+容斥原理)
显然容斥后转化为求树链的交.这个题非常良心的保证了查询的路径都是到祖先的,求交就很休闲了. #include<iostream> #include<cstdio> #inclu ...
- BZOJ3589 : 动态树
对于既要支持子树修改又要支持链查询, 需要树链剖分 然后求出DFS序,DFS的时候先DFS重儿子, 然后子树是1个区间,链是$O(\log n)$个区间 这道题对于查询若干条链的并: 由于K<= ...
- bzoj千题计划214:bzoj3589: 动态树
http://www.lydsy.com/JudgeOnline/problem.php?id=3589 树链剖分 用线段数维护扫描线的方式来写,标记只打不下传 #include<cstdio& ...
- BZOJ3589 动态树[树剖/暴力/容斥]
操作0,显然直接线段树解决. 操作1,瓶颈在于重叠的链只算一次.在线段树上来看,如果一个区间被覆盖了,那么只算这个区间,子树里面也就不管了. 考虑对节点打标记来表示是否覆盖.但是,如果统一打完之后,并 ...
- bzoj3589 动态树 树链剖分+容斥
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3589 题解 事件 \(0\) 不需要说,直接做就可以了. 事件 \(1\) 的话,考虑如果直接 ...
- 【BZOJ-3589】动态树 树链剖分 + 线段树 + 线段覆盖(特殊的技巧)
3589: 动态树 Time Limit: 30 Sec Memory Limit: 1024 MBSubmit: 405 Solved: 137[Submit][Status][Discuss] ...
- 【BZOJ3589】动态树 树链剖分+线段树
Description 别忘了这是一棵动态树, 每时每刻都是动态的. 小明要求你在这棵树上维护两种事件 事件0: 这棵树长出了一些果子, 即某个子树中的每个节点都会长出K个果子. 事件1: 小明希望你 ...
随机推荐
- 24、List三个子类的特点
List的三个子类的特点 因为三个类都实现了List接口,所以里面的方法都差不多,那这三个类都有什么特点呢? ArrayList:底层数据结构是数组,查询快,增删慢.线程不安全,效率高. Vector ...
- vi的复制粘贴命令 -- (转)
vi编辑器有3种模式:命令模式.输入模式.末行模式.掌握这三种模式十分重要: 1.命令模式:vi启动后默认进入的是命令模式,从这个模式使用命令可以切换到另外两种模式,同时无论在任何模式下只要按一下[E ...
- Inline函数使用注意事项
Inline函数使用注意事项 1.在一个文件中定义的inline函数不能再另一个文件中使用 2.inline函数应简洁,只有少数几个语句. 3.在inline函数中不能有循环,if,switch语句. ...
- gradle 构建工具,与Ant Maven关系
1 基本概念 gradle是一个基于Apache ant 和apache maven概念的项目自动化建构工具.它使用一种基于Groovy的特定领域语言来声明项目设置,而不是传统的xml.当前其支持 ...
- git summary
Git 使用经验 缘起 一直想写一篇博文,记录我在使用git时遇到的问题以及解决办法.由于项目忙,偶尔的记录不连续,不成系统.今天有时间记录下来,方便自己以后查看. git 简介及其优势 简单来说,g ...
- git忽略特殊文件或文件夹
1.在项目目录中添加“.gitignore”文件,项目目录就是你存放git工程的目录就是有“.git”目录的目录 vi .gitignore 2.在文件中添加如下内容,其中“/runtime/”是忽略 ...
- git —— 远程仓库(操作)
运行目录:本地仓库目录 1.本地关联远程仓库 $ git remote add origin 你的远程库地址(SSH和HTTP都可以) 2.远程仓库为空,可选择合并远程仓库和本地仓库,远程库不为空时, ...
- 洛谷P2680运输计划
传送门啦 要求的就是,把树上的一条边的权值设为0之后,所有路径中的最大值的最小值. 首先二分最大值,假设某次二分的最大值为x,我们首先找出所有大于x的路径(也就是我们需要通过改权缩短的路径),并把路径 ...
- opencv(1)图像处理
2.图像操作 图片裁剪 裁剪是利用array自身的下标截取实现 HSV空间 除了区域,图像本身的属性操作也非常多,比如可以通过HSV空间对色调和明暗进行调节.HSV空间是由美国的图形学专家A. R. ...
- Effective STL 学习笔记 Item 30: 保证目标区间足够大
Effective STL 学习笔记 Item 30: 保证目标区间足够大 */--> div.org-src-container { font-size: 85%; font-family: ...