2020CCPC长春 F. Strange Memory

2020 CCPC长春 F. Strange Memory(dsu on tree+拆位算贡献) 传送门 给定有根树 带点权 求出满足a[i] ^ a[j]=a[lca]的点 i^j 之和 。 点权<=1e6 我们考虑枚举根节点rt,求出当rt作为LCA时产生的贡献,相当于是枚举了LCA。 从而把问题转化成了子树查询问题,对于rt,能产生贡献的点对必顶位于rt不同孩子子树中,所以我们考虑dsu on tree,vector<int> num[i]表示点权为i的节点信息,最后保留重儿子信息。 对于每个轻儿子,先统计贡献,再更新num数组。 由于某棵子树删除影响后,vector<in 阅读详情

题目链接

题目大意

给你一棵树,让你求树上所有满足 a i ⨁ a j = a l c a ( i , j ) a_i \bigoplus a_j = a_{lca(i, j)} ai​⨁aj​=alca(i,j)​ 的点对 i ⨁ j i \bigoplus j i⨁j 之和

解题思路

我们可以枚举每个点作为 l c a lca lca 的贡献,这是一个不修改的子树问题,可以用树上启发式合并来做(dsu on tree),复杂度 O ( n l o g n ) O(nlogn) O(nlogn)
我们怎么求 i ⨁ j i \bigoplus j i⨁j,我们可以用一个桶来记录 a i ⨁ a r t a_i \bigoplus a_{rt} ai​⨁art​,然后将 i i i 存入桶中。但是我们每放一个数,首先需要与桶中的数计算一次答案,这样复杂度变为了 O ( n 2 l o g n ) O(n^2logn) O(n2logn)。
我们知道 i ⨁ j + i ⨁ k ! = i ⨁ ( j + k ) i \bigoplus j + i \bigoplus k != i \bigoplus(j + k) i⨁j+i⨁k!=i⨁(j+k)
但是我们将数化为二进制,我们每一位来运算是满足结合律的,所以我们将 i i i 化为二进制存入桶中,我们统计每一位出现了多少次 0 或 1,这样我们可以每一次按位运算。
我们在dsu的时候,先递归计算子树的答案,然后加上子树的贡献。

Code

#include <bits/stdc++.h>
#define ll long long
#define qc ios::sync_with_stdio(false); cin.tie(0);cout.tie(0)
#define fi first
#define se second
#define PII pair<int, int>
#define PLL pair<ll, ll>
#define pb push_back
using namespace std;
const int MAXN = 1e5 + 7;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const ll mod = 1e9 + 7;
ll ans;
int son[MAXN], sz[MAXN], a[MAXN];
int cnt[MAXN*15][21][2];
int n;
int head[MAXN];
struct edge{
	int to, next;
}e[MAXN << 1];
int tot;
void add(int u, int v){
	e[tot].to = v;
	e[tot].next = head[u];
	head[u] = tot++;
}
void init(){
	memset(head, -1, sizeof head);
	tot = 0;
}
void dfs(int u, int f){
	sz[u] = 1;
	int maxx = 0;
	for(int i = head[u]; ~i; i = e[i].next){
		int v = e[i].to;
		if(v == f) continue;
		dfs(v, u);
		sz[u] += sz[v];
		if(sz[v] > maxx){
			maxx = sz[v];
			son[u] = v;
		}
	}
}
int flag;
void getAns(int x, int u, int f){
	int k = a[x] ^ a[u];
	for(int i = 0; i <= 20; i++){
		ans += cnt[k][i][!((u >> i) & 1)] * (1ll << i);
	}
	for(int i = head[u]; ~i; i = e[i].next){
		int v = e[i].to;
		if(v == flag || v == f) continue;
		getAns(x, v, u);
	}
}
void update(int x, int u, int f, int val){
	for(int i = 0; i <= 20; i++){
		cnt[a[u]][i][(u >> i) & 1] += val;
	}
	for(int i = head[u]; ~i; i = e[i].next){
		int v = e[i].to;
		if(v == flag || v == f) continue;
		update(x, v, u, val);
	}
}
void dsu(int u, int f, int keep){

	for(int i = head[u]; ~i; i = e[i].next){
		int v = e[i].to;
		if(v == f || v == son[u]) continue;
		dsu(v, u, 0);
	}
	if(son[u]){
		dsu(son[u], u, 1);
		flag = son[u];
	}
	for(int i = head[u]; ~i; i = e[i].next){
		int v = e[i].to;
		if(v == flag  || v == f) continue;
		getAns(u, v, u);
		update(u, v, u, 1);
	}
	flag = 0;
	for(int i = 0; i <= 20; i++){
		cnt[a[u]][i][(u >> i) & 1]++;
	}
	if(!keep){
		update(u, u, f, -1);
	}
}

void solve(){
	cin >> n;
	init();
	for (int i = 1; i <= n; ++i){
	    cin >> a[i];
	}
	for (int i = 1; i <= n-1; ++i){
	    int u, v;
		cin >> u >> v;
		add(u, v);
		add(v, u);
	}
	dfs(1, 0);
	dsu(1, 0, 0);
	cout << ans << "\n";
}

int main()
{
    #ifdef ONLINE_JUDGE
    #else
       freopen("in.txt", "r", stdin);
       freopen("out.txt", "w", stdout);
    #endif

    qc;
    int T;
    // cin >> T;
    T = 1;
    while(T--){

        solve();
    }
    return 0;
}

DeepSeek 在 PostgreSQL 中,执行 `DELETE` 操作后,数据占用的空间并不会立即释放给操作系统 操作后,数据占用的空间并不会立即释放给操作系统。这是 PostgreSQL 的 MVCC(多版本并发控制)机制决定的——删除的数据只是被标记为“死元组”,物理空间仍然被表占用。这是最彻底的释放方式,会将表重写为一个没有空洞的新文件,将空间返回给操作系统。如果你的表非常大(如几百GB),或者这是生产环境的核心表,建议优先考虑。你可以告诉我你的表大概多大、是否能接受锁表,我可以给你更精确的建议。要真正释放空间,需要根据你的实际需求,从以下三种方案中选择一种。如果你既想彻底释放空间,又无法接受锁表, 阅读详情

相关推荐

11 CO配置-控制-成本中心会计-定义分割结构(OKES-Define Splitting Structure)

业务背景:定义分割结构 事务码: OKES SPRO路径:SPRO->控制->成本中心会计->实际过账->期末结算->作业分配->划分->定义分割结构 第1步,SPRO路径进入 第2步,选择“新的条目”创建 分割结构 第3步,选择分割结构代码 点击“分割规则”进行下一个界面,点击“新条目”创建 分割结构规则 第4步,点击“为规则选择” 为分割结构规则创建版本并保存 第5步,选择“分配”,点击“新的条目” 输入分割结构分配

4371

2020CCPC长春:F. Strange Memory(树上启发式合并 + 位运算预处理)

2020CCPC长春:F. Strange Memory(树上启发式合并 + 位运算预处理) 题意: 一颗树,每个点的权值为aia_iai​,计算 ∑i=1n∑j=i+1n[ai⊕aj=alca(i,j)](i⊕j)\sum_{i=1}^{n}\sum_{j=i+1}^{n}[a_i ⊕a_j=a_{lca(i,j)}](i⊕j)∑i=1n​∑j=i+1n​[ai​⊕aj​=alca(i,j)​](i⊕j) 思路: 枚举lca,暴力统计子树,位运算预处理出子树信息 用unordered_map常数太大会炸,

weixin_45722843的博客 322

人机协作新纪元:AI会抢走IT人的饭碗吗?

产品经理用自然语言描述需求,AI将其转化为技术规格书(准确率已达89%)

818

2020CCPC长春F题——dsu on tree+二进制拆分

题目链接 https://codeforces.com/gym/102832/problem/F 题意: 给你一颗n个节点的树,让你求出 的值。 题解: 对于这种子树查询的问题,常用的方法也就那几种,要么就是树链剖分后用数据结构维护,要么就是dsu on tree。 不难发现这个题用dsu on tree比较好写,即考虑以每个节点为根(即lca)的子树,然后枚举不同儿子之间对答案的贡献。 dsu on tree常见的套路是处理子树内的查询,而对于这种子树间的查询就需要对dsu on.

mumei的博客 520

Unity+Hybridclr发布WebGL记录

问题不多,比预想中的顺利,如果遇到问题建议先看Hybridclr的常见问题里面有没有解决方案,没遇到Hybridclr的报错,所以记录的问题里面没有Hybridclr相关的。导出设置里的压缩格式选择了Brotli,而服务器或浏览器不支持,据说是可以拓展服务器配置使支持Brotli,但是由于我本人是IIS小白,所以换了种压缩格式,在publishing Settings修改Compression Fromat为Gzip。3.在浏览器运行之后视图一直闪烁。,修改配置,这个网上很常见。

a598211757的博客 1037

【AI黑话日日新】什么是AI Infra?

是支撑AI模型开发、训练、推理、部署与规模化运营的,是连接底层算力与上层AI应用的“数字基建”。没有高效的AI Infra,大模型训练、推理与落地都无法高效实现。

专注:太空算力、AI infra、异构调度、大模型成本工程 1098

2020CCPC 长春 F. Strange Memory (树上启发式合并+按位算贡献)

题链:https://codeforces.com/gym/102832/problem/F 题意:求,翻译一下就是求当的和。 思路:做过类似的题,传送门。看到LCA,可以考虑将问题转化到子树上。因为,以u为LCA的无序对(v1,v2)一定在u的子树中,其中v1,v2要属于u的不同儿子。 那么,我们可以维护子树中每个数的下标集合。在计算u子树的答案时,统计u的轻儿子v的贡献时,要先统计答案,再将v的子树里的数加上。 这样是为了避免将v的子树的无序对(v1,v2)统计为答案,虽然,但显然(v1,...

birdmanqin的博客 459

AUTOSAR进阶图解==>AUTOSAR_SWS_ADCDriver

本文深入解析了AUTOSAR ADC Driver的架构设计和技术实现。主要内容包括:1)ADC Driver在AUTOSAR分层架构中的定位及核心功能;2)详细的模块架构设计,涵盖初始化管理、组转换管理、优先级处理等核心子组件;3)全面的配置模型说明,包括主配置类、通用配置、通道配置等关键数据结构;4)状态机机制和操作序列分析。通过分层设计和标准化接口,ADC Driver实现了硬件抽象和软件解耦,提供了良好的可移植性和可维护性。

一名留德华的,康德的信徒的,专注于汽车电子领域的博客 786

2020.11.8 CCPC赛后总结(包括阶段总结【ccpc长春分站赛铜总结】

2020CCPC长春137名喜提铜尾,跟我们一开始目标一样:无论是尾巴还是头,只要有牌子就是完成任务。 然而,这一拳像是打在棉花上,根本没有用力,棉花融化了。跟我们一开始想的对铜牌门一顿激烈猛冲,才破门而入的成就感不太一样。2题低罚时就能铜尾只能说题目前半部分区分度并不好。 概括我们水平的话,期望大概也在铜尾,所以对题目也没啥好可惜的。反倒是师傅队因为2题罚时高了点就打铁了,平常训练基本都有银牌的发挥的。 总结一下这场比赛,其实也没什么好总结的。第一题爆搜过,并不快也不慢的13分钟稳健1a,然后D题zf做过

DevourPower的博客 1370

OpenClaw实战系列02:企业微信接入完全指南

本文详细介绍了如何将OpenClaw与企业微信对接,实现智能机器人功能。主要内容包括:企业微信侧创建智能机器人或自建应用,获取必要凭证和权限;OpenClaw侧安装配置企业微信插件,设置通信通道;完成双向验证并进行功能测试。文章提供了详细的配置步骤、常见问题排查方法和进阶玩法,帮助用户在30分钟内完成对接。关键点包括:确保URL可访问、Token一致、网关正常运行,以及针对不同部署环境(云服务器/内网)的配置差异。

PeterPan的博客 3811

【AN7581】AN7581 SDK编译环境搭建操作说明

安装编译需要的工具包。

wgl307293845的博客 338

2020CCPC长春站F - Strange Memory

题意: 给定一个树,每个点上有一个点权,计算 题解: 使用dsu on tree,把每个数拆开成二进制,存在数组上,在合并的时候统计答案 #include <bits/stdc++.h> using namespace std; typedef long long ll; inline ll rd(){ ll x=0;char o,f=1; while(o=getchar(),o<48)if(o==45)f=-f; do x=(x<<3)+(x<<1)+(o

CallmeChallenger的博客 529

基于 STM32 单片机的实验室多参数安全监测系统设计与实现

本系统以 STM32F103C8T6 单片机为核心,集成温湿度监测、烟雾检测、气体泄漏报警、人体移动监测等功能模块,通过 OLED 显示屏实时显示数据,并支持 Wi-Fi 远程传输。系统可对实验室异常环境参数(如高温、烟雾、燃气泄漏)及非法入侵实时报警,保障实验室安全。本文从硬件选型、电路设计到软件实现提供了完整的实验室安全监测系统方案,可根据实际需求调整传感器类型和通信方式,适用于科研、教学等场景的环境安全防护。:可增加继电器模块控制通风设备或切断电源,集成 ZigBee 组网实现多实验室联动监测。

weixin_42300449的博客 1285

【算法】树上启发式合并 (CCPC2020长春 F. Strange Memory)

CCPC2020长春 F. Strange Memory 树上启发式合并

csdn可能自动偷偷把博客设为vip可见,可以联系我改回去 1124

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

2020 长春CCPC F Strange Memory —— dsu on tree

This way 题意: 给你一棵树,统计 题解: 这个知识点很基础吗,为什么大家都会啊,就是dfs做的时候,先做轻儿子,然后将轻儿子的影响消除之后,做重儿子,重儿子的影响不消除。这道题目要注意的就是做当前点的时候,要先将一个儿子的子树做完之后再将影响加入,否则有可能会一个子树内部匹配 #include<bits/stdc++.h> using namespace std; #define ll long long const int N=(1<<20)+50; int cn

天翼之城的博客 1422

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

2020 ccpc 长春站 F - Strange Memory

题意: 给一颗树,每个点有权值a[i],(u,v)合法仅当a[u]^a[v]=a[lca(u,v],这样的点对对答案的贡献为u^v,求最后的答案((u,v)和(v,u)视作相同点对 题解: 参考:https://blog.csdn.net/qq_45458915/article/details/109583484 dsu on tree #include<bits/stdc++.h> using namespace std; #define ll long long const i

shejunda的博客 283

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

ccpc2020长春站F题 Strange Memory

dsu on tree 题目链接 点我跳转 题目大意 给定一棵包含 \(n\) 个节点的树,每个节点有个权值 \(a_i\) 求\(∑_{i=1}^n∑_{j=i+1}^n[a_i⊕a_j=a_{lca(i,j)}](i⊕j).\) 解题思路 题目保证了 \(a_i ≠ 0\) ,所以不存在 \(a_u⊕a_v = a_u\),即满足条件的\(a_u ⊕ a_v = a_{lca(u,v)...

qq_38227632的博客 190

2020 ccpc长春 F Strange Memory (树上启发式合并)

直接暴力每颗子树复杂度是O(n2n^2n2)的,树上启发式算法是可以将复杂度优化到O(nlogn)的。 启发式算法是基于人类的经验和直观感觉,对一些算法的优化。 举个栗子:并查集的按秩合并,合并时将秩(集合的高度)小的集合合并到秩大集合上去。 对于树来说也是可以的,不过合并树的话就不能看高度了,而要看树的节点数量,沿用树链剖分的轻重儿子的概念,就是将轻儿子的子树的贡献合并到重儿子的子树上去。 #include<iostream> #include<cstdio> #include&.

qq_45288870的博客 892

2020 ccpc长春 F Strange Memory (树上启发式合并+位运算)

2020 ccpc长春 F Strange Memory (树上启发式合并+位运算) 题目 https://codeforces.com/gym/102832/problem/F 题意 给定一个含有n个节点的数,求下式的值。 ∑i=1n∑j=i+1n[ai⊕aj=alca(i,j)](i⊕j)\sum_{i=1}^n\sum_{j=i+1}^n[a_i⊕a_j=a_{lca(i,j)}](i⊕j)∑i=1n​∑j=i+1n​[ai​⊕aj​=alca(i,j)​](i⊕j) 意思大概就是给你两个结点,如果这

zhz的博客 1183

2020ccpc长春 F. Strange Memory

//#include <bits/stdc++.h> //#pragma GCC optimize(2) #include <stdio.h> #include <cstring> #include <algorithm> #include <vector> #include <stack> #include <queue> #include <iostream> #include <map> #in

tobe_numberone的博客 257

2020CCPC长春 7-6 F - Strange Memory(暴力,map)

思路: 直接枚举祖先节点,用mapmapmap存下valvalval这个值对应的下标集合对于每个二进制位的和。 所以当父节点权值为a[x]a[x]a[x]时,要求valvalval能与多少个点产生贡献,就要在之前的子树和父节点的点击中找到所有权值为a[x]^val的点,并对于每个二进制位算贡献值。 因为第一个子树不用遍历,所以我们将子节点按照大小排序,大的子树放在前面。 感觉常数好大,是水过去的啊。。。 #include <cstdio> #include <algorithm>.

tomjobs的博客 564

2020 CCPC 长春 F. Strange Memory(树上启发式合并)

Descripton Example input 6 4 2 1 6 6 5 1 2 2 3 1 4 4 5 4 6 output 18 Solution

chr1stopher 361

【CCPC】2020CCPC长春 F - Strange Memory | 树上启发式合并(dsu on a tree)、主席树

人均会dsu的赛区..早知道就把数组开大一点了.. 差20分钟就银了呀.. 最后一场ccpc留下遗憾了... 题目大意: 给出一个树 让你求出: 题目思路: 看到lca,那就只能是枚举每个点作为lca的贡献 所以枚举当前节点作为lca时,所以能够产生贡献的就是,他的任意两棵子树的贡献 所以直接枚举当前这个子树的所有点,然后和之前的权值去匹配 这里需要按位拆分一下: a^(b+c) != a^b + a^c 但是把数按位拆分之后,对于当前lca权值是ai = c,当前点是ak =

一只酷酷光儿的博客 3320

[2020 ccpc 长春] F. Strange Memory (树上启发式合并)

题目链接:F. Strange Memory 题意 给定一个有n个结点以1为根的树,每个结点有个权值ai{a_i}ai​,问存在多少u、v对满足au⊕av=alca{a_u \oplus a_v=a_{lca}}au​⊕av​=alca​,统计所有u⊕v{u \oplus v}u⊕v和。 题解 首先由于结点权值不为0,所以不存在a[u]⊕a[v]==a[u]{a[u] \oplus a[v]==a[u]}a[u]⊕a[v]==a[u]的情况。因此满足条件的点对一定在lca结点下的两个不同子树上。我们可以通过

张小生的先生的博客 317

2020ccpc长春F Strange Memory(树上启发式合并)

题目大意: 给定一个 nnn 个节点的树,求: ∑i=1n∑j=i+1n[ai⊕aj=alca(i,j)](i⊕j)\sum_{i=1}^n \sum_{j=i+1}^n [a_i ⊕ a_j = a_{lca(i,j)}](i ⊕ j)i=1∑n​j=i+1∑n​[ai​⊕aj​=alca(i,j)​](i⊕j) 题目分析: 我们发现在一条链上的两个点 u,vu,vu,v (depu<depvdep_u<dep_vdepu​<depv​),有 lca(u,v)=ulca(u,v)=ul.

羊驼的博客 407

2020CCPC长春站 F-Strange Memory (dsu on tree + 二进制拆分答案贡献)

第一次做dsu on tree维护异或的题目,思路还不是很活跃,再去找相关的几道题去做一下。 题意:给定你n个点,和他们对应的节点值ai。然后让你找出所有满足题目要求的式子的点对的异或和。(i,j)和(j,i)是一对相同的点对。 思路:很明显想要解决这个式子,我们有两个问题需要去解决,第一,如何去找到(i,j)这个点对值的LCA。第二,如何去找到满足条件的所有(i,j)点对值的亦或者。 我们这样考虑,这道题直接去找给出的i和j的LCA是不现实的,但是这道题并没有让我们去找到某一个确切的LCA是谁,而是要统.

forward77 402
上一篇: 树上启发式合并(dsu on tree)
下一篇: 2021杭电多校第三场 1009——Rise in Price
Linda_yezi_coder
博客等级 码龄7年 20粉丝 88原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值