CF1413F. Roads and Ramen(树的直径,线段树)

CF1413F. Roads and Ramen

Solution

感觉这个套路也见过许多次了?大概这种奇奇怪怪的树上最长路径的题都得往直径靠一靠。

大概有个结论是:存在一个最优路径使得其起始点和直径起始点有交。

然后我们只需要求出一个直径的起始点A,BA,BA,B,分别维护以A,BA,BA,B为根的树到其他点的边权异或和以及最长路径,上线段树就行了。

时间复杂度O(n+qlog⁡n)O(n+q\log n)O(n+qlogn)

Code

#include <bits/stdc++.h>using namespace std;template<typename T> inline bool upmin(T &x, T y) { return y < x ? x = y, 1 : 0; }
template<typename T> inline bool upmax(T &x, T y) { return x < y ? x = y, 1 : 0; }#define MP(A,B) make_pair(A,B)
#define PB(A) push_back(A)
#define SIZE(A) ((int)A.size())
#define LEN(A) ((int)A.length())
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define fi first
#define se secondtypedef long long ll;
typedef unsigned long long ull;
typedef long double lod;
typedef pair<int, int> PR;
typedef vector<int> VI; const lod eps = 1e-9;
const lod pi = acos(-1);
const int oo = 1 << 30;
const ll loo = 1ll << 60;
const int mods = 1e9 + 7;
const int inv2 = (mods + 1) >> 1;
const int MAXN = 2005;
const int INF = 0x3f3f3f3f; //1061109567
/*--------------------------------------------------------------------*/namespace FastIO{constexpr int SIZE = (1 << 21) + 1;int num = 0, f;char ibuf[SIZE], obuf[SIZE], que[65], *iS, *iT, *oS = obuf, *oT = obuf + SIZE - 1, c;#define gc() (iS == iT ? (iT = ((iS = ibuf) + fread(ibuf, 1, SIZE, stdin)), (iS == iT ? EOF : *iS ++)) : *iS ++)inline void flush() {fwrite(obuf, 1, oS - obuf, stdout);oS = obuf;}inline void putc(char c) {*oS ++ = c;if (oS == oT) flush();}inline void getc(char &c) {for (c = gc(); !isalpha(c) && c != EOF; c = gc());}inline void reads(char *st) {char c;int n = 0;getc(st[++ n]);for (c = gc(); isalpha(c) ; c = gc()) st[++ n] = c;st[n + 1] = '\0';}template<class I>inline void read(I &x) {for (f = 1, c = gc(); c < '0' || c > '9' ; c = gc()) if (c == '-') f = -1;for (x = 0; c >= '0' && c <= '9' ; c = gc()) x = (x << 3) + (x << 1) + (c & 15);x *= f;}template<class I>inline void print(I x) {if (x < 0) putc('-'), x = -x;if (!x) putc('0');while (x) que[++ num] = x % 10 + 48, x /= 10;while (num) putc(que[num --]);}struct Flusher_{~Flusher_(){flush();}} io_Flusher_;
}
using FastIO :: read;
using FastIO :: putc;
using FastIO :: reads;
using FastIO :: print;PR E[MAXN];
vector<PR> e[MAXN];
int id[MAXN], dfnA[MAXN], dfnB[MAXN], dep[MAXN], depA[MAXN], depB[MAXN], fnsA[MAXN], fnsB[MAXN], col[MAXN], MX, ID, DFN = 0, A, B;void dfsA(int x, int father) {id[dfnA[x] = ++ DFN] = x;if (dep[x] > MX) MX = dep[x], ID = x;for (auto v : e[x]) {if (v.fi == father) continue;col[v.fi] = col[x] ^ v.se, dep[v.fi] = dep[x] + 1, dfsA(v.fi, x);}fnsA[x] = DFN;
}
void dfsB(int x, int father) {id[dfnB[x] = ++ DFN] = x;if (dep[x] > MX) MX = dep[x], ID = x;for (auto v : e[x]) {if (v.fi == father) continue;col[v.fi] = col[x] ^ v.se, dep[v.fi] = dep[x] + 1, dfsB(v.fi, x);}fnsB[x] = DFN;
}struct Segment_Tree {int tag[MAXN << 2], s[MAXN << 2][2];void down(int x) {if (tag[x]) {tag[x << 1] ^= 1, swap(s[x << 1][0], s[x << 1][1]);tag[x << 1 | 1] ^= 1, swap(s[x << 1 | 1][0], s[x << 1 | 1][1]);tag[x] = 0;}}void up(int x) {s[x][0] = max(s[x << 1][0], s[x << 1 | 1][0]);s[x][1] = max(s[x << 1][1], s[x << 1 | 1][1]);}void build(int x, int l, int r) {if (l == r) {s[x][col[id[l]]] = dep[id[l]];s[x][col[id[l]] ^ 1] = -INF;return;}int mid = (l + r) >> 1;build(x << 1, l, mid);build(x << 1 | 1, mid + 1, r);up(x);}void update(int x, int l, int r, int L, int R) {if (l >= L && r <= R) {tag[x] ^= 1;swap(s[x][0], s[x][1]);return;}down(x);int mid = (l + r) >> 1;if (R <= mid) update(x << 1, l, mid, L, R);else if (L > mid) update(x << 1 | 1, mid + 1, r, L, R);else update(x << 1, l, mid, L, mid), update(x << 1 | 1, mid + 1, r, mid + 1, R);up(x);}void print(int x, int l, int r) {if (l == r) { cout << id[l] << ":" << s[x][0] << endl; return; }int mid = (l + r) >> 1;down(x);print(x << 1, l, mid);print(x << 1 | 1, mid + 1, r);}
} TA, TB;
signed main() {
#ifndef ONLINE_JUDGEfreopen("a.in", "r", stdin);
#endifint n;read(n);for (int i = 1, u, v, c; i < n ; ++ i) {read(u), read(v), read(c);e[u].PB(MP(v, c));e[v].PB(MP(u, c));E[i] = MP(u, v);}DFN = MX = ID = col[1] = dep[1] = 0, dfsA(1, 0), A = ID;DFN = MX = ID = col[A] = dep[A] = 0, dfsA(A, 0), B = ID;TA.build(1, 1, n);for (int i = 1; i <= n ; ++ i) depA[i] = dep[i];DFN = MX = ID = col[B] = dep[B] = 0, dfsB(B, 0);TB.build(1, 1, n);for (int i = 1; i <= n ; ++ i) depB[i] = dep[i];int Case;read(Case);while (Case --) {int x;read(x);int u = E[x].fi, v = E[x].se;if (depA[u] < depA[v]) swap(u, v);TA.update(1, 1, n, dfnA[u], fnsA[u]);if (depB[u] < depB[v]) swap(u, v);TB.update(1, 1, n, dfnB[u], fnsB[u]);print(max(TA.s[1][0], TB.s[1][0])), putc('\n');}return 0;
}

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

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

相关文章

微软发布 VS Code Java 安装程序,一键安装所有 Java 开发环境

北京时间 2019 年 6 月 14 日 &#xff0c;微软发布了 VS Code Java 安装程序&#xff0c;方便开发者能一键安装所有 Java 开发环境。几乎是在三年前&#xff0c;在微软苏黎世办公室的编程马拉松中&#xff0c;来自 Red Hat&#xff0c;IBM&#xff0c;Codenvy 和 Microsoft 的…

CF1361C. Johnny and Megan‘s Necklace(构造,欧拉回路,传递闭包)

CF1361C. Johnny and Megan’s Necklace Solution 真duliu&#xff0c;快做吐了。。。 刚开始想了一个假做法&#xff08;但前面还是很真的&#xff09;。 假的做法大概是你发现这个东西具有传递性&#xff0c;因此你考虑把aia_iai​翻转后在后面补0直到20位之后&#xff0…

Codeforces Round #601 (Div. 2) E2. Send Boxes to Alice (Hard Version) 思维 + 质因子

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 大体题意跟easyeasyeasy版本差不多&#xff0c;就是hardhardhard版本的aaa范围更大。见这里Codeforces Round #601 (Div. 2) 思路&#xff1a; 首先还是考虑质因子分解&#xff0c;因为一个数被分成以xyxy…

[译]C#中的条件断点

这只是你们许多人中可能使用的一个简单技巧。这是一个小但非常强大的技巧&#xff0c;在你调试大型代码库时尤其有用。这是条件断点的概念。正如名称本身所暗示的那样&#xff0c;只有在满足某个条件时才会设置被击中的断点。它也很容易实现。创建一个新的应用程序并设置一个普…

CF1090F - How to Learn You Score(构造)

CF1090F - How to Learn You Score Solution 很不戳的构造题。 首先观察数据范围&#xff1a;n∈[5,1000]n\in[5,1000]n∈[5,1000]&#xff0c;这启发我们什么&#xff1f;n5n5n5的时候解是唯一的&#xff0c;因此我们可以把nnn切成若干段长度为555的段&#xff0c;每一段分…

前菜---二叉树+堆的小练习

目录 前言&#x1f3dc;️ 1. 二叉树性质总结⛱️ 1.2 性质3⏰ 2. 二叉树性质小练习&#x1f3d5;️ 3. 答案解析&#x1f4a1; 4. 堆概念结构小练习&#x1fa94; 5. 答案解析&#x1f9ff; 6. 前/中/后/层序遍历小练习&#x1f52b; 7. 答案解析&#x1f9fa; 后语…

牛客 CCA的区间 dp + 补集转移

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 首先翻转一个区间意味着可以将任意两段不相交的区间组合&#xff0c;所以问题变成了选两端不相交的区间&#xff0c;使得合并后区间和最大。那么我们就处理出来区间&#xff0c;让后进行转…

ASP.NET Core IP 请求频率限制

在网站或API应用中&#xff0c;我们为了防止无聊人士或恶意攻击&#xff0c;通常希望屏蔽某一IP短时间的内高频率请求。在ASP.NET Core中&#xff0c;限制IP请求频率非常简单&#xff0c;我们来看看吧。轮子一个.NET Core 目前的生态发展十分迅猛&#xff0c;轮子也越来越多。只…

2019 秦皇岛 I - Invoker Gym - 102361I dp

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 累了&#xff0c;略。 思路&#xff1a; 将这101010个串打乱顺序&#xff0c;每个串最多有666种情况&#xff0c;全部写出来&#xff0c;让后连边。最后直接在转移的时候分别从上一个字符的666个状态转移就…

CF1016G. Appropriate Team(Pollard-pho,FWT,数论)

CF1016G. Appropriate Team Solution 相当于选出的两个数需要满足不存在一个质因子ppp&#xff0c;aia_iai​在ppp的指数比XXX多&#xff0c;aja_jaj​在ppp的指数比YYY少。 我们用Pollard−phoPollard-phoPollard−pho求出YYY所有最多151515个质因数&#xff0c;然后把所有…

Exceptionless - .Net Core开源日志框架

作者&#xff1a;markjiang7m2原文地址&#xff1a;https://www.cnblogs.com/markjiang7m2/p/11020140.html官网地址&#xff1a;http://letyouknow.net今天要给大家介绍的Exceptionless是一个基于 .net core的开源日志框架&#xff0c;Exceptionless的意思是&#xff1a;没有异…

CF981E Addition on Segments 线段树分治 + bitset优化

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 我们考虑如果我们选择的区间都包含某个位置&#xff0c;那么这个位置一定是最大值。那么对于每个位置&#xff0c;我们枚举包含其的区间&#xff0c;让后每次加xxx都用bitsetbitsetbitset来…

CF1146F - Leaf Partition(树形dp)

CF1146F - Leaf Partition Solution 感觉做这种细节很多的分类讨论树形dp还是有点乱。 大概有一个naivenaivenaive的想法是&#xff0c;我们令fx,0/1f_{x,0/1}fx,0/1​表示以xxx为根的子树&#xff0c;xxx结点有没有颜色的方案数。 然后如果存在两个有颜色的儿子&#xff0…

开源基于Canal的开源增量数据订阅消费中间件

canal 是阿里巴巴开源的一款基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持了MySQL(也支持mariaDB)。我开发的这个CanalSync项目 https://github.com/yuzd/CanalSync >觉得不错帮忙给个star谢谢是基于canal-server之上的数据库同步&消费中间件&#…

E2. Square-free division (hard version) dp + 质因子分解

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你长度为nnn的数组&#xff0c;让后最多修改其中kkk个数(可以修改为任意数)&#xff0c;让后问你分成的最少组是多少。这个组内元素是连续的且不存在任意两个数的积为平方数。 思路&#xff1a; 首先两个…

CF1000G. Two-Paths(树形dp)

CF1000G. Two-Paths Solution 我们发现除了树上(x,y)(x,y)(x,y)最短路径上的边经过一次&#xff0c;其余边要么走000次&#xff0c;要么走222次。 因此考虑先假设每条边走两次&#xff0c;最后把走一次的边的贡献加上。 我们把从(x,y)(x,y)(x,y)路径上的点扩展出去连痛块的…

不装 VS 自己编译安装 Windows Terminal

Windows Terminal 一直没有发布可以直接安装的二进制文件&#xff0c;想自行编译的时候&#xff0c;看到系统需求中包含体积巨大的 Visual Studio 和 Windows SDK&#xff0c;脑袋都大了。直接下载其他人编译好的安装包又不放心&#xff0c;那么就想个办法避免在本地环境编译吧…

Codeforces Round #604 (Div. 2) E. Beautiful Mirrors 期望dp

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 要从111走到nnn&#xff0c;每次成功走下去的概率为pi100\frac{p_i}{100}100pi​​&#xff0c;如果不成功那就回到111号点继续走。问走完nnn个点的期望是多少。 思路&#xff1a; 以前见过这种失败了就回…

带你了解C#每个版本新特性

上学时学习C#和.NET&#xff0c;当时网上的资源不像现在这样丰富&#xff0c;所以去电脑城买了张盗版的VS2005的光盘&#xff0c;安装时才发现是VS2003&#xff0c;当时有一种被坑的感觉&#xff0c;但也正是如此&#xff0c;让我有了一个完整的.NET的学习生涯。一直都认为学习…

Educational Codeforces Round 106 (Rated for Div. 2) D. The Number of Pairs 数论gcd

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给三个数c,d,xc,d,xc,d,x&#xff0c;求满足c∗lcm(a,b)−d∗gcd(a,b)xc*lcm(a,b)-d*gcd(a,b)xc∗lcm(a,b)−d∗gcd(a,b)x条件的(a,b)(a,b)(a,b)的数量。 思路&#xff1a; 考虑将lcm(a,b)lcm(a,b)lcm(a,b…