[luogu3359]改造异或树
[luogu3359]改造异或树
luogu
和之前某道题类似只有删边的话考虑倒着加边
但是怎么统计答案呢?
我们考虑以任意点为根dfs一遍求出每个点到根的路径异或和s[i]
这样任意两点x,y的路径异或和可以表示成s[x] xor s[y]
那么设当前连的边的边权为w,我们要找出被连通的两个连通块中s[x] xor s[y]=w的(x,y)个数
考虑启发式合并,枚举size小的一边,另一边在map上查,然后把size小的map并到大的中去
#define ll long long
#include<bits/stdc++.h>
using namespace std;
const int _=1e5+5;
int re(){
int x=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*w;
}
int n,cnt;
ll sum,ans[_];
map<int,ll>M[_];
map<int,ll>::iterator it;
int h[_],s[_],fa[_],a[_],b[_],c[_],p[_];
struct edge{int to,next,w;}e[_<<1];
int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
void link(int u,int v,int w){
e[++cnt]=(edge){v,h[u],w};h[u]=cnt;
e[++cnt]=(edge){u,h[v],w};h[v]=cnt;
}
void dfs(int u,int fa){
for(int i=h[u];i;i=e[i].next){
int v=e[i].to;
if(v==fa)continue;
s[v]=s[u]^e[i].w;
dfs(v,u);
}
}
int main(){
n=re();
for(int i=1;i<n;i++){
a[i]=re(),b[i]=re(),c[i]=re();
link(a[i],b[i],c[i]);
}
for(int i=1;i<n;i++)
p[i]=re();
dfs(1,0);
for(int i=1;i<=n;i++)fa[i]=i,M[i][s[i]]=1;
for(int i=n-1;i>=1;i--){
int x=find(a[p[i]]),y=find(b[p[i]]);
if(M[x].size()<M[y].size())swap(x,y);
fa[y]=x;
for(it=M[y].begin();it!=M[y].end();++it)
sum+=1ll*M[x][(*it).first]*(*it).second;
for(it=M[y].begin();it!=M[y].end();++it)
M[x][(*it).first]+=(*it).second;
ans[i]=sum;
}
for(int i=1;i<=n;i++)printf("%lld\n",ans[i]);
return 0;
}
[luogu3359]改造异或树的更多相关文章
- 洛谷 P3359 改造异或树
题目描述 给定一棵n 个点的树,每条边上都有一个权值.现在按顺序删掉所有的n-1条边,每删掉一条边询问当前有多少条路径满足路径上所有边权值异或和为0. 输入输出格式 输入格式: 第一行一个整数n. 接 ...
- luoguP3359 改造异或树 线段树合并
删边转化为加边 然后每次用线段树合并就行..... 确确实实很简单 然而为什么线段树合并跑不过$splay$的启发式合并,常数稍大了点... 复杂度$O(n \log n)$ #include < ...
- luoguP3359 改造异或树
https://www.luogu.org/problemnew/show/P3359 因为 a ^ b ^ b = a,所以我们预处理 1 到所有点的距离,将删边的操作反过来变成加边,对于每一个联通 ...
- HDU 4825 Trie树 异或树!
Xor Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others)Total S ...
- BZOJ 4017 小 Q 的无敌异或 ( 树状数组、区间异或和、区间异或和之和、按位计贡献思想 )
题目链接 题意 : 中文题 分析 : 首先引入两篇写的很好的题解 题解一.题解二 听说这种和异或相关区间求和的问题都尽量按位考虑 首先第一问.按二进制位计贡献的话.那么对于第 k 位而言 其贡献 = ...
- HUST——1106xor的难题之二(异或树状数组单点修改和区间查询)
1106: xor的难题之二 时间限制: 2 Sec 内存限制: 128 MB 提交: 8 解决: 3 题目描述 上次Alex学长的问题xor难题很简单吧,现在hkhv学长有个问题想问你们. 他现 ...
- BootStrap-DualListBox怎样改造成为双树
BootStrap-DualListBox能够实现将所选择的列表项显示到右边,未选的列表项显示到左边. 但是左右两边的下拉框中都是单级列表.如果要实现将两边都是树(缩进树),选择某个节点时,其子节点也 ...
- 线段树+RMQ问题第二弹
线段树+RMQ问题第二弹 上篇文章讲到了基于Sparse Table 解决 RMQ 问题,不知道大家还有没有印象,今天我们会从线段树的方法对 RMQ 问题再一次讨论. 正式介绍今天解决 RMQ 问题的 ...
- Mysql索引数据结构为什么是B+树?
目录 Mysql索引数据结构 二叉树 红黑树 B-Tree B+Tree Mysql索引数据结构 下面列举了常见的数据结构 二叉树 红黑树 Hash表 B-Tree(B树) Select * from ...
随机推荐
- ECSHOP去版权(删除ECSHOP所有标识)
前台部分: 1:去掉头部TITLE部分的ECSHOP演示站 Powered by ecshop前者”ECSHOP演示站”在后台商店设置 – 商店标题修改后者” Powered by ecshop”打开 ...
- Node.js 把图片流送到客户端
效果: 代码: var http=require('http'); var fs=require('fs'); var path=require('path'); var mime=require(' ...
- git学习——记录每次更新到仓库
记录每次更新到仓库 工作目录下面的所有文件都不外乎这两种状态:已跟踪或未跟踪.已跟踪的文件是指本来就被纳入版本控制管理的文件,在上次快照中有它们的记录,工作一段时间后,它们的状态可能是未更新,已修改或 ...
- IOS压缩解压缩
#import <zlib.h> 压缩 -(NSData *)compressData:(NSData *)uncompressedData { if ([uncompressedData ...
- ubuntu安装rpm格式软件包
转载自:http://os.51cto.com/art/200708/53942.htm ubuntu的软件包格式是deb,如果要安装rpm的包,则要先用alien把rpm转换成deb.用alien转 ...
- ListView知识点汇总(9.2)
1 最为基础的listview: http://www.cnblogs.com/allin/archive/2010/05/11/1732200.html http://blog.csdn.net/h ...
- Hibernate学习之单向一对多映射
© 版权声明:本文为博主原创文章,转载请注明出处 说明:该实例是通过映射文件和注解两种方式实现的.可根据自己的需要选择合适的方式 实例: 1.项目结构 2.pom.xml <project xm ...
- 炒美股史考特(Scottrade)开户准备及如何获取免费交易(最新2017版)
最新美股史考特(Scottrade)开户及汇款攻略 (2017 年 6 月) 一 前言 二 开户流程 三 激活账户 四 转账汇款 五 小结 一 前言:为什么选择史考特(Scottrade ...
- angularjs2中的非父子组件的通信
AngualrJs2官方方法是以@Input,@Output来实现组件间的相互传值,而且组件之间必须父子关系,下面给大家提供一个简单的方法,实现组件间的传值,不仅仅是父子组件,跨模块的组件也可以实现传 ...
- 给jquery easy-ui 添加右键菜单
版权声明:转自为EasyUI 的Tab 标签添加右键菜单