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: 小明希望你 ...
随机推荐
- mvn打war包以及解压包的方法
有时候我们需要查看打成war包之后的目录,如果是maven项目我们可以直接用maven打包. 1.maven打包: 第一种: mvn package 如果不行先 mvn clean一下 第二种:(掌握 ...
- 83.Linux之ubuntu-14.04.4-desktop-amd64安装
QQ(1044233591) 一.软件下载 二.安装 1.上一节已经安装好了VMware10.0.4软件,双击桌面VMware Workstation软件图标,出现VMware软件界面,点击" ...
- 查看gcc的默认宏定义命令【转】
转自:http://blog.csdn.net/cywosp/article/details/10730931 有些时候我们在编写代码或者阅读开源项目时经常会遇到一些陌生的宏定义,在找遍所有源代码都没 ...
- mysql只读模式的设置方法与实验【转】
在MySQL数据库中,在进行数据迁移和从库只读状态设置时,都会涉及到只读状态和Master-slave的设置和关系. 经过实际测试,对于MySQL单实例数据库和master库,如果需要设置为只读状态, ...
- 使用Python扫描网络MAC地址对应的IP地址
#!/usr/bin/env python # -*- coding: utf-8 -*- from scapy.all import srp,Ether,ARP,conf ipscan='192.1 ...
- React-Native 之 环境配置和简单使用
# 前言 学习本系列内容需要具备一定 HTML 开发基础,没有基础的朋友可以先转至 HTML快速入门(一) 学习 本人接触 React Native 时间并不是特别长,所以对其中的内容和性质了解可能会 ...
- 常见四大类型视频接线DP、HDMI、DVI、VGA的比较
如今是新的“视”界,生活中总与各种屏幕打交道,难免会遇到选择视频接线的问题,要想搞清楚这点,我们只要通过了解现今常用的几种视频接线就会有个大致的认识. 281VGA.DVI.HDMI三种视频信号接 ...
- 关于move
procedure TForm4.Button1Click(Sender: TObject); var //动态数组 bytes1,bytes2: TBytes; //静态数组 bytes3,byte ...
- numpy数学计算
1.求范数 np.linalg.norm norm(x, ord=None, axis=None, keepdims=False) 范数理论的一个小推论告诉我们:ℓ1≥ℓ2≥ℓ∞
- (二)Mybatis项目配置
第一节:environments Mybatis支持多个环境,可以任意配置 <environments default="development"> <envir ...