我想要原石

然而,由于提瓦特大陆实在是太大了,游戏中设置了许多传送锚点。众所周知,每个传送锚点附近都有若干个原石(其实并没有),曾经有一位丰富经验的旅行者开辟了 \(n−1\) 条路和 \(n\) 个由路连通的传送锚点。为了便于后续的旅行者知道地图上原石的分布情况,他决定给旅行者一些提示,但是他没有直接将每个传送锚点附近的原石标注,而是标注了他所走过的路径的权值来考验后续的旅行者。对于一条路径连接的两个点 \(u,v\) 其权值为:点 \(u\) 的原石数量异或点 \(v\) 的原石数量。

现在你来到了这片提瓦特大陆,但是你现在只有一次传送机会——即你可以选择一个传送锚点并到达,并且你将知道这个点的原石数量,请聪明的你回答这 \(n\) 个传送锚点附近原石数量的异或和。

你需要回答 \(q\) 次询问,每次询问告诉你传送的点及该点所有的原石数量,请你根据已有信息推断出这 \(n\) 个传送锚点附近原石数量的异或和。

题解:换根\(DP\)

  • 容易发现,当我们知道\(u\)的值后,那么\(v\)的值就是\(u\)的值异或上\(u\)到\(v\)路径上所有边权
  • 那么容易发现,如果一条边对答案的贡献为:下边的节点的子树大小
  • 所以我们可以先以任意一个点为根,\(dfs\)求出所有点的子树大小,并树形\(dp\)求出根节点的答案值
  • 然后我们在通过\(dfs\)换根\(dp\)自上而下求出所有点的答案
  • 那么在询问的时候,如果\(n\)为偶数,答案还要异或上\(x\),否则直接输出,\(O(1)\)
#include <bits/stdc++.h>
#define Zeoy std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0)
#define all(x) (x).begin(), (x).end()
#define rson id << 1 | 1
#define lson id << 1
#define int long long
#define mpk make_pair
#define endl '\n'
using namespace std;
typedef unsigned long long ULL;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<double, double> pdd;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + 7;
const double eps = 1e-9;
const int N = 2e5 + 10, M = 4e5 + 10; int n, q;
vector<pii> g[N];
int ans[N];
int sz[N];
int res; void dfs(int u, int par)
{
sz[u] = 1;
for (auto [v, w] : g[u])
{
if (v == par)
continue;
dfs(v, u);
sz[u] += sz[v];
if (sz[v] % 2 == 1)
res ^= w;
}
} void DFS(int u, int par)
{
for (auto [v, w] : g[u])
{
if (v == par)
continue;
if ((sz[u] - sz[v] + n - sz[u]) % 2 == 1 && sz[v] % 2 == 0)
ans[v] = ans[u] ^ w;
else if ((sz[u] - sz[v] + n - sz[u]) % 2 == 0 && sz[v] % 2 == 1)
ans[v] = ans[u] ^ w;
DFS(v, u);
}
} void solve()
{
cin >> n;
for (int i = 1; i < n; ++i)
{
int u, v, w;
cin >> u >> v >> w;
g[u].push_back({v, w});
g[v].push_back({u, w});
}
dfs(1, 0);
for (int i = 1; i <= n; ++i)
ans[i] = res;
DFS(1, 0);
cin >> q;
while (q--)
{
int u, x;
cin >> u >> x;
if (n % 2)
cout << (ans[u] ^ x) << endl;
else
cout << ans[u] << endl;
}
}
signed main(void)
{
Zeoy;
int T = 1;
// cin >> T;
while (T--)
{
solve();
}
return 0;
}

2023-05 多校联合训练 HZNU站的更多相关文章

  1. 2017多校联合训练2—HDU6054--Is Derek lying?(思维题)

    Is Derek lying? Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  2. NFLSOJ 1072 - 【2021 六校联合训练 NOIP #1】异或(FWT+插值)

    题面传送门 一道非常不错的 FWT+插值的题 %%%%%%%%%%%% 还是那句话,反正非六校的看不到题对吧((( 方便起见在下文中设 \(n=2^d\). 首先很明显的一点是这题涉及两个维度:异或和 ...

  3. NFLSOJ 1060 - 【2021 六校联合训练 NOI #40】白玉楼今天的饭(子集 ln)

    由于 NFLSOJ 题面上啥也没有就把题意贴这儿了( 没事儿,反正是上赛季的题,你们非六校学生看了就看了,况且看了你们也没地方交就是了 题意: 给你一张 \(n\) 个点 \(m\) 条边的图 \(G ...

  4. 2016多校联合训练4 F - Substring 后缀数组

    Description ?? is practicing his program skill, and now he is given a string, he has to calculate th ...

  5. 2014 多校联合训练赛6 Fighting the Landlords

    本场比赛的三个水题之一,题意是两个玩家每人都持有一手牌,问第一个玩家是否有一种出牌方法使得在第一回和对方无牌可出.直接模拟即可,注意一次出完的情况,一开始没主意,wa了一发. #include< ...

  6. 2016多校联合训练contest4 1012Bubble Sort

    Bubble Sort Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Tota ...

  7. hdu 4649 Professor Tian 多校联合训练的题

    这题起初没读懂题意,悲剧啊,然后看了题解写完就AC了 题意是给一个N,然后给N+1个整数 接着给N个操作符(只有三种操作  即  或 ,与 ,和异或 |   &  ^ )这样依次把操作符插入整 ...

  8. HDU OJ 5317 RGCDQ( 2015多校联合训练第3场) 暴力打表+小技巧

    题目连接:Click here 题意:在一个[L,R]内找到最大的gcd(f[i],f[j])其中L<=i<j<=R,f[x]表示i分解质因数后因子的种类数.eg:f[10]=2(1 ...

  9. HDU OJ 5326 Work( 2015多校联合训练第3场) 并查集

    题目连接:戳ME #include <iostream> #include <cstdio> #include <cstring> using namespace ...

  10. HDU 4643 GSM 暑期多校联合训练第五场 1001

    点击打开链接 我就不说官方题解有多坑了 V图那么高端的玩意儿 被精度坑粗翔了 AC前 AC后 简直不敢相信 只能怪自己没注意题目For the distance d1 and d2, if fabs( ...

随机推荐

  1. CSS – background and styling img

    前言 之前写过一些: W3Schools 学习笔记 (2) – CSS Image Sprites W3Schools 学习笔记 (3) – CSS Styling Images & CSS ...

  2. 前端基本功——面试必问系列(1):都2024了,还没吃透Promise?一文搞懂

    写在前面: 大家好,我是山里看瓜,该系列文章是为了帮助大家不管面试还是开发对前端的一些基本但是很重要的知识点认识更加深入和全面. 想写这个系列文章的初衷是:我发现前端的很多基本知识,使用起来很简单,定 ...

  3. C#|.net core 基础 - 值传递 vs 引用传递

    不知道你在开发过程中有没有遇到过这样的困惑:这个变量怎么值被改?这个值怎么没变? 今天就来和大家分享可能导致这个问题的根本原因值传递 vs 引用传递. 在此之前我们先回顾两组基本概念: 值类型 vs ...

  4. JAVAEE——MySQL安装

    一.下载MySQL(两种方式) 1.官网下载 官网下载地址:https://www.mysql.com/downloads   2.点击下载(版本:mysql-8.0.28-winx64) 链接:ht ...

  5. 暑假集训CSP提高模拟2

    A.活动投票 主元素问题,用摩尔投票 #include<bits/stdc++.h> using namespace std; int n,a=-1,acnt,x; int main(){ ...

  6. MySQL故障诊断常用方法手册(含脚本、案例)

    当你在使用MySQL数据库时,突然遇到故障,你是否会感到迷茫? ● 数据库响应变慢.SQL慢.数据库插入出现延时-- ● 表不见了.日志出现多个断连记录-- ● 非法断电造成MySQL启动报错.同步复 ...

  7. 封装一个Promise.all 的函数

    // 1. 准备三个异步函数 const promise1 = Promise.resolve('prom11ise1'); const promise2 = new Promise(function ...

  8. day16-break,continue,goto

    break,continue,goto break在任何循环语句的主体部分,均可用break控制循环的流程.break用于强行退出循环,不执行循环中剩余的语句.(break语句也在switch选择语句 ...

  9. 一、Tomcat基础知识与运行原理

    本章节为介绍如何安装Tomcat工具以及其主要架构知识概念,深入浅出让新人玩家理解为什么选择该容器以及该容器的优点 web服务器 概念 服务器:安装了服务器软件的计算机 服务器软件:接收用户的请求,处 ...

  10. Top100(下)

    Top100(下) 栈 20. 有效的括号 bool isValid(char *s) { int len = strlen(s); if (len % 2 == 1) return false; / ...