(枚举 + 树上倍增)Codeforces Round 900 (Div. 3) G

news2024/11/20 12:18:35

Problem - G - Codeforces

题意:

思路:

首先,目标值和结点权值是直接联系的,最值不可能直接贪心,一定是考虑去枚举一些东西,依靠这种枚举可以遍历所有的有效情况,思考的方向一定是枚举

如果去直接在链上枚举的话, 复杂度是O(nq),肯定不行

注意到一条路径上的前缀或值不会超过 logV个,因此考虑枚举前缀或值

 

关于每次跳使前缀或值变化的最深的点,我是这样理解的

如果考虑在链上枚举,如果前缀或值不变,那么这样的枚举是无效的,我们直接考虑跳着枚举,只枚举所有有效情况

关于怎么跳其实可以参考树上倍增往上跳的跳法,记录一个数组指向下一个结点,在dfs上维护即可,有点像在树链上DP

Code:

#include <bits/stdc++.h>

#define int long long

constexpr int N = 2e5 + 10;

std::vector<int> adj[N];

int n;
int a[N];
int dep[N];
int f[N][33], s[N][33], lst[N][33];

void dfs(int u, int fa) {
    dep[u] = dep[fa] + 1;
    f[u][0] = fa;
    for (int j = 1; j <= 30; j ++) f[u][j] = f[f[u][j - 1]][j - 1];
    int val = a[u];
    for (int j = 30; j >= 0; j --) {
        if (!((val >> j) & 1)) {
            lst[u][j] = lst[fa][j];
            s[u][j] = s[fa][j];
        }else {
            lst[u][j] = u;
            s[u][j] = s[fa][j] + 1;
        }
    }
    for (auto v : adj[u]) {
        if (v == fa) continue;
        dfs(v, u);
    }
}
int lca(int u, int v) {
    if (dep[u] < dep[v]) std::swap(u, v);
    for (int j = 30; j >= 0; j --) {
        if (dep[f[u][j]] >= dep[v]) {
            u = f[u][j];
        }
    }
    if (u == v) return u;
    for (int j = 30; j >= 0; j --) {
        if (f[u][j] != f[v][j]) {
            u = f[u][j];
            v = f[v][j];
        }
    }
    return f[u][0];
}
int calc(int x, int y, int lca) {
    int res = 0;
    for (int j = 0; j <= 30; j ++) {
        if (s[x][j] + s[y][j] - s[lca][j] - s[f[lca][0]][j]) res ++;
    }
    return res;
}
void solve() {
    std::cin >> n;
    for (int i = 1; i <= n; i ++) {
        adj[i].clear();
        dep[i] = 0;
        for (int j = 30; j >= 0; j --) {
            f[i][j] = s[i][j] = lst[i][j] = 0;
        }
    }
    for (int i = 1; i <= n; i ++) std::cin >> a[i];
    for (int i = 1; i <= n - 1; i ++) {
        int u, v;
        std::cin >> u >> v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    dfs(1, 0);

    int q;
    int ans = 0;
    std::cin >> q;
    while(q --) {
        int x, y;
        std::cin >> x >> y;
        int cur = x, val = a[x];
        ans = 0;
        while(1) {
            int nxt = 0, mx = 0;
            ans = std::max(ans, calc(x, cur, lca(x, cur)) + calc(cur, y, lca(cur, y)));
            for (int j = 30; j >= 0; j --) {
                if (!((val >> j) & 1)) {
                    if (dep[lst[cur][j]] >= dep[lca(x, y)]) {
                        if (dep[lst[cur][j]] > mx) {
                            mx = dep[lst[cur][j]];
                            nxt = lst[cur][j];
                        }
                    }
                }
            }
            if (!mx) break;
            val |= a[nxt];
            cur = nxt;
        }
        cur = y, val = a[y];
        while(1) {
            int nxt = 0, mx = 0;
            ans = std::max(ans, calc(x, cur, lca(x, cur)) + calc(cur, y, lca(cur, y)));
            for (int j = 30; j >= 0; j --) {
                if (!((val >> j) & 1)) {
                    if (dep[lst[cur][j]] >= dep[lca(x, y)]) {
                        if (dep[lst[cur][j]] > mx) {
                            mx = dep[lst[cur][j]];
                            nxt = lst[cur][j];
                        }
                    }
                }
            }
            if (!mx) break;
            val |= a[nxt];
            cur = nxt;
        }
        std::cout << ans << " ";
    }
    std::cout << "\n";
}
signed main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);

    int t = 1;
    std::cin >> t;
    while(t --) {
        solve();
    }
    return 0;
}

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

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

相关文章

云安全之等级保护介绍

网络安全部门概述 网络安全部门 1. 公安部 网安/网警/网监:全称“公共信息网络安全监察”&#xff0c;后改为“网络安全保卫部门”。 简称网监&#xff0c;是中华人民共和国公安部门的一项职责&#xff0c;具体实施这一职责的机构称为网监机关或网监部门(公共信息网络安全监…

kubernetes集群kubeadm方式安装

测试网络和DNS解析 kubectl run busybox --image busybox:1.28 --restart=Never --rm -it busybox -- sh ping www.baidu,com nslookup kubernetes.default.svc.cluster.localbusybox要用指定的1.28版本,不能用最新版本,最新版本,nslookup会解析不到dns和ip 延长kubernetes…

2023腾讯云轻量应用服务器和普通服务器有什么区别?

腾讯云轻量服务器和云服务器有什么区别&#xff1f;为什么轻量应用服务器价格便宜&#xff1f;是因为轻量服务器CPU内存性能比云服务器CVM性能差吗&#xff1f;轻量应用服务器适合中小企业或个人开发者搭建企业官网、博客论坛、微信小程序或开发测试环境&#xff0c;云服务器CV…

力扣 -- 279. 完全平方数(完全背包问题)

解题步骤&#xff1a; 参考代码&#xff1a; 未优化代码&#xff1a; class Solution { public:int numSquares(int n) {const int INF0x3f3f3f3f;int msqrt(n);//多开一行&#xff0c;多开一列vector<vector<int>> dp(m1,vector<int>(n1));//初始化第一行…

苹果ios系统ipa文件企业签名是什么?优势是什么?什么场合需要应用到?

企业签名是苹果开发者计划中的一种签名类型&#xff0c;允许企业开发者签署和分发企业内部使用的应用程序&#xff0c;而无需通过App Store进行公开发布。通过企业签名&#xff0c;企业可以在内部部署自己的应用程序&#xff0c;以满足特定的业务需求。 企业签名能够做到以下…

【Java 进阶篇】JDBC工具类详解

JDBC&#xff08;Java Database Connectivity&#xff09;是Java程序与数据库之间交互的标准接口&#xff0c;它允许Java应用程序连接到不同类型的数据库并执行数据库操作。在实际开发中&#xff0c;为了提高代码的可维护性和可重用性&#xff0c;通常会创建JDBC工具类来封装与…

【算法导论】线性时间排序(计数排序、基数排序、桶排序)

引言&#xff1a;   在排序的最终结果中&#xff0c;个元素的次序依赖于它们之间的比较&#xff0c;我们把这类排序算法称为比较排序&#xff0c;对于包含n个元素的输入序列来说&#xff0c;任何比较排序在最坏情况下都要经过 Ω ( n l g n ) \Omega(nlgn) Ω(nlgn)次比较&a…

【RuoYi项目分析】在RuoYi网关实现验证码功能

文章目录 1. 验证码功能的类清单2. 验证码的实现2.1. 验证码的获取2.2. 验证码的校验 3. 总结4. 资料参考 本文主要介绍了用户如何实现验证码&#xff0c;以及该功能如何与 Spring Gateway 联系起来。 1. 验证码功能的类清单 类功能CaptchaProperties验证码的 yml 配置Captcha…

算法-数学-斜率-直线上最多的点数

算法-数学-斜率-直线上最多的点数 1 题目概述 1.1 题目出处 https://leetcode.cn/problems/max-points-on-a-line/ 1.2 题目描述 给你一个数组 points &#xff0c;其中 points[i] [xi, yi] 表示 X-Y 平面上的一个点。求最多有多少个点在同一条直线上。 2 暴力搜索斜率…

Go 基本数据类型和 string 类型介绍

Go 基础之基本数据类型 文章目录 Go 基础之基本数据类型一、整型1.1 平台无关整型1.1.1 基本概念1.1.2 分类有符号整型&#xff08;int8~int64&#xff09;无符号整型&#xff08;uint8~uint64&#xff09; 1.2 平台相关整型1.2.1 基本概念1.2.2 注意点1.2.3 获取三个类型在目标…

postgresql-自增字段

postgresql-自增字段 标识列IdentitySerial类型Sequence序列 标识列Identity -- 测试表 create table t_user( -- 标识列自增字段user_id integer generated always as identity primary key,user_name varchar(50) not null unique );-- 自动生成序列 CREATE SEQUENCE public…

学位论文的写作方法,较好的参考文章

摘要 结合2个文章&#xff1a; [1]程鑫. 网联环境下交通状态预测与诱导技术研究[D]. 长安大学, 2017. [2]吴昊. 关中平原水资源变化特征与干旱脆弱性研究[D]. 长安大学, 2018. 主要研究内容及技术路线 各章小结和引言的写作 [1]程鑫. 网联环境下交通状态预测与诱导技术…

一文拿捏分布式协调Redis客服端-Redisson

Redisson 1.介绍 Redisson - 是一个高级的分布式协调Redis客服端 , 专注于分布式系统开发&#xff0c;让用户可以在分布式系统中很方便的去使用Redis。 2.相关使用 1.加锁 //底层是lua脚本保证了加锁的原子性 // 一直等待获取锁&#xff0c;直到获取到锁为止! 默认锁的存活…

【SimpleDateFormat】线程不安全问题分析及解决方案

前言 在日常开发中&#xff0c;我们经常需要去做日期格式转换&#xff0c;可能就会用到SimpleDateFormat类。但是&#xff0c;如果使用不当&#xff0c;就很容易引发生产事故&#xff01; 1. 问题推演 1.1 初始日期工具类 刚开始的日期转换工具类可能长这样&#xff1a; p…

nodejs+vue晓海网上订餐系统elementui

管理员功能需求 管理员登陆后&#xff0c;主要模块包括首页、个人中心、用户管理、菜单信息管理等功能。 第三章 系统分析 10 3.1需求分析 10 3.2可行性分析 10 3.2.1技术可行性&#xff1a;技术背景 10 3.2.2经济可行性 11 3.2.3操作可行性&#xff1a; 11 3.3性能分析 11 3.4…

创建GCP service账号并管理权限

列出当前GCP项目的所有service account 我们可以用gcloud 命令 gcloud iam service-accounts list gcloud iam service-accounts list DISPLAY NAME EMAIL DISABLED terraform …

数据结构 1.1 初学数据结构

数据结构的基本概念 数据结构在学什么&#xff1f; 如何用程序代码把现实世界的问题信息化 如何用计算机高效处理信息从而创造价值 数据&#xff1a; 数据元素、数据项&#xff1a; 数据元素——描述一个个体 数据对象——数据元素之间具有同样的性质 同一个数据对象里的数…

BGP高级特性——4字节AS号

目录 4字节AS号 相关概念 两种过渡属性 4字节AS号的格式 4字节AS号建立邻居 4字节AS号路由传递 配置命令 4字节AS号 相比于2字节AS号&#xff0c;范围更大。由1~65535扩展到1~4294967295 支持4字节AS号的BGP设备兼容仅支持2字节AS号的BGP设备 相关概念 Speaker&#…

13链表-简单思路练习

目录 LeetCode之路——876. 链表的中间结点 分析&#xff1a; 解法一&#xff1a;常规思路 解法二&#xff1a;快慢指针 LeetCode之路——876. 链表的中间结点 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回…

详解Linux的系统调用fork()函数

在Linux系统中&#xff0c;fork()是一个非常重要的系统调用&#xff0c;它的作用是创建一个新的进程。具体来说&#xff0c;fork()函数会在当前进程的地址空间中复制一份子进程&#xff0c;并且这个子进程几乎完全与父进程相同&#xff0c;包括进程代码、数据、堆栈以及打开的文…