【题目描述】

给定一棵树,要求维护以下操作:

1、M u 将u节点反色

2、Q u 查询u到所有黑色节点距离和

【输入格式】

第一行n,m 表示节点总数和操作次数

之后n-1行,每行u,v表示两个端点,w表示边权

之后m行,操作如题意

n,m<=200000,边权<=1000

一开始所有点均为白色

【输出格式】

输出每次Q的答案

【样例输入】

7 5

2 1 144

3 2 361

4 3 236

5 3 697

6 2 140

7 5 718

Q 4

M 4

Q 5

Q 1

Q 7

【样例输出】

0

933

741

1651

题解:

和上一题差不多,多了一个修改操作。

还是动态点分,每个节点储存两个数,分别表示整棵子树到根和到根节点的父节点的距离和。

容斥一下就好。

 //Never forget why you start
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#define inf (2147483647)
using namespace std;
int n,m,a[],lim;
struct node{
int next,to,dis;
}edge[];
int head[],size;
void putin(int from,int to,int dis){
size++;
edge[size].next=head[from];
edge[size].to=to;
edge[size].dis=dis;
head[from]=size;
}
int fa[][],dis[],depth[];
void dfs1(int r,int father){
int i;
fa[r][]=father;
depth[r]=depth[father]+;
for(i=head[r];i!=-;i=edge[i].next){
int y=edge[i].to;
if(y!=father){
dis[y]=dis[r]+edge[i].dis;
dfs1(y,r);
}
}
}
void make(){
lim=log(n)/log();
for(int i=;i<=lim;i++)
for(int j=;j<=n;j++)
fa[j][i]=fa[fa[j][i-]][i-];
}
int LCA(int x,int y){
if(depth[x]<depth[y])swap(x,y);
for(int i=lim;i>=;i--)
if(depth[fa[x][i]]>=depth[y])
x=fa[x][i];
if(x!=y){
for(int i=lim;i>=;i--)
if(fa[x][i]!=fa[y][i])
x=fa[x][i],y=fa[y][i];
x=fa[x][];
y=fa[y][];
}
return x;
}
int dist(int x,int y){
int lca=LCA(x,y);
return dis[x]+dis[y]-dis[lca]*;
}
int tot,root,vis[],d[],ff[],cnt[];
void getroot(int r,int father){
int i;
cnt[r]=;d[r]=;
for(i=head[r];i!=-;i=edge[i].next){
int y=edge[i].to;
if(y!=father&&!vis[y]){
getroot(y,r);
cnt[r]+=cnt[y];
d[r]=max(d[r],cnt[y]);
}
}
d[r]=max(d[r],tot-cnt[r]);
if(d[root]>d[r])root=r;
}
void buildtree(int r,int father){
int i,all=tot;
ff[r]=father;vis[r]=;
for(i=head[r];i!=-;i=edge[i].next){
int y=edge[i].to;
if(!vis[y]){
if(cnt[y]>cnt[r])cnt[y]=all-cnt[r];tot=cnt[y];
root=;getroot(y,r);buildtree(root,r);
}
}
}
int p[][];
void insert(int x,int v){
int i;
for(i=x;ff[i];i=ff[i]){
int len=dist(x,ff[i]);
p[i][]+=len*v;
p[ff[i]][]+=len*v;
}
for(i=x;i;i=ff[i])cnt[i]+=v;
}
int find(int x){
int i,ans=p[x][];
for(i=x;ff[i];i=ff[i]){
int len=dist(x,ff[i]);
ans+=p[ff[i]][];
ans-=p[i][];
ans+=(cnt[ff[i]]-cnt[i])*len;
}
return ans;
}
void clean(){
memset(head,-,sizeof(head));
size=;
}
int main(){
freopen("A_Tree.in","r",stdin);
freopen("A_Tree.out","w",stdout);
int i,j;
clean();
scanf("%d%d",&n,&m);
for(i=;i<n;i++){
int u,v,l;
scanf("%d%d%d",&u,&v,&l);
putin(u,v,l);
putin(v,u,l);
}
dfs1(,);make();
tot=n;root=;d[]=inf;
getroot(,);buildtree(root,);
for(i=;i<=n;i++)if(!ff[i]){root=i;break;}
char s[];
memset(cnt,,sizeof(cnt));
while(m--){
scanf("%s",s);
if(s[]=='Q'){
int x;
scanf("%d",&x);
printf("%d\n",find(x));
}
else{
int x;
scanf("%d",&x);
a[x]^=;
if(a[x])insert(x,);
else insert(x,-);
}
}
return ;
}

[HZOI 2015]树黑白的更多相关文章

  1. COGS 2280. [HZOI 2015]树白黑

    ★★   输入文件:B_Tree.in   输出文件:B_Tree.out   简单对比时间限制:2 s   内存限制:512 MB [题目描述] 给定一棵有根树,树根为1,一开始这棵树所有节点均为白 ...

  2. Bitset([HZOI 2015]偏序++)

    Bitset简介 下面介绍C++ STL 中一个非常有用的东西: Bitset 类似于二进制状压,它可以把信息转化成一个01串存储起来 定义方法: 首先要#include<bitset>或 ...

  3. cogs 2320. [HZOI 2015]聪聪的世界题解

    2320. [HZOI 2015]聪聪的世界 时间限制:6 s   内存限制:512 MB [题目描述] 背景: 聪聪的性取向有问题. 题目描述: 聪聪遇到了一个难题: 给出一个序列a1…an,完成以 ...

  4. BZOJ 2287. [HZOI 2015]疯狂的机器人 [FFT 组合计数]

    2287. [HZOI 2015]疯狂的机器人 题意:从原点出发,走n次,每次上下左右不动,只能在第一象限,最后回到原点方案数 这不煞笔提,组合数写出来发现卷积NTT,然后没考虑第一象限gg 其实就是 ...

  5. 【COGS】2287:[HZOI 2015]疯狂的机器人 FFT+卡特兰数+排列组合

    [题意][COGS 2287][HZOI 2015]疯狂的机器人 [算法]FFT+卡特兰数+排列组合 [题解]先考虑一维的情况,支持+1和-1,前缀和不能为负数,就是卡特兰数的形式. 设C(n)表示第 ...

  6. [cogs2314][HZOI 2015] Persistable Editor - 可持久化平衡树

    [cogs2314][HZOI 2015]Persistable Editor - 可持久化平衡树 题目链接 首先吐槽扯淡几句 [题目描述] 维护一种可持久化的文本编辑器,支持下列操作: 1 p st ...

  7. cogs 2123. [HZOI 2015] Glass Beads

    2123. [HZOI 2015] Glass Beads ★★★   输入文件:MinRepresentations.in   输出文件:MinRepresentations.out   简单对比时 ...

  8. COGS 2580. [HZOI 2015]偏序 II

    COGS 2580. [HZOI 2015]偏序 II 题目传送门 题目大意:给n个元素,每个元素有具有4个属性a,b,c,d,求i<j并且ai<aj,bi<bj,ci<cj, ...

  9. 【CJOJ2375】 【HZOI 2015】偏序 II(cdq分治,树状数组)

    传送门 CJOJ Solution 具体实现参考上一篇Blog(四维偏序) 代码实现1(cdq+cdq+cdq+BIT) /* mail: mleautomaton@foxmail.com autho ...

随机推荐

  1. PyCharm中的Console调整字体大小

    file-->settings-->Editor-->color Scheme-->Console Font -->  size  调整大小

  2. [SinGuLaRiTy] NOIP 膜你赛-Day 2

    [SinGuLaRiTy-1031] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 对于所有题目: Time Limit: 1s | Mem ...

  3. 【谁知道C#字段为什么用属性封装?】

    源地址:https://zhidao.baidu.com/question/1174413218458798139.html 我们知道,类成员包括变量和方法.如果希望其他类能够访问成员变量的值,就必须 ...

  4. Boost lockfree deque 生产者与消费者多对多线程应用

    boost库中有一个boost::lockfree::queue类型的 队列,对于一般的需要队列的程序,其效率都算不错的了,下面使用一个用例来说明. 程序是一个典型的生产者与消费者的关系,都可以使用多 ...

  5. JavaScript new Date()IE浏览器下出错 NaN

    当涉及到编程,与日期的工作可能是棘手的.然而,幸运的是,大多数语言都已经完成了这个困难的工作,并有一种内置的日期功能来帮助我们.JavaScript是具有有用的功能来帮助大量输出,设置日期. The ...

  6. kuangbin专题十六 KMP&&扩展KMP HDU2609 How many (最小字符串表示法)

    Give you n ( n < 10000) necklaces ,the length of necklace will not large than 100,tell me How man ...

  7. 河南省第十一届ACM程序设计竞赛 修路

    Problem C: 修路 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 63  Solved: 22[Submit][Status][Web Boar ...

  8. H5切换至后台页面

    先说重点,试了很多种方法,这个真实有效 var reLoadLeftTime = false ;//监听浏览器当前页面是否被激活的事件var hiddenProperty = 'hidden' in ...

  9. hdu2068 RPG的错排

    RPG的错排 时间限制:1000/1000 MS(Java / Others)内存限制:32768/32768 K(Java / Others)总提交内容:16421接受的提交内容:6670 问题描述 ...

  10. hive中解析json数组

    -- hive中解析json数组 select t1.status ,substr(ss.col,,) as col ,t3.evcId ,t3.evcLicense ,t3.evcAddress , ...