https://www.luogu.org/problemnew/show/P3359

因为 a ^ b ^ b = a,所以我们预处理 1 到所有点的距离,将删边的操作反过来变成加边,对于每一个联通块用 map 维护 1 到联通块中的点异或值为 x 的数的个数,乘法原理统计答案,加边时启发式合并即可

#include <bits/stdc++.h>
using namespace std; typedef unsigned long long ull;
typedef long long ll; template <typename T>
inline void read(T &f) {
f = 0; T fu = 1; char c = getchar();
while(c < '0' || c > '9') {if(c == '-') fu = -1; c = getchar();}
while(c >= '0' && c <= '9') {f = (f << 3) + (f << 1) + (c & 15); c = getchar();}
f *= fu;
} const int N = 1e5 + 5; struct Edge {
int u, v, next, val;
}G[N << 1]; map <int, int> t[N];
ll Ans[N], ans;
int d[N], f[N], del[N], x[N], y[N], z[N], head[N];
int n, tot; inline void addedge(int u, int v, int val) {
G[++tot] = (Edge) {u, v, head[u], val}, head[u] = tot;
G[++tot] = (Edge) {v, u, head[v], val}, head[v] = tot;
} int find(int x) {return f[x] == x ? x : f[x] = find(f[x]);} void dfs(int u, int fa) {
for(int i = head[u]; i; i = G[i].next) {
int v = G[i].v;
if(v == fa) continue;
d[v] = d[u] ^ G[i].val;
dfs(v, u);
}
} int main() {
cin >> n;
for(int i = 1; i < n; i++) {
read(x[i]); read(y[i]); read(z[i]);
addedge(x[i], y[i], z[i]);
}
for(int i = 1; i < n; i++) read(del[i]);
for(int i = 1; i <= n; i++) f[i] = i;
dfs(1, 0); for(int i = 1; i <= n; i++) t[i][d[i]] = 1;
for(int i = n - 1; i >= 1; i--) {
int l = x[del[i]], r = y[del[i]];
int x = find(l), y = find(r);
if(t[x].size() > t[y].size()) swap(x, y);
for(map <int, int> :: iterator it = t[x].begin(); it != t[x].end(); it++) {
ans += (ll)it -> second * (ll)t[y][it -> first];
t[y][it -> first] += it -> second;
}
f[x] = y; Ans[i] = ans; t[x].clear();
}
for(int i = 1; i <= n; i++) printf("%lld\n", Ans[i]);
return 0;
}

luoguP3359 改造异或树的更多相关文章

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

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

  2. [luogu3359]改造异或树

    [luogu3359]改造异或树 luogu 和之前某道题类似只有删边的话考虑倒着加边 但是怎么统计答案呢? 我们考虑以任意点为根dfs一遍求出每个点到根的路径异或和s[i] 这样任意两点x,y的路径 ...

  3. 洛谷 P3359 改造异或树

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

  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. Kafka Zookeeper 基本命令示例

    Kafka 新建Topic bin/kafka-topics. --replication-factor --partitions --topic my-topic 查看已存在Topic列表 bin/ ...

  2. iOS单选和全选

    在日常开发中单选.多选.全选经常遇到,所以写一个demo放上来供大家参考, 先看效果图: Demo地址:https://github.com/domanc/SingleAndAllSelect.git

  3. Opencv Match Template(轮廓匹配)

    #include <iostream>#include <opencv2/opencv.hpp> using namespace std;using namespace cv; ...

  4. Oracle VM VirtualBox 部署CS devcloud2 开发环境

    Setting up (VirtualBox) 1. Get the new DevCloud 2.0 virtual appliance. The new image was created usi ...

  5. porwedesigner 去掉引号

    PowerDesigner生成的ORACLE 建表脚本中去掉对象的双引号,设置大.小写 若要将 CDM 中将 Entity的标识符都设为指定的大小写,则可以这么设定: 打开cdm的情况下,进入Tool ...

  6. Git回滚到历史节点(SourceTree篇)

    转自:http://blog.csdn.net/u010416101/article/details/78142697.https://www.zhihu.com/question/48178380 ...

  7. 运行jupyter

    在mac 命令行中输入 jupyter notebook 即可 https://www.datacamp.com/community/tutorials/tutorial-jupyter-notebo ...

  8. Python之FTP传输-乾颐堂

    访问FTP,无非两件事情:upload和download,最近在项目中需要从ftp下载大量文件,然后我就试着去实验自己的ftp操作类,如下(PS:此段有问题,别复制使用,可以参考去试验自己的ftp类! ...

  9. chrome crx下载路径

    chrome crx下载后会被删除,可在检查时粘贴出来,下载路径在: %localappdata%\Google\Chrome\User Data\Webstore Downloads 参考:http ...

  10. Ubuntu14.04 下安装Samba服务

    1.更改linux镜像源: # vim /etc/apt/sources.list deb http://mirrors.163.com/ubuntu/ trusty main restricted ...