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: 小明希望你 ...
随机推荐
- Java并发编程(2) AbstractQueuedSynchronizer的设计与实现
一 前言 上一篇分析AQS的内部结构,其中有介绍AQS是什么,以及它的内部结构的组成,那么今天就来分析下前面说的内部结构在AQS中的具体作用(主要在具体实现中体现). 二 AQS的接口和简单示例 上篇 ...
- 【黑客免杀攻防】读书笔记18-最终章Anti Rootkit
1.免杀技巧的遏制 1.1.PE文件 入口点不在第一个区段或在最后一个区段 入口点处代码附近只有一小段代码 入口点在正常范围之外 入口点为一个无效的值,实际入口点为TLS的入口点 区段名重复或者不属于 ...
- mysql基准测试工具tpcc-mysql安装、使用、结果解读
TPCC是专门针对联机交易处理系统(OLTP系统)的规范,一般情况下我们也把这类系统称为业务处理系统,tpcc-mysql是percona基于TPC-C(下面简写成TPCC)衍生出来的产品,专用于My ...
- APUE-文件和目录(二)函数access,mask,chmod和粘着位
4.7 函数access和faccessat 当一个进程使用了设置用户ID和设置组ID作为另一个用户(或者组)运行时,这时候有效用户(组)ID和实际用户(组)ID不一样,但进程仍然希望测试实际用户(组 ...
- 一、springcloud服务注册、发现、调用(consul/eureka)
1.Spring Cloud简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全 ...
- python网络编程-多进程multiprocessing
一:mutilprocess简介 多线程类似于同时执行多个不同程序,多线程运行有如下优点: 使用线程可以把占据长时间的程序中的任务放到后台去处理. 用户界面可以更加吸引人,这样比如用户点击了一个按钮去 ...
- python网络编程-socket“粘包”(小数据发送问题)
一:什么是粘包 “粘包”, 即服务器端你调用时send 2次,但你send调用时,数据其实并没有立刻被发送给客户端,而是放到了系统的socket发送缓冲区里,等缓冲区满了.或者数据等待超时了,数据才会 ...
- JS可以监控手机的返回键吗?
html5的话 一进页面就pushState,然后监控onpopstate不过好像没有办法知道是前进还是后退我的奇淫巧计是,一个数字变量,pushState一个锚,锚是这个数字,前进一个页面数字+1, ...
- C# LINQ语句
1.select 和 selectMany SelectMany() 将中间数组序列串联为一个最终结果值,其中包含每个中间数组中的每个值 2.join语句 from x in xx join d in ...
- Tomcat 上传war包后 会自动部署