记录美好生活 艹

Red Black Tree

 磨磨蹭蹭地写虚树,结果半天没出来。大佬说 二分 求公共节点的lca,一下就出来了
 二分就是取那些要变更的点的lca 然后判断这样log^2,好像也可以排序差分区间和弄到log,虚树就是暴力枚举然后换根dp,没弄好debug一下午。




虚树

// 基本没啥用就 两个函数是要想的,其他都是虚树构造必须虚树构造相关操作
void dfs(int u, int f);
int lca(int u, int v);
LL build(int n);需要思考的操作
LL dfs(int u);  // 处理 ma ,K 和 L;
LL df(int u, LL k); int h[N], ne[N<<1], e[N<<1], w[N<<1], idx;
void add(int a, int b, int c){e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;return ;}int dfn[N], cv, fa[N][20], deep[N]; 
LL mi[N], ma[N], K[N], L[N], de[N]; 
// mi[i] i点的值, ma[i] i为根的子树的值的最大值;
// K[i] 以i为根的子树 到i的路径上有红色点的值的最大值,L[i] 以i为根的子树 到 i的路径上没有红色点的值的最大值
// de[i] i 到 整棵树的根节点的路径和, 用来判断 两点之间是否有红色点;
bool c[N];	// = 1 代表是红色点 void dfs(int u, int f) // 预处理 mi lca 
{dfn[u] = cv ++; deep[u] = deep[f] + 1;for(int i = 1;i < 20;i ++) fa[u][i] = fa[fa[u][i-1]][i-1];for(int i = h[u];~i ;i = ne[i]){if(e[i] == f)continue;fa[e[i]][0] = u; mi[e[i]] = c[e[i]] ? 0 : mi[u] + w[i]; de[e[i]] = de[u] + w[i];dfs(e[i], u);}
}int lca(int u, int v)
{if(deep[u]<deep[v])swap(u, v);int x = deep[u] - deep[v];for(int i = 0;i < 20;i ++)if(x>>i&1)u = fa[u][i];if(u == v)return v;for(int i = 19;i >= 0;i --)if(fa[u][i] != fa[v][i])u = fa[u][i], v = fa[v][i];return fa[u][0];
}
int a[N];
bool dis[N];
bool cmp(int a,int b){return dfn[a]<dfn[b];}bool in(int u, int v){return !c[u] && mi[v] - mi[u] == de[v] - de[u];} // 判断 u -> v 是否有红色节点。
LL dfs(int u)  // 处理 ma ,K 和 L;
{ma[u] = K[u] = L[u] = 0;if(dis[u]) ma[u] = mi[u], (c[u] ? K[u] = mi[u] : L[u] = mi[u]);   for(int i = h[u]; ~i;i = ne[i]){ma[u] = max(ma[u], dfs(e[i]));	K[u] = max(K[u], K[e[i]]);in(u, e[i]) ?  L[u] = max(L[u], L[e[i]]) : K[u] = max(K[u], L[e[i]]);}return ma[u];
}// 处理答案 k 是 以u为根的树之外的 节点的值 的 最大值;
// 那么 把 u 作为 红色节点的答案 = max(k, max(K[u], L[u]-mi[i]));
LL df(int u, LL k) 
{vector<LL> v, m; for(int i = h[u]; ~i;i = ne[i])v.push_back(ma[e[i]]), m.push_back(ma[e[i]]);for(int i = 1;i < v.size();i ++) v[i] = max(v[i], v[i-1]);for(int i = m.size()-2;i >= 0;i --) m[i] = max(m[i], m[i+1]); // 处理这棵树的前缀最大值和后缀最大值。int now = 0;LL ans = max(k, max(K[u], L[u]-mi[u]));for(int i = h[u]; ~i;i = ne[i]){LL tem = k;if(dis[u]) tem = max(tem, mi[u]);if(now != v.size()-1) tem = max(tem, m[now+1]);if(now) tem = max(tem, v[now-1]); ans = min(ans, df(e[i], tem)); ++ now;}h[u] = -1;return ans;
}
stack<int> st;
LL build(int n) // 建立虚树 
{st.push(1); idx = 0;int tmp;for(int i = 1;i <= n;i ++){dis[a[i]] = 1;if(a[i] == 1) continue;int lc = lca(a[i], st.top());while(lc != st.top()){tmp = st.top(); st.pop();if(dfn[st.top()] < dfn[lc]) st.push(lc);add(st.top(), tmp, 0);}st.push(a[i]);}while(st.size() > 1){tmp = st.top(); st.pop();add(st.top(), tmp, 0);}st.pop();dfs(1);return df(1, 0);
}int main() 
{int t;scanf("%d", &t);while(t --){int n, m, q;scanf("%d%d%d", &n, &m, &q);for(int i = 1;i <= n;i ++) h[i] = -1; idx = 0; cv = 0;for(int i = 1;i <= m;i ++){int x;scanf("%d", &x);c[x] = 1;}for(int i = 2;i <= n;i ++){int u, v, w;scanf("%d%d%d", &u, &v, &w);add(u, v, w); add(v, u, w);}dfs(1, 0);for(int i = 1;i <= n;i ++) h[i] = -1;for(int _ = 1;_ <= q;_ ++){int k;scanf("%d", &k);for(int i = 1;i <= k;i ++) scanf("%d", a+i);sort(a+1, a+k+1, cmp);printf("%lld\n", build(k));for(int i = 1;i <= k;i ++) dis[a[i]] = 0;}for(int i = 1;i <= n;i ++) c[i] = 0;}return 0;
}

二分

int h[N], ne[N<<1], e[N<<1], w[N<<1], idx;
void add(int a, int b, int c){e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;return ;}int fa[N][20], deep[N], a[N]; 
LL mi[N], de[N]; 
bool c[N];void dfs(int u, int f)
{deep[u] = deep[f] + 1;for(int i = 1;i < 20;i ++) fa[u][i] = fa[fa[u][i-1]][i-1];for(int i = h[u];~i ;i = ne[i]){if(e[i] == f)continue;fa[e[i]][0] = u; mi[e[i]] = c[e[i]] ? 0 : mi[u] + w[i]; de[e[i]] = de[u] + w[i];dfs(e[i], u);}
}
int lca(int u, int v)
{if(deep[u]<deep[v])swap(u, v);int x = deep[u] - deep[v];for(int i = 0;i < 20;i ++)if(x>>i&1)u = fa[u][i];if(u == v)return v;for(int i = 19;i >= 0;i --)if(fa[u][i] != fa[v][i])u = fa[u][i], v = fa[v][i];return fa[u][0];
}bool cmp(int u, int v){return mi[u] < mi[v];}
bool in(int u, int v){return !c[u] && mi[v]-mi[u] == de[v] - de[u];} // 判断 u -> v 是否有红色节点。
bool ch(LL t, int n)
{int now = 0;for(int i = 1;i <= n;i ++)if(mi[a[i]] > t) now = now ? lca(now, a[i]) : a[i];for(int i = 1;i <= n;i ++)if(mi[a[i]] > t)if(!in(now, a[i]) || mi[a[i]] - mi[now] > t)return 0;return 1;
}int main() 
{int t;scanf("%d", &t);while(t --){int n, m, q;scanf("%d%d%d", &n, &m, &q);for(int i = 1;i <= n;i ++) h[i] = -1; idx = 0; for(int i = 1;i <= m;i ++){int x;scanf("%d", &x);c[x] = 1;}for(int i = 2;i <= n;i ++){int u, v, w;scanf("%d%d%d", &u, &v, &w);add(u, v, w); add(v, u, w);}dfs(1, 0);for(int _ = 1;_ <= q;_ ++){int k;scanf("%d", &k);for(int i = 1;i <= k;i ++) scanf("%d", a+i);sort(a+1, a+k+1, cmp);LL l = 0, r = 1e17;while(l < r)ch(mid, k) ? r = mid : l = mid+1;printf("%lld\n", l);}for(int i = 1;i <= n;i ++) c[i] = 0;}return 0;
}

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

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

相关文章

.NET Core 迁移躺坑记续集--Win下莫名其妙的超时

继上一集.NET Core 迁移躺坑记里说到遇到的各种问题并且弄了n个解决方案之后&#xff0c;特别是对于问题4的解决方案对于切换了HttpClientFactory我用了你家netcore 2.1下专门解决之前HttpClient口病已久的灵丹妙药了&#xff0c;信心满满的上线…..然后挂了&#xff0c;该超时…

gym103117L. Spicy Restaurant

gym103117L. Spicy Restaurant 题意&#xff1a; 有n个点&#xff0c;m个边&#xff0c;每个点都有一个能量值&#xff0c;现在有q个人&#xff0c;每个人有自己的能量值&#xff0c;现在每个人都要去离自己最近且能量值小于等于自身的点。 1<n,m<1e5 1<q<5e5 1&…

使用Entity Framework Core访问数据库(Oracle篇)

前言哇。。看看时间 真的很久很久没写博客了 将近一年了。最近一直在忙各种家中事务和公司的新框架 终于抽出时间来更新一波了。本篇主要讲一下关于Entity Framework Core访问oracle数据库的采坑。。强调一下&#xff0c;本篇文章发布之前 关于Entity Framework Core访问oracl…

gym103117J. Ants

gym103117J. Ants 题意&#xff1a; n个蚂蚁在长度为1e91的木棍上&#xff0c;第i个蚂蚁在ai位置上&#xff0c;朝向为0/1&#xff08;0表示左&#xff0c;1表示右&#xff09;,如果蚂蚁相遇则彼此调转方向。木棍两侧分别有厚度为a和b的墙&#xff0c;蚂蚁每撞一次墙&#xf…

Asp.Net Core Docker镜像更新系统从wheezy改为stretch

之前写过一个在Asp.Net Core里调用System.Drawing.Common绘图的DEMO&#xff0c;部署到Docker里运行&#xff0c;需要更新Asp.Net Core镜像的操作系统。https://www.cnblogs.com/sunnytrudeau/p/9384620.html当时用的阿里云的源RUN echo "deb http://mirrors.aliyun.com/d…

Monster Hunter(2020南京M)

Monster Hunter(2020南京M) 题意&#xff1a; 给你一颗树&#xff0c;树上每个节点都是一个hpi 血量的怪物。打败每个怪物所需要的能量值为hpi 所 有 存 活 的 直 接 子 节 点 的 hpj 。每次必须要消灭父节点后才能消灭子节点。此外你还有m个魔咒&#xff0c;每个魔咒可以不…

网络数据采集(AngleSharp)-使用AngleSharp做html解析

有这么一本Python的书: <<Python 网络数据采集>>我准备用.NET Core及第三方库实现里面所有的例子. 这是第一部分, 主要使用的是AngleSharp: https://anglesharp.github.io/(文章的章节书与该书是对应的)发送Http请求在python里面这样发送http请求, 它使用的是pytho…

ASP.NET Core在Azure Kubernetes Service中的部署和管理

目标部署&#xff1a;掌握将aspnetcore程序成功发布到Azure Kubernetes Service&#xff08;AKS&#xff09;上管理&#xff1a;掌握将AKS上的aspnetcore程序扩容、更新版本准备工作注册 Azure 账户官网免费帐户Azure 免费帐户仅适用于新用户&#xff0c;并且仅限每个客户一个免…

P4342 [IOI1998]Polygon

P4342 [IOI1998]Polygon 题意&#xff1a; 给你一个n个点的环&#xff0c;第一步&#xff0c;删除其中一条边。随后每一步&#xff1a; 选择一条边连接的两个顶点V1和V2&#xff0c;用边上的运算符计算V1和V2得到的结果来替换这两个顶点。 游戏结束时&#xff0c;只有一个顶点…

三元环讲解

参考文章&#xff1a; 不常用的黑科技——「三元环」 引入 给定一张无重边&#xff0c;无自环的无向图&#xff0c;点数为n&#xff0c;边数为m&#xff0c;且n&#xff0c;m同阶&#xff0c;问有多少个无序三元组(i,j,k),使得存在&#xff1a; 有一个连接i&#xff0c;j的边…

深入研究 Mini ASP.NET Core,看看 ASP.NET Core 内部到底是如何运行的

几年前&#xff0c;Artech 老师写过一个 Mini MVC&#xff0c;用简单的代码告诉读者 ASP.NET MVC 内部到底是如何运行的。当时我研究完以后&#xff0c;受益匪浅&#xff0c;内心充满了对 Artech 老师的感激&#xff0c;然后用我自己理解的 MVC 知识&#xff0c;写了一篇 深入研…

Cities(2020昆明C)

Cities(2020昆明C) 题意&#xff1a; 给定长度为n的序列a[]&#xff0c;一次操作你可以选择一个数值相同的连续区间&#xff0c;将这个区间的数值修改为其他数。 问多少进行多少次操作能使得区间所有数相同。 n<5000&#xff0c;每种a[i]最多出现15次 题解&#xff1a; …

一文读懂Asp.net core 依赖注入(Dependency injection)

一、什么是依赖注入首先在Asp.net core中是支持依赖注入软件设计模式&#xff0c;或者说依赖注入是asp.net core的核心&#xff1b;依赖注入&#xff08;DI&#xff09;和控制反转&#xff08;IOC&#xff09;基本是一个意思&#xff0c;因为说起来谁都离不开谁&#xff1b;或者…

P4619 [SDOI2018]旧试题

P4619 [SDOI2018]旧试题 题意&#xff1a; 求个式子&#xff1a; (∑i1A∑j1B∑k1Cd(i∗j∗k))mod(1097)(\sum_{i1}^{A}\sum_{j1}^{B}\sum_{k1}^{C}d(i*j*k))mod(10^97)(i1∑A​j1∑B​k1∑C​d(i∗j∗k))mod(1097) 题解&#xff1a; 原创博文1k纪念 很明显&#xff0c;莫比…

C#中使用Bogus创建模拟数据

原文&#xff1a;CREATING SAMPLE DATA FOR C#[1] 作者&#xff1a;Bruno Sonnino 译文&#xff1a;C#中使用Bogus创建模拟数据 译者&#xff1a; Lamond Lu背景在我每次写技术类博文的时候&#xff0c;经常做的一件事就是创建模拟数据。在每篇博文中&#xff0c;为了解释某些概…

CF1253E Antenna Coverage

CF1253E Antenna Coverage 题意&#xff1a; 现在有n个点&#xff0c;每个点的坐标为xi&#xff0c;以及一个范围值si&#xff0c;可以覆盖左右范围[xi-si,xisi] 每次操作&#xff0c;可以花费代价1让第i个天线的si增加1&#xff0c;每个天线都可以进行多次操作。现在请问你最…

使用BeetleX的TcpBenchmark工具进行百万设备模拟测试

其实TCP测试的工具有很多&#xff0c;那BeetleX工具所提供的特点又是什么呢&#xff1f;如果你需数十万的请求或模拟上百万的设备连接&#xff0c;那这个工具相信可以满足你的需要&#xff01;工具是基于BeetleX的基础功能扩展&#xff0c;支持多IP绑定可以轻松实现上百万的cli…

.net core Entity Framework 与 EF Core

重点讲 Entity Framework Core &#xff01;&#xff08;一&#xff09;Entity Framework它是适用于.NET 的对象关系映射程序 (ORM)&#xff0c;现在的EF6已经是久经沙场&#xff0c;并经历重重磨难&#xff0c;获得一致认可的数据访问技术&#xff08;原来加 Title 也挺有意思…

CF1253F Cheap Robot

CF1253F Cheap Robot 题意&#xff1a; 给你一张 N 个点的带权无向连通图&#xff0c;其中结点 1,2,…,k 为充电中心。 一个机器人在图中行走&#xff0c;假设机器人的电池容量为 c&#xff0c;则任何时刻&#xff0c;机器人的电量 x 都必须满足 c0≤x≤c。如果机器人沿着一…

牛客练习赛55E树

牛客练习赛55E树 题意&#xff1a; 你有一颗大小为n 的树&#xff0c;点从 1 到 n 标号。 设dis(x,y)表示 x 到 y 的距离。 求∑i1n∑j1ndis2(i,j)\sum_{i1}^{n}\sum_{j1}^{n}dis^2(i,j)∑i1n​∑j1n​dis2(i,j)对998244353取模的结果 题解&#xff1a; 我们以1为根&#x…