树上启发式合并:xor1

news2025/2/28 17:11:08

https://vjudge.net/contest/587311#problem/C

最近没打这个套路,场上忘了


在这里插入图片描述

发现和一堆lca什么的有关,然后又是lca下不同的儿子,考虑树上启发式合并。

对于 i ⊕ j i\oplus j ij,我们可以拆位枚举

然后常数大会被卡常。但树上启发式合并很多的dfs可以优化成遍历dfs序上一段连续的区间。

#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read(){int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;
ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+
(x<<3)+(ch^48);ch=getchar();}return x*f;}
#define Z(x) (x)*(x)
#define pb push_back
//#define M
//#define mo
#define N 100010
int n, m, i, j, k, T;
int ans, son[N], w[N], a[N], c[N], p[N], u, v, sum;
int dfn[N], L[N], R[N], tot; 
vector<int>G[N]; 
int s[2][N*20]; 

void dfs1(int x, int fa) {
	w[x]=1; dfn[++tot]=x; 
	L[x]=tot; 
	for(int y : G[x]) {
		if(y==fa) continue; 
		dfs1(y, x); 
		w[x]+=w[y]; 
		if(w[y]>w[son[x]]) son[x]=y; 
	}
	R[x]=tot; 
}

//void dfs_clear(int x, int fa) {
//	
//	for(int y : G[x]) 
//		if(y != fa) dfs_clear(y, x); 
//}

//void dfs3(int x, int fa, int k) {
	printf("%lld : %lld => %lld | %lld\n", x, c[x], c[x]^k, s[a[x]^1][c[x]^k]); 
//	ans += s[a[x]^1][c[x]^k]; 
//	for(int y : G[x]) 
//		if(y != fa) dfs3(y, x, k); 
//}
//
//void dfs4(int x, int fa) {
//	s[a[x]][c[x]] ++ ; 
//	for(int y : G[x]) if(y != fa) dfs4(y, x); 
//}

void dfs2(int x, int fa) {
	int p; 
	for(int y : G[x]) if(y != fa && y != son[x]) {
		dfs2(y, x); 
		for(int k = L[y]; k <= R[y]; ++k) 
			p = dfn[k], s[a[p]][c[p]] = 0; 
	}
	if(son[x]) dfs2(son[x], x); 
	for(int y : G[x]) if(y != fa && y != son[x]) {
		for(int k = L[y]; k <= R[y]; ++k) 
			p = dfn[k], ans += s[a[p]^1][c[p]^c[x]]; 
		for(int k = L[y]; k <= R[y]; ++k) 
			p = dfn[k], s[a[p]][c[p]] ++ ; 
	}
//	for(int y : G[x]) if(y != fa && y != son[x])
	s[a[x]][c[x]]++; 
}

signed main()
{
//	freopen("in.txt", "r", stdin);
//	freopen("out.txt", "w", stdout);
//	srand(time(NULL));
//	T=read();
//	while(T--) {
//
//	}
	n=read(); 	
	for(i=1; i<=n; ++i) c[i]=read(); 
	for(i=1; i<n; ++i) {
		u=read(); v=read(); 
		G[u].pb(v); G[v].pb(u); 
	}
	dfs1(1, 0); 
	for(k=0; k<22; ++k) {
		for(i=1; i<=n; ++i) a[i]=(i>>k)&1ll, s[0][c[i]]=s[1][c[i]]=0; 
//		for(i=1; i<=n; ++i) printf("%lld ", a[i]); printf("\n"); 
		ans=0; 
		dfs2(1, 0); 
		sum+=ans*(1ll<<k); 
	}
	
	printf("%lld", sum); 
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1087164.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AndroidStudio模拟器使用rootAVD ROOT(失败)

下载rootAVD $ git clone https://github.com/newbit1/rootAVD.git 下载Magist Releases topjohnwu/Magisk GitHub 改名为Magist.zip&#xff0c;然后替换 察看设备 > .\rootAVD.bat ListAllAVDsrootAVD.bat system-images\android-31\google_apis_playstore\x86_64…

数据库系统概念学习2

对空值和布尔值的聚集 嵌套子查询 子查询是嵌套在另一个查询中的 select-from-where 表达式 集合成员资格 连接词 in 测试元组是否是集合中的成员&#xff0c;连接词 not in 测试元组是否不是集合中的成员 ↑ 找出在 2009 年球季和 2010 年春季学期同时开课的所有课程 ↓ 找…

docker安装sql-server数据库,使用navicat实现备份数据库导入

docker安装sql-server&#xff0c;使用navicat实现备份数据库导入 1、docker安装sql-server数据库2、使用navicat连接sql-server3、使用navicat导入备份数据库1、第一步&#xff1a;选择需要备份的数据源2、第二步 &#xff08;选择备份计划&#xff0c;设置还原文件位置信息&a…

云计算到底牛x在哪里?

你们好&#xff0c;我的网工朋友。 云计算已经霸屏行业有段时间了&#xff0c;但很多粉丝朋友还是不太明白什么是云计算&#xff0c;为什么要学云计算。 从宏观来说&#xff0c;其实云计算的优点很多。 就和传统模式相比&#xff0c;云计算在六个维度都有显著的提升点。 比…

git主干master分支回滚到历史版本(不会有错误的提交记录)

master版本,“合并错了”的回滚步骤: (这样做不会有“合并错了”的提交记录) 注意&#xff1a;操作前先对master拉一个分支出来&#xff0c;做备份&#xff1b; 1. 在gitLab的上一次合并记录&#xff0c;复制commit-id ​ 2. 在本地执行检出master版本&#xff0c;执行 git re…

阿里云价格计算器入口(一键计算精准报价)

阿里云服务器价格计算器&#xff0c;鼠标选择云服务器ECS实例规格、地域、系统盘、带宽及购买时长即可一键计算出精准报价&#xff0c;阿里云百科aliyunbaike.com分享阿里云服务器价格计算器链接地址&#xff1a; 阿里云服务器价格计算器 先打开阿里云服务器ECS页面 aliyunba…

浅析倾斜摄影三维模型(3D)几何坐标精度偏差的几个因素

浅析倾斜摄影三维模型&#xff08;3D&#xff09;几何坐标精度偏差的几个因素 倾斜摄影是一种通过倾斜角度较大的相机拍摄建筑物、地形等场景&#xff0c;从而生成高精度的三维模型的技术。然而&#xff0c;在进行倾斜摄影操作时&#xff0c;由于多种因素的影响&#xff0c;导致…

Godot自动寻路功能讲解-使用C#语言(2D游戏导航教程)

文章目录 创建导航NavigationAgent2D节点设置目标位置其他文章 创建导航 首先&#xff0c;创建一个基本的场景&#xff0c;下面的文章讲解了如何创建一个基本的导航场景&#xff0c;点击如下链接前往该文章&#xff1a; Godot2D角色导航-自动寻路教程 NavigationAgent2D节点 …

Vue封装组件并发布到npm仓库

前言 使用Vue框架进行开发&#xff0c;组件封装是一个很常规的操作。一个封装好的组件可以在项目的任意地方使用&#xff0c;甚至我们可以直接从npm仓库下载别人封装好的组件来进行使用&#xff0c;比如iview、element-ui这一类的组件库。但是每个公司的业务场景可能不同&…

Matlab论文插图绘制模板第119期—分组气泡图

在之前的文章中&#xff0c;分享了很多Matlab气泡图的绘制模板&#xff1a; 进一步&#xff0c;再来分享一种特殊的气泡图&#xff1a;分组气泡图。 先来看一下成品效果&#xff1a; 特别提示&#xff1a;本期内容『数据代码』已上传资源群中&#xff0c;加群的朋友请自行下载…

护眼台灯是智商税吗?书客、飞利浦、南卡三款台灯真实测评

护眼台灯本身并不是智商税&#xff0c;但是有些品牌或者商家可能会利用消费者对护眼产品的需求来进行夸大宣传或者高价销售&#xff0c;让消费者在不了解产品的情况下盲目购买&#xff0c;从而产生了智商税的嫌疑。因此&#xff0c;在购买护眼台灯时&#xff0c;消费者应该理性…

二.镜头知识之镜头总长,法兰距,安装接口

二.镜头知识之镜头总长&#xff0c;法兰距&#xff0c;安装接口 文章目录 二.镜头知识之镜头总长&#xff0c;法兰距&#xff0c;安装接口2.1 线激光模组镜头的FBL 与 TTL(Total Track Length) 镜头总长2.2 相机法兰距2.3 线激光模组镜头的TTL 以及 From Barrel bottom to imag…

ipad手写笔哪个好用?苹果平替笔性价比高的

如果你想要入手一款和iPad匹配的电容笔&#xff0c;想必你的第一想法就是苹果的原装电容笔。然而这款电容笔虽然很好用&#xff0c;但价格会相对的昂贵一些。而平替电容笔&#xff0c;却是一种不错的选择&#xff0c;而且价格也很合理。一支普通的平板电容笔&#xff0c;其售价…

Android笔记(六):JetPack Compose常见的UI组件

一、文本组件 1.1Text Column(modifier Modifier.fillMaxSize().background(Color.Green).padding(10.dp)){Text(text stringResource(id R.string.title_content),modifier Modifier.fillMaxWidth().border(BorderStroke(1.dp, Color.White)),fontSize 20.sp,textAlign …

【Overload游戏引擎细节分析】从视图投影矩阵提取视锥体及overload对视锥体的封装

overoad代码中包含一段有意思的代码&#xff0c;可以从视图投影矩阵逆推出摄像机的视锥体&#xff0c;本文来分析一下原理 一、平面的方程 视锥体是用平面来表示的&#xff0c;所以先看看平面的数学表达。 平面方程可以由其法线N&#xff08;A, B, C&#xff09;和一个点Q(x0,…

SQL开发笔记之专栏介绍

Sql是用于访问和处理数据库的标准计算机语言&#xff0c;使用SQL访问和处理数据系统中的数据&#xff0c;这类数据库包括&#xff1a;Mysql、PostgresSql、Oracle、Sybase、DB2等等&#xff0c;数据库无非围绕着“增删改查”的核心业务进行开发。并且目前绝大多数的后端程序开发…

ElasticSearch-Head 数据浏览406问题解决

解决方法&#xff1a; 1、打开Docker DeskTop的Containers&#xff0c;找到es-head容器 2、选择Exec Tab选项 3、编辑vendor.js文件 vim _site/vendor.js 4、显示行号 :set nu 5、修改配置 # 修改文件第6886、7574行 将"application/x-www-from-urlencodes"修改…

经纬恒润数字钥匙,让出行更简单

汽车智能进化的同时&#xff0c;汽车与智能手机之间的联系也越来越紧密。新兴的汽车数字钥匙&#xff0c;可以将传统实体钥匙“装入”智能手机&#xff0c;帮助用户摆脱忘带钥匙的烦恼&#xff0c;让出行变得更简单。汽车数字钥匙的实现主要是基于BLE&#xff08;蓝牙&#xff…

DevEco Hvigor高效编译,构建过程新秘籍

作者&#xff1a;Lewei&#xff0c;华为终端BG编译构建技术专家 DevEco Hvigor是使用TypeScript语言开发的全新轻量化的任务调度工具&#xff0c;针对HarmonyOS应用提供了一系列编译构建任务&#xff0c;支持将HarmonyOS应用编译构建出对应的产物包。作为一款HarmonyOS应用编译…

VTK编译解决CMake的“could not find any instance of Visual Studio”的问题

1、在配置VTK源码编译的过程中&#xff0c;遇到报错 “CMake的“could not find any instance of Visual Studio””,cmake在编程找不到vs2017路径或者配置不全。 解决方案&#xff1a; 安装“Visual Studio Installer”&#xff1b; 1.检查是否安装 “使用C的桌面开发” 2.检…