传送门
30分做法:(边权为0)
我一开始就在想30分做法,然后就想到了:
首先老套路,正着删边就是倒着加边。
并查集维护连通块大小,每次加边后将两个端点的size值乘起来累加答案。
20分做法:
当n<=1000时,利用xor的一个性质:a^x^x=a;
然后就可以选取一个根,一遍dfs,预处理出来每个点到根节点的距离,这样dist[x,y]=s[x]^s[y];
可以每次修改后暴力查找,然后随便搞搞就好了。
50分做法:
结合做法1和做法2。
100分做法:
给每一个块都建一个平衡树(由于我太蒟蒻了,就不自己手写了,我就用map了,虽然map慢到爆炸,但也可以将就着用吧),在每一次修改的时候用启发式合并,一边合并一边统计答案,就完美解决了。
代码:(最慢的点400ms)

#include<map>
#include<cstdio>
#define ll long long
using namespace std;
inline int read(){int x=0;char ch=' ';while(ch<'0'||ch>'9')ch=getchar();while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x;
}
struct edge{int to,next,w;
}e[200001];
map<int,int> mp[100001];
map<int,int>::iterator it;
int n,tot,x[100001],y[100001],add[100001],fa[100001],z[100001],head[100001],s[100001];
ll sum[100001],ans;int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
inline void addedge(int x,int y,int w){e[++tot].to=y;e[tot].next=head[x];e[tot].w=w;head[x]=tot;}
void dfs(int x,int fa){for(int i=head[x];i;i=e[i].next){int u=e[i].to;if(u!=fa){s[u]=s[x]^e[i].w;dfs(u,x);}}
}int main(){n=read();for(int i=1;i<=n;i++)fa[i]=i;for(int i=1;i<n;i++){x[i]=read();y[i]=read();z[i]=read();addedge(x[i],y[i],z[i]);addedge(y[i],x[i],z[i]);}for(int i=1;i<n;i++){add[i]=read();}dfs(1,0);for(int i=1;i<=n;i++)mp[i][s[i]]=1;for(int i=n-1;i>=1;i--){int u=find(x[add[i]]);int v=find(y[add[i]]);if(mp[u].size()>mp[v].size())swap(u,v);fa[u]=v;for(it=mp[u].begin();it!=mp[u].end();++it){ans+=1ll*mp[v][it->first]*it->second;mp[v][it->first]+=it->second;}sum[i]=ans;}for(int i=1;i<=n;i++)printf("%lld\n",sum[i]);return 0;
}

转载于:https://www.cnblogs.com/stone41123/p/7581245.html

洛谷 P3359 改造异或树相关推荐

  1. 洛谷P4735 最大异或和

    题目链接 洛谷P4735 最大异或和 题目描述 给定一个非负整数序列 a{a}a,初始长度为nnn. 有 mmm 个操作,有以下两种操作类型: A x:添加操作,表示在序列末尾添加一个数 xxx,序列 ...

  2. 洛谷 P3384 【模板】树链剖分-树链剖分(点权)(路径节点更新、路径求和、子树节点更新、子树求和)模板-备注结合一下以前写的题目,懒得写很详细的注释...

    P3384 [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节 ...

  3. 洛谷P4315 月下“毛景树” 题解

    洛谷P4315 月下"毛景树" 题解 题目链接:P4315 月下"毛景树" 题意:请维护一个数据结构,支持 改第 kkk 条边的边权 结点 uuu 到 vvv ...

  4. 洛谷——P1047 校门外的树 python实现

    洛谷--P1047 校门外的树 python实现 l, m = map(int, input().split(' ')) trees = [True]*(l+1) for i in range(m): ...

  5. 洛谷P3688/uoj#291. [ZJOI2017]树状数组

    传送门(uoj) 传送门(洛谷) 这里是题解以及我的卡常数历程 话说后面那几组数据莫不是lxl出的这么毒 首先不难发现这个东西把查询前缀和变成了查询后缀和,结果就是查了\([l-1,r-1]\)的区间 ...

  6. 洛谷(P3373)线段树加乘混合模板

    题目链接:P3373 [模板]线段树 2 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 这道题目的意思很明确,就是要我们在线完成区间的乘和加运算并支持查询区间和的一个问题.处理这道 ...

  7. 洛谷题解——P1873:砍树

    视频讲解可以直接点击这个 B 站链接,https://www.bilibili.com/video/BV1jk4y1k7hq/. 题目相关 题目链接 洛谷,https://www.luogu.com. ...

  8. 洛谷P3374 【模板】树状数组 1

    题目链接:[模板]树状数组 1 - 洛谷 模板题就不多说了 ac代码: #include <cstdio> #include <iostream> #include <a ...

  9. Bzoj3261/洛谷P4735 最大异或和(可持久化Trie)

    题面 Bzoj 洛谷 题解 显然,如果让你查询整个数列的最大异或和,建一颗\(01Trie\),每给定一个\(p\),按照二进制后反方向跳就行了(比如当前二进制位为\(1\),则往\(0\)跳,反之亦 ...

最新文章

  1. 算法也是颜值控,Twitter AI更青睐肤白貌美图
  2. DFS、DTFT、DFT、 FFT的定义和区别
  3. 攻防世界第四题Reverse re1
  4. Mac下修改ZOC中文乱码
  5. Sql Server 日期格式转换
  6. java ha_java – Haproxy Bad Gateway 502
  7. java ssm框架登录代码,求一个SSM框架登录功能的源码,要求能运行成功
  8. C语言有某程序入口,C语言入门 — 程序入口
  9. Vue + ElementUI 实现全国各个省份相对应城市的联动选择
  10. 安卓防止微信调整字体大小
  11. 无限的可能的投资回报率
  12. android模拟器 diy,DIY泡沫黏液模拟器
  13. AS怎么找回不小心 删除的layout文件
  14. 不再热衷南下打工!中国农村正在巨变,又一浪潮滚滚席卷而来
  15. jmeter添加cookie
  16. 好程序员云计算培训分享云计算必会的Docker容器命令
  17. ShaderToy入门教程(2) - 光照和相机
  18. cc ,gcc 命令解释
  19. Eclipse光标变成黑色方块解决方法
  20. 2020.06新闻文章回顾

热门文章

  1. mysql查出的结果太大 php_如何解决PHP使用mysql_query查询超大结果集超内存问题
  2. python中如何导入sklearn_Python中常用包——sklearn主要模块和基本使用方法
  3. oracle11g32位安装流程_Oracle11g----Win7 32位安装图例
  4. java datasource 配置_Spring boot 基于注解方式配置datasource
  5. gitleb 登陆方式_gitlab连接方式
  6. plsa的java实现_java在注解中绑定方法参数的解决方案
  7. mysql 读取oracle数据_Python中Pandas通过read_sql方法从Mysql或Oracle数据库中读取数据帧(DataFrame)...
  8. 电梯java_基于Java的电梯系统
  9. php select where,PHP where语句
  10. matlab怎么编写数据处理程序,【悬赏--已结束】求编写一个基于Matlab的数据处理程序...