[Codechef - ADITREE] Adi and the Tree - 树链剖分,线段树
[Codechef - ADITREE] Adi and the Tree
Description
树上每个节点有一个灯泡,开始所有灯泡都是熄灭的。每次操作给定两个数 \(a,b\) ,将 \(a,b\) 这两个节点的灯的状态改变。定义某个状态的权值为,将树上所有亮点两两配对,每个对的权值的总和最小值。其中一个配对的权值定义为这两个点之间的距离。求出每次操作后的权值。
Solution
很容易发现如果我们将每个亮点到树根的路径染色,那么染色次数为奇数的路径就会被统计入答案。
所以只需要维护布尔值就可以,这样每次操作就转化为对点到根的路径异或,询问就是整棵树的权和。树链剖分一下就可以。
#include <bits/stdc++.h>
using namespace std;
const int N = 1000005;
namespace seg
{
int val[N],tag[N];
void pushup(int p)
{
val[p]=val[p*2]+val[p*2+1];
}
void pushdown(int p,int l,int r)
{
if(tag[p])
{
tag[p*2]^=1;
tag[p*2+1]^=1;
val[p*2]=((l+r)/2-l+1)-val[p*2];
val[p*2+1]=(r-(l+r)/2)-val[p*2+1];
tag[p]^=1;
}
}
void modify(int p,int l,int r,int ql,int qr)
{
if(l>qr || r<ql)
return ;
if(l>=ql && r<=qr)
{
val[p]=(r-l+1)-val[p];
tag[p]^=1;
}
else
{
pushdown(p,l,r);
modify(p*2,l,(l+r)/2,ql,qr);
modify(p*2+1,(l+r)/2+1,r,ql,qr);
pushup(p);
}
}
int query()
{
return val[1];
}
} // seg
namespace tree
{
vector <int> g[N];
int n,top[N],wson[N],siz[N],dep[N],vis[N],tid[N],did[N],fa[N],cnt=0;
void link(int p,int q)
{
g[p].push_back(q);
g[q].push_back(p);
}
void dfs1(int p)
{
vis[p]=siz[p]=1;
for(int i=0; i<g[p].size(); i++)
{
if(vis[g[p][i]]==0)
{
dep[g[p][i]]=dep[p]+1;
fa[g[p][i]]=p;
dfs1(g[p][i]);
siz[p]+=siz[g[p][i]];
if(wson[p]==0 || siz[g[p][i]]>siz[wson[p]])
wson[p]=g[p][i];
}
}
}
void dfs2(int p)
{
vis[p]=1;
did[p]=++cnt;
tid[cnt]=p;
if(wson[p])
{
top[wson[p]]=top[p];
dfs2(wson[p]);
}
for(int i=0; i<g[p].size(); i++)
{
if(vis[g[p][i]]==0)
{
top[g[p][i]]=g[p][i];
dfs2(g[p][i]);
}
}
}
void presolve()
{
dep[1]=1;
dfs1(1);
memset(vis,0,sizeof vis);
top[1]=1;
dfs2(1);
}
void link_modify(int p,int q)
{
while(top[p]-top[q])
{
if(dep[top[p]]>dep[top[q]])
swap(p,q);
seg::modify(1,1,n,did[top[q]],did[q]);
q=fa[top[q]];
}
if(dep[p]>dep[q])
swap(p,q);
seg::modify(1,1,n,did[p],did[q]);
}
}
int n,m,t1,t2,t3;
int main()
{
scanf("%d",&n);
for(int i=1; i<n; i++)
{
scanf("%d%d",&t1,&t2);
tree::link(t1,t2);
}
tree::n=n;
tree::presolve();
scanf("%d",&m);
for(int i=1; i<=m; i++)
{
scanf("%d%d",&t1,&t2);
tree::link_modify(1,t1);
tree::link_modify(1,t2);
printf("%d\n",seg::query());
}
}
[Codechef - ADITREE] Adi and the Tree - 树链剖分,线段树的更多相关文章
- Aizu 2450 Do use segment tree 树链剖分+线段树
Do use segment tree Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.bnuoj.com/v3/problem_show ...
- 【POJ3237】Tree(树链剖分+线段树)
Description You are given a tree with N nodes. The tree’s nodes are numbered 1 through N and its edg ...
- POJ3237 Tree 树链剖分 线段树
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - POJ3237 题意概括 Description 给你由N个结点组成的树.树的节点被编号为1到N,边被编号为1 ...
- 【CF725G】Messages on a Tree 树链剖分+线段树
[CF725G]Messages on a Tree 题意:给你一棵n+1个节点的树,0号节点是树根,在编号为1到n的节点上各有一只跳蚤,0号节点是跳蚤国王.现在一些跳蚤要给跳蚤国王发信息.具体的信息 ...
- Spoj Query on a tree SPOJ - QTREE(树链剖分+线段树)
You are given a tree (an acyclic undirected connected graph) with N nodes, and edges numbered 1, 2, ...
- Water Tree CodeForces 343D 树链剖分+线段树
Water Tree CodeForces 343D 树链剖分+线段树 题意 给定一棵n个n-1条边的树,起初所有节点权值为0. 然后m个操作, 1 x:把x为根的子树的点的权值修改为1: 2 x:把 ...
- 【BZOJ-2325】道馆之战 树链剖分 + 线段树
2325: [ZJOI2011]道馆之战 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 1153 Solved: 421[Submit][Statu ...
- POJ3237 (树链剖分+线段树)
Problem Tree (POJ3237) 题目大意 给定一颗树,有边权. 要求支持三种操作: 操作一:更改某条边的权值. 操作二:将某条路径上的边权取反. 操作三:询问某条路径上的最大权值. 解题 ...
- B20J_3231_[SDOI2014]旅行_树链剖分+线段树
B20J_3231_[SDOI2014]旅行_树链剖分+线段树 题意: S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,城市信仰不同的宗教,为了方便,我们用不同的正整数代表各种宗教. S国 ...
- BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 )
BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 ) 题意分析 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 ...
随机推荐
- 安卓自定义View实例-----跟随手指移动的鸟
今天学习了一些安卓开发中的自定义布局,编写了简单一个实例,“跟随手指移动的鸟”,需要两张图片,背景图片和鸟的图片,鸟的图片可以在屏幕中跟随手指的移动而移动. 1.将两张图片导入到mipmap中: 2. ...
- windows的系统变量
在Windows cmd小黑框里输入set命令,可以查看现有的系统变量 “="前的部分就是变量名. %USERPROFILE% =C:\Users\用户名 %SystemRoot% =C:\ ...
- final 和 static之间的区别和联系
关键字final和关键字static两者的含义并不相似,但是笔者常常使用一段时间后就会忘记它们之间的区别,因为它俩总是相伴着出现.当只出现其中一个时,就对其代表的含义不甚清晰了.故而特地将相关知识点记 ...
- 【Debian学徒记事】Debian快速呼出Terminal终端
Debian快速呼出Terminal终端 书接上回,Debian已经安装完毕 失踪的Ctrl+Alt+T 安装完毕启动,我发现了剑很诡异的事,Ctrl+Alt+T居然失灵了 (在多次测试后发现,Deb ...
- javaweb利用javabean将数据库中内容遍历在页面输出
效果如下图 它所实现的就是把数据库中一个表中所有的数据一条一条以表格的形式输出在网页上, 实现方法如下 首先我们要从数据库读取数据,这里要借助javabean来方便我们传递数据 以上面的为例,我要输出 ...
- 数据库中间件DBLE学习(一) 基础介绍和快速搭建
dble基本架构简介 dble是上海爱可生信息技术股份有限公司基于mysql的高可用扩展性的分布式中间件.江湖人送外号MyCat Plus.开源地址 我们首先来看架构图,外部应用通过NIO/AIO进行 ...
- 深入理解Java内存模型中的虚拟机栈
深入理解Java内存模型中的虚拟机栈 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这些区域都会有各自的用途,以及创建和销毁的时间,有的区域会随着虚拟机进程的启 ...
- 数据库中的sql语句总结
初识SQL 1. 什么是SQL:结构化查询语言(Structured Query Language). 2. SQL的作用:客户端使用SQL来操作服务器. > 启动mysql.exe,连 ...
- 统一操作系统 UOS 回应质疑 (独立思考)
统一操作系统 UOS 回应质疑 自从统一操作系统UOS正式版面向合作伙伴发布之后,小编就关注到网上对统一操作系统UOS众说纷纭.留意了近期网友们发表的评论: “又多了一个骗钱的国产操作系统” “从UO ...
- HDU - 1159 Common Subsequence (最长公共子序列)
A subsequence of a given sequence is the given sequence with some elements (possible none) left out. ...