[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 :把某个节点 ...
随机推荐
- PHP0005:PHP基础--函数
- C# WPF发票打印
微信公众号:Dotnet9,网站:Dotnet9.问题或建议,请网站留言: 如果您觉得Dotnet9对您有帮助,欢迎赞赏 C# WPF发票打印 内容目录 实现效果 业务场景 编码实现 本文参考 源码下 ...
- Android数据存储之共享参数SharedPreferences
SharedPreferences是Android的一个轻量级存储工具,采用的存储结构是Key-Value的键值对方式,类似于Java的Properties类,二者都是把Key-Value的键值对保存 ...
- tensor数据基操----索引与切片
玩过深度学习图像处理的都知道,对于一张分辨率超大的图片,我们往往不会采取直接压平读入的方式喂入神经网络,而是将它切成一小块一小块的去读,这样的好处就是可以加快读取速度并且减少内存的占用.就拿医学图像处 ...
- Microsoft visual studio 2015已停止工作最全解决办法
1.重装系统,不到万不得已不要选择...麻烦. 2.使用管理员权限运行VS,部分可能有效. 3.卸载重新安装vs,如果是一些配置问题或许能解决,还有要是卸载的干净可能有效. 4.据说可能是插件有问题造 ...
- 牛客寒假训练营2-H施魔法
思路 dp去维护前缀f[i-1] - ai的最小值 CODE #include <bits/stdc++.h> #define dbg(x) cout << #x <&l ...
- PAT (Basic Level) Practice (中文)1033 旧键盘打字 (20 分)
旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现.现在给出应该输入的一段文字.以及坏掉的那些键,打出的结果文字会是怎样? 输入格式: 输入在 2 行中分别给出坏掉的那些键.以及应该输入 ...
- 今天才知道a标签的href="#"是回到页面顶部
如题,真的是,做了一年多的开发,今天才知道a标签的href="#"是回到顶部.以前一直以为这是个多么了不起的功能. 顺便扩展一下滑动隐藏和显示按钮(从别处拷贝来的代码) $( do ...
- python3练习100题——038
原题链接:http://www.runoob.com/python/python-exercise-example38.html 题目:求一个3*3矩阵主对角线元素之和. 程序分析:利用双重for循环 ...
- 爬格子呀--IEEE极限编程大赛留念
10.14,坐标:电子科技大学 24h,不间断的编程,感觉还是很爽的. 排名一般,但是这是开始,未来还很远. 题目举例1: 广袤的非洲大草原上,狮子居住在一个个的网格里,他们的势力范围会以曼哈顿路程的 ...