Codeforces Round 950 G. Yasya and the Mysterious Tree 【树上异或和差分、01Trie】

news2024/12/23 9:28:41

G. Yasya and the Mysterious Tree

12

题意

给定一颗 n n n 个节点的树,每条边有一个初始的权值
现在定义两种操作:

  1. ^    y \; y y,给所有的边的权值异或上 y y y
  2. ? u    x u \; x ux,在树上任选一个不等于 u u u 的点,在其与 u u u 之间连接一条边权为 x x x 的边,这样构成了一个环,这个环的权值就是环的所有边权的异或和。输出所有方案的环的权值最大值

注意操作二并不会真的连边,只是假设连边,树始终是一颗树。
只需要对所有操作二回答答案即可

思路

我们先以 1 1 1 为根,在树上做 d f s dfs dfs,将每个点到根节点的异或和记录下来,记为 W u W_u Wu
那么其实这是一个树上前缀异或和

进一步观察不难发现:操作一既然是对所有边都异或,那么我们并不需要真的对所有边都异或,我们只需要记录所有的操作一的 y y y 异或起来(记为 X X X ),然后根据操作二我们选择的点 v v v,其与点 u u u 之间经过的边的数量的奇偶性,就可以得出这条路径被操作一影响的权值。
如果长度为偶数,那么操作一等价于没操作;如果为奇数,那么只需要在环的最终权值异或上 X X X 即可。

到了这里不难想到要分奇偶讨论。先看长度为偶数的情况,即我们忽略操作一的影响,这时候我们只能选择距离 u u u 长度为偶数的点,我们可以先在一开始 d f s dfs dfs 的时候给每个点一个颜色,这样子就可以黑白染色,根据颜色来判断路径长度奇偶性了。
那么现在我们等价于只能选择与 u u u 颜色相同的点(长度为偶数),如果我们能快速求出 u → v u \rarr v uv 的路径的异或和,然后异或上 x x x,就是这个环的权值了。

这里就到了让人眼前一亮的操作, u → v u \rarr v uv 的路径异或和 d ( u , v ) = W u ⨁ W v d(u, v) = W_u \bigoplus W_v d(u,v)=WuWv,即前面预处理的前缀异或和异或起来。
这是因为: d ( u , v ) = d ( u , l c a ( u , v ) ) ⨁ d ( l c a ( u , v ) , v ) d(u, v) = d\left(u, lca(u, v) \right) \bigoplus d\left(lca(u, v), v \right) d(u,v)=d(u,lca(u,v))d(lca(u,v),v),那么它们 l c a ( u , v ) lca(u,v) lca(u,v) 往上的部分前缀异或和,由于异或了两次,所以被抵消了。

那么现在问题就转化为了:选择所有颜色与 u u u 相同的点,使得 W u ⨁ W v W_u \bigoplus W_v WuWv 最大,这个就是很经典的 01    T r i e 01 \;Trie 01Trie 问题

同理,长度为奇数的情况就是选择与 u u u 颜色不同的点,使得 X ⨁ W u ⨁ W v X \bigoplus W_u \bigoplus W_v XWuWv 最大

还有一个细节就是,不能选择 u u u 本身,所以在查询之前,我们需要先将 u u u 删除,同时维护 T r i e Trie Trie 上的有效点即可,避免查询的时候误入歧途

时间复杂度: O ( ( n + m ) ⋅ log ⁡ 1 0 9 ) O\left((n + m) \cdot \log 10^9 \right) O((n+m)log109)

#include<bits/stdc++.h>
#define fore(i,l,r)	for(int i=(int)(l);i<(int)(r);++i)
#define fi first
#define se second
#define endl '\n'
#define ull unsigned long long
#define ALL(v) v.begin(), v.end()
#define Debug(x, ed) std::cerr << #x << " = " << x << ed;

const int INF=0x3f3f3f3f;
const long long INFLL=1e18;

typedef long long ll;

const int N = 200005;

struct node{
    int num[3]; //记录是否有效,用于删除自身
    int clr;
    int son[2];
}tree[N * 35];

int cnt;

std::vector<std::pair<int, int>> g[N];
std::pair<int, int> mes[N]; // [异或权值, 颜色]

void insert(int val, int c){ //c: 1黑 2白
    int now = 0;
    for(int i = 30; i >= 0; --i){
        int ch = (val >> i & 1);
        if(!tree[now].son[ch])  tree[now].son[ch] = ++cnt;
        now = tree[now].son[ch];
        tree[now].clr |= c;
        ++tree[now].num[c];
    }
}

void dfs(int u, int fa, int sum, int c){
    insert(sum, c);
    mes[u] = {sum, c};

    for(auto [v, w] : g[u])
        if(v != fa)
            dfs(v, u, sum ^ w, c ^ 3);
}

void erase(int val, int c){
    int now = 0;
    for(int i = 30; i >= 0; --i){
        int ch = (val >> i & 1);
        now = tree[now].son[ch];
        --tree[now].num[c];
    }
}

int query(int w, int c){
    int res = 0;
    int now = 0;
    for(int i = 30; i >= 0; --i){
        int val = (w >> i & 1);
        int son1 = tree[now].son[1];
        int son0 = tree[now].son[0];
        if(!val){
            if(son1 && (tree[son1].clr & c) && tree[son1].num[c]){
                res |= 1 << i;
                now = son1;
            }
            else now = son0;
        }
        else{
            if(son0 && (tree[son0].clr & c) && tree[son0].num[c]){
                res |= 1 << i;
                now = son0;
            }
            else now = son1;
        }
    }

    return res;
}

int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);
    int t;
    std::cin >> t;
    while(t--){
        int n, q;
        std::cin >> n >> q;
        fore(i, 1, n){
            int u, v, w;
            std::cin >> u >> v >> w;
            g[u].push_back({v, w});
            g[v].push_back({u, w});
        }

        dfs(1, 0, 0, 1);

        int xor_sum = 0;
        while(q--){
            char opt;
            std::cin >> opt;
            if(opt == '^'){
                int x;
                std::cin >> x;
                xor_sum ^= x;
            }
            else{

                int v, x;
                std::cin >> v >> x;
                x ^= mes[v].fi;
                erase(mes[v].fi, mes[v].se);

                std::cout << std::max(query(x, mes[v].se), query(x ^ xor_sum, mes[v].se ^ 3)) << ' ';

                insert(mes[v].fi, mes[v].se);
            }
        }

        std::cout << endl;


        fore(i, 0, cnt + 1){
            tree[i].clr = 0;
            tree[i].son[0] = tree[i].son[1] = 0;
            tree[i].num[1] = tree[i].num[2] = 0;
        }
        cnt = 0;
        fore(i, 1, n + 1) g[i].clear();
    }
    return 0;
}

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

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

相关文章

用 Azure OpenAI 服务开发生成式 AI

简介 在当今迅速发展的技术环境中&#xff0c;生成式人工智能&#xff08;AI&#xff09;成为了众多企业创新和优化业务流程的重要工具。微软的 Azure OpenAI 服务为开发生成式 AI 解决方案提供了强大的平台和工具。本文将介绍如何利用 Azure OpenAI 服务开发生成式 AI 解决方…

Flink作业执行之 2.算子 StreamOperator

Flink作业执行之 2.算子 StreamOperator 前文介绍了Transformation创建过程&#xff0c;大多数情况下通过UDF完成DataStream转换中&#xff0c;生成的Transformation实例中&#xff0c;核心逻辑是封装了SimpleOperatorFactory实例。 UDF场景下&#xff0c;DataStream到Transf…

免费听歌,电脑或手机免费听歌,落雪音乐安装详细步骤

近年来&#xff0c;由于资本的力量导致各种收费&#xff0c;看个电视想听歌都必须要付费了&#xff0c;否则你听不完整&#xff0c;吃相非常难看&#xff0c;特别是电视&#xff0c;吸血鬼式吸收各种会员费&#xff0c;各种APP也是铺天盖地的广告&#xff0c;渐渐迷失了自我&am…

【C++】AVL树/红黑树实现及map与set的封装

前言 【C】二叉树进阶&#xff08;二叉搜索树&#xff09; 这篇文章讲述了关于二叉搜索树知识&#xff0c;但是二叉搜索树有其自身的缺陷&#xff0c;假如往树中插入的元素有序或者接近有序&#xff0c;二叉搜索树就会退化成单支树&#xff0c;时间复杂度会退化成O(N)&#xff…

CCAA质量管理体系 (2021)

一、考试大纲 中 国 认 证 认 可 协 会 质量管理体系基础考试大纲 第 1 版 文件编号&#xff1a;CCAA-TR-105-01:2021 发布日期&#xff1a;2021 年 3 月 2 日 实施日期&#xff1a;2021 年 4 月 1 日 质量管理体系基础考试大纲&#xff08;第 1 版&#xff09;1.总则 本大…

大数据集成平台建设方案(Word方案)

基础支撑平台主要承担系统总体架构与各个应用子系统的交互&#xff0c;第三方系统与总体架构的交互。需要满足内部业务在该平台的基础上&#xff0c;实现平台对于子系统的可扩展性。基于以上分析对基础支撑平台&#xff0c;提出了以下要求&#xff1a; 基于平台的基础架构&…

LabVIEW电源适应能力检测系统

随着工业自动化程度的提高&#xff0c;电源质量直接影响设备的稳定运行。利用LabVIEW开发一个单相电源适应能力检测系统&#xff0c;该系统通过智能化和自动化测试&#xff0c;提高了测试效率&#xff0c;减少了人为错误&#xff0c;保证了电源质量的可靠性。 项目背景 在现代…

软件系统设计开发规程(Word文件)

技术解决方案过程包括&#xff1a; 1、选择最佳解决方案&#xff1b; 2、制定架构设计&#xff1b; 3、制定概要设计&#xff1b; 4、制定详细设计和数据库设计&#xff1b; 5、利用准则进行接口设计&#xff1b; 6、实现设计&#xff1b; 7、进行单元测试&#xff1b; 8、进行…

知乎社招1年Go开发123+HR面经,期望22k

面经哥只做互联网社招面试经历分享&#xff0c;关注我&#xff0c;每日推送精选面经&#xff0c;面试前&#xff0c;先找面经哥 一面‍ 0、自我介绍 1、你才工作一年为什么就想找机会了&#xff08;为什么想跳&#xff09;【甩锅给公司&#xff0c;反正不是我的问题】 2、对…

boot项目配置邮箱发送

最近项目准备进入测试阶段&#xff0c;时间相对充沛些&#xff0c;便对邮箱的信息发送记录下&#xff01; 邮箱设置-开启smtp协议及获取授权码 以QQ邮箱为例&#xff0c;其他邮箱大同小异&#xff01; 开启协议 获取授权码 具体代码 基于javax.mail实现 原文可看 前辈帖子…

达梦数据库上市,给数据库国产化加油打气

吉祥学安全知识星球&#x1f517;除了包含技术干货&#xff1a;《Java代码审计》《Web安全》《应急响应》《护网资料库》《网安面试指南》还包含了安全中常见的售前护网案例、售前方案、ppt等&#xff0c;同时也有面向学生的网络安全面试、护网面试等。 作为家乡的企业上市必须…

蓝牙音频解码芯片TD5163介绍,支持红外遥控—拓达半导体

蓝牙芯片TD5163A是一颗支持红外遥控、FM功能和IIS音频输出的蓝牙音频解码芯片&#xff0c;此颗芯片的亮点在于同时支持真立体声&单声道、TWS功能、PWM、音乐频谱和串口AT指令控制等功能&#xff0c;芯片在支持蓝牙无损音乐播放的同时&#xff0c;还支持简单明了的串口发送A…

RTE Open Day 联手 AGI Playground,最先锋 RTE+AI Builders 齐聚北京丨活动招募

6 月 22 日至 23 日&#xff0c;北京&#xff0c;AGI Playground 2024 即将引燃今夏&#xff01; 这场备受瞩目的 AGI 盛会&#xff0c;将汇聚王小川、杨植麟等众多创业者。RTE 开发者社区的 Builders 和 RTE Open Day 也将亮相其中&#xff01; 「有一群人在一起&#xff0c…

云计算【第一阶段(13)】Linux的Find命令

一、查找文件或目录Find 格式 find 查找的范围 类型 查找数据 1.1、常用查找类型 查找类型关键字说明按名称查找-name根据目标文件的名称进行查找&#xff0c;允许使用“*”及“&#xff1f;”通配符按文件大小查找-size根据目标文件的大小进行查找&#xff0c;一般使用…

[华为北向网管NCE开发教程(6)消息订阅

1.作用 之前介绍的都是我们向网管NCE发起请求获取数据&#xff0c;消息订阅则反过来&#xff0c;是网管NCE系统给我们推送信息。其原理和MQ&#xff0c;JMS这些差不多&#xff0c;这里不过多累述。 2.场景 所支持订阅的场景有如下&#xff0c;以告警通知为例&#xff0c;当我…

基于51单片机智能路灯控制—人数、光强

基于51单片机智能路灯控制 &#xff08;仿真&#xff0b;程序&#xff09; 功能介绍 具体功能&#xff1a; 1.光敏电阻与电阻组成分压电路&#xff0c;环境光强度越强&#xff0c;光敏电阻越小&#xff0c;ADC检测的电压越强&#xff1b; 2.红外计数传感器&#xff08;按键…

Introducing Index-1.9B

简介 大家好&#xff0c;今天我们很高兴首次发布Index系列模型中的轻量版本&#xff1a;Index-1.9B系列 本次开源的Index-1.9B 系列包含以下模型&#xff1a; Index-1.9B base : 基座模型&#xff0c;具有 19亿 非词嵌入参数量&#xff0c;在2.8T 中英文为主的语料上预训练&…

01本地图像导入及参数设置

左边工具栏&#xff1a;采集-》图像源&#xff0c;点击后 拉到流程窗口中 在右边有三个按钮可以添加图像和图像文件夹。 双击 图像源 可以打开 参数设置 参数说明&#xff1a; 像素格式&#xff1a;MONO8 表示图像为黑白图像&#xff0c;RGB24为彩色图像。看你想以什么图像打开…

JS手写题解析

手写Promise class MyPromise {constructor(executor) { // executor执行器this.status pending // 等待状态this.value null // 成功或失败的参数this.fulfilledCallbacks [] // 成功的函数队列this.rejectedCallbacks [] // 失败的函数队列const that thisfunction reso…

我的创作纪念日 --- 携手CSDN的512天

起航 时间过得可真快啊&#xff0c;转眼间距离我发的第一篇文章已经有512天了&#xff0c;那是一个寒假&#xff0c;当我发现自己又浑浑噩噩的过完了一个学期时&#xff0c;我才开始思考自己想拥有怎样的人生&#xff0c;然后我就写下了自己的第一篇文章 about me&#xff0c;…