[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]改造异或树的更多相关文章

  1. 洛谷 P3359 改造异或树

    题目描述 给定一棵n 个点的树,每条边上都有一个权值.现在按顺序删掉所有的n-1条边,每删掉一条边询问当前有多少条路径满足路径上所有边权值异或和为0. 输入输出格式 输入格式: 第一行一个整数n. 接 ...

  2. luoguP3359 改造异或树 线段树合并

    删边转化为加边 然后每次用线段树合并就行..... 确确实实很简单 然而为什么线段树合并跑不过$splay$的启发式合并,常数稍大了点... 复杂度$O(n \log n)$ #include < ...

  3. luoguP3359 改造异或树

    https://www.luogu.org/problemnew/show/P3359 因为 a ^ b ^ b = a,所以我们预处理 1 到所有点的距离,将删边的操作反过来变成加边,对于每一个联通 ...

  4. HDU 4825 Trie树 异或树!

    Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others)Total S ...

  5. BZOJ 4017 小 Q 的无敌异或 ( 树状数组、区间异或和、区间异或和之和、按位计贡献思想 )

    题目链接 题意 : 中文题 分析 : 首先引入两篇写的很好的题解 题解一.题解二 听说这种和异或相关区间求和的问题都尽量按位考虑 首先第一问.按二进制位计贡献的话.那么对于第 k 位而言 其贡献 = ...

  6. HUST——1106xor的难题之二(异或树状数组单点修改和区间查询)

    1106: xor的难题之二 时间限制: 2 Sec  内存限制: 128 MB 提交: 8  解决: 3 题目描述 上次Alex学长的问题xor难题很简单吧,现在hkhv学长有个问题想问你们. 他现 ...

  7. BootStrap-DualListBox怎样改造成为双树

    BootStrap-DualListBox能够实现将所选择的列表项显示到右边,未选的列表项显示到左边. 但是左右两边的下拉框中都是单级列表.如果要实现将两边都是树(缩进树),选择某个节点时,其子节点也 ...

  8. 线段树+RMQ问题第二弹

    线段树+RMQ问题第二弹 上篇文章讲到了基于Sparse Table 解决 RMQ 问题,不知道大家还有没有印象,今天我们会从线段树的方法对 RMQ 问题再一次讨论. 正式介绍今天解决 RMQ 问题的 ...

  9. Mysql索引数据结构为什么是B+树?

    目录 Mysql索引数据结构 二叉树 红黑树 B-Tree B+Tree Mysql索引数据结构 下面列举了常见的数据结构 二叉树 红黑树 Hash表 B-Tree(B树) Select * from ...

随机推荐

  1. 通过脚本发送zabbix微信报警

    实现zabbix通过微信报警的方式也是通过脚本来实现,与邮件报警不同的是,脚本调用的微信的相关接口的获取相对复杂一点 1.申请一个微信公众号(企业号) 申请方法不多说,如果已申请请忽略 2.在微信企业 ...

  2. 使用Zxing 一维码

    最近看到满大街的二维码扫码有惊喜,对二维码也有过一些了解,想看看到底是什么原理,在网上找了一些资料,自己弄了一个实例,采用的是MVC,贴出来分享一下 一维码生成 Controller public A ...

  3. JAVA Eclipse Incorrect line ending found carriage return 怎么办

    点击项目-清理即可    

  4. vue笔记四

    十一.过渡与动画 1.使用限制Vue 提供了 transition 的封装组件,在下列情形中,可以给任何元素和组件添加 entering/leaving 过渡条件渲染 (使用 v-if)条件展示 (使 ...

  5. Oracle 查询用户表信息,导入导出处理表空间不一致

    select table_name,tablespace_name from user_tables t; //查询用户默认表空间信息 SELECT t.* FROM USER_USERS t; 导入 ...

  6. JAVA 自动生成对应数据库表的JPA代码工具

    http://blog.csdn.net/zheng2008hua/article/details/6274659 关键词:JPA 数据库表代码自动生成,JPA代码生成     自动生成对应数据库表的 ...

  7. 零基础学python-1.5 第一个程序

    这一个章节我们来说说怎么建立一个python程序 1.打开idle 2.点击File->new file,然后会弹出一个编辑窗体 3.在编辑窗体里面输入命令代码 程序代码: print(&quo ...

  8. 让 webpack 加载 Source Map

    在浏览器中运行的 JavaScript 代码都是编译器输出的代码,这些代码的可读性很差.如果在开发过程中遇到一个不知道原因的 Bug,则你可能需要通过断点调试去找出问题. 在编译器输出的代码上进行断点 ...

  9. eureka集群高可用配置,亲测成功配置(转)

    转自大神的文章:https://blog.csdn.net/tianyaleixiaowu/article/details/78184793 网上讲这个东西的很多,抄来抄去的,大部分类似,多数没讲明白 ...

  10. [转载]Axure RP 7.0下载地址及安装说明

    Axure RP是产品经理必备的原型制作工具,因为很多同学是新手,在这里整理一下axure7.0的下载.安装和汉化流程,希望能够帮到大家. Axure RP是美国Axure Software Solu ...