Nowcoder 练习赛 23 D Where are you 解题报告
Where are you
链接:
https://ac.nowcoder.com/acm/contest/272/D
来源:牛客网
题目描述
小\(p\)和他的朋友约定好去游乐场游玩,但是他们到了游乐场后却互相找不到对方了。
游乐场可以看做是一张\(n\)个点,\(m\)条道路的图,每条道路有边权\(w_i\),表示第一次经过该道路时的花费(第二次及以后经过时花费为\(0\))。
现在,小\(p\)要去找他的朋友,但他的朋友行踪很诡异,小\(p\)总是要遍历完这\(n\)个点才能找到他,同时小\(p\)希望总花费最小。
找到朋友的方案可能不唯一,小\(p\)想知道在这所有的方案中,有多少条边在每个方案中都会被经过。
输入描述:
第一行两个整数\(n\), \(m\),\(p\),分别表示点数,边数,小\(p\)的初始位置。
接下来\(m\)行,每行两个整数\(u\), \(v\), \(w\)表示从\(u\)到\(v有\)一条无向边,边权为\(w\)。
输出描述:
输出一个整数k,表示必须经过的边的数量。
说明
\(2\le n < m \le 2\times 10^5,1 \le w \le 10^6\)
保证图联通,无自环无重边
比赛的时候wa了一晚上,-8了...后来发现错误是没有判\(set\)空然后\(*s.begin()\)在\(set\)为空的时候居然是\(0\)...
正解不是很懂,想了一个\(n\log^2n\)的辣鸡做法。
思路:
先求出\(MST\),然后枚举不在\(MST\)上的边。如果这个边的两点在树上的路径中的边的权值小于等于这条边,那么树上的那条路径就是可以被取代的。
实现就是对两个点及它们的\(LCA\)打树上差分,然后\(set\)启发式合并一下就好了。
Code:
#include <cstdio>
#include <algorithm>
#include <set>
#include <vector>
const int N=2e5+10;
struct node
{
int u,v,w;
bool friend operator <(node n1,node n2){return n1.w<n2.w;}
}E[N];
int n,m,f[N],used[N],ans;
int Find(int x){return f[x]=f[x]==x?x:Find(f[x]);}
void Merge(int x,int y){f[Find(x)]=Find(y);}
int head[N],to[N<<1],Next[N<<1],edge[N<<1],cnt;
void add(int u,int v,int w)
{
to[++cnt]=v,Next[cnt]=head[u],edge[cnt]=w,head[u]=cnt;
}
void krus()
{
for(int i=1;i<=n;i++) f[i]=i;
std::sort(E+1,E+1+m);
for(int i=1;i<=m;i++)
{
int u=E[i].u,v=E[i].v,w=E[i].w;
if(Find(u)!=Find(v))
{
Merge(u,v);
used[i]=1;
add(u,v,w),add(v,u,w);
}
}
}
int F[N][20],dep[N];
void dfs1(int now,int fa)
{
for(int i=1;F[now][i-1];i++) F[now][i]=F[F[now][i-1]][i-1];
for(int i=head[now];i;i=Next[i])
{
int v=to[i];
if(v!=fa)
{
F[v][0]=now;
dep[v]=dep[now]+1;
dfs1(v,now);
}
}
}
std::multiset <int > s[N];
std::vector <int > poi[N];
void dfs2(int now,int fa)
{
for(int i=head[now];i;i=Next[i])
{
int v=to[i];
if(v==fa) continue;
dfs2(v,now);
if(s[v].empty()||*(s[v].begin())>edge[i]) ++ans;
if(s[now].size()<s[v].size()) std::swap(s[now],s[v]);
for(std::multiset<int>::iterator it=s[v].begin();it!=s[v].end();it++)
s[now].insert(*it);
s[v].clear();
}
for(int i=0;i<poi[now].size();i++)
{
if(poi[now][i]<0)
s[now].erase(s[now].find(-poi[now][i]));
else
s[now].insert(poi[now][i]);
}
}
int LCA(int x,int y)
{
if(dep[x]<dep[y]) return LCA(y,x);
for(int i=18;~i;i--)
if(dep[F[x][i]]>=dep[y])
x=F[x][i];
if(x==y) return x;
for(int i=18;~i;i--)
if(F[x][i]!=F[y][i])
x=F[x][i],y=F[y][i];
return F[x][0];
}
bool cmp(int n1,int n2){return n1>n2;}
int main()
{
int p;scanf("%d%d%d",&n,&m,&p);
for(int i=1;i<=m;i++)
scanf("%d%d%d",&E[i].u,&E[i].v,&E[i].w);
krus();
dep[1]=1;dfs1(1,1);
for(int i=1;i<=m;i++)
{
int u=E[i].u,v=E[i].v,w=E[i].w;
if(used[i]) continue;
int lca=LCA(u,v);
poi[u].push_back(w);
poi[v].push_back(w);
poi[lca].push_back(-w);
poi[lca].push_back(-w);
}
dfs2(1,1);
printf("%d\n",ans);
return 0;
}
2018.12.1
Nowcoder 练习赛 23 D Where are you 解题报告的更多相关文章
- 牛客练习赛 小D的剑阵 解题报告
小D的剑阵 题意链接: https://ac.nowcoder.com/acm/contest/369/F 来源:牛客网 现在你有 \(n\) 把灵剑,其中选择第i把灵剑会得到的 \(w_i\) 攻击 ...
- nowcoder(牛客网)OI测试赛2 解题报告
qwq听说是一场普及组难度的比赛,所以我就兴高采烈地过来了qwq 然后发现题目确实不难qwq.....但是因为蒟蒻我太蒻了,考的还是很差啦qwq orz那些AK的dalao们qwq 赛后闲来无事,弄一 ...
- 【NOIP2015】提高组D1 解题报告
P1978神奇的幻方 Accepted 描述 幻方是一种很神奇的 N ∗ N 矩阵:它由数字 1,2,3, … … , N ∗ N 构成,且每行.每列及两条对角线上的数字之和都相同. 当 N 为奇数时 ...
- 2014 ACM/ICPC 鞍山赛区现场赛 D&I 解题报告
鞍山现场赛结束了呢-- 我们出的是D+E+I三道题-- 吾辈AC掉的是D和I两道,趁着还记得.先在这里写一写我写的两道水题D&I的解题报告吧^_^. D题的意思呢是说星云内有一堆排成一条直线的 ...
- ZOJ 1093 Monkey and Banana (LIS)解题报告
ZOJ 1093 Monkey and Banana (LIS)解题报告 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...
- poj1173 解题报告
poj1173 解题报告2013-07-21 13:31 by 期待 ., 42 阅读, 0 评论, 收藏, 编辑 http://poj.org/problem?id=1173 发现此题资料甚少,斗胆 ...
- USACO Section2.3 Zero Sum 解题报告 【icedream61】
zerosum解题报告----------------------------------------------------------------------------------------- ...
- Leetcode 115 Distinct Subsequences 解题报告
Distinct Subsequences Total Accepted: 38466 Total Submissions: 143567My Submissions Question Solutio ...
- 解题报告 之 HDU5288 OO' s Sequence
解题报告 之 HDU5288 OO' s Sequence Description OO has got a array A of size n ,defined a function f(l,r) ...
随机推荐
- 谈谈你对Java异常处理机制的理解
先谈谈我的理解:异常处理机制可以说是让我们编写的程序运行起来更加的健壮,无论是在程序调试.运行期间发生的异常情况的捕获,都提供的有效的补救动作,任何业务逻辑都会存在异常情况,这时只需要记录这些异常情况 ...
- Spring 定时任务Scheduled 开发详细图文
Spring 定时任务Scheduled 开发 文章目录 一.前言 1.1 定时任务 1.2 开发环境 1.3 技术实现 二.创建包含WEB.xml 的Maven 项目 2.1 创建多模块项目task ...
- C++数字三角形问题与dp算法
题目:数字三角形 题目介绍:如图所示的数字三角形,要求从最上方顶点开始一步一步下到最底层,每一步必须下一层,求出所经过的数字的最大和. 输入:第一行值n,代表n行数值:后面的n行数据代表每一行的数字. ...
- JUnit initializationError错误
一.JUnit Test 测试 initializationError错误 MyMaincom.test.sunc.MyMaininitializationError(com.test.sunc.My ...
- 关于requestanimationframe
首先字面理解,请求动画框架, 用法: var nextFrame = (function() { return window.requestAnimationFrame || window.webki ...
- Pythagorean Triples毕达哥斯拉三角(数学思维+构造)
Description Katya studies in a fifth grade. Recently her class studied right triangles and the Pytha ...
- LeetCode 289. Game of Life (C++)
题目: According to the Wikipedia's article: "The Game of Life, also known simply as Life, is a ce ...
- 王者荣耀交流协会 - 第6次Scrum会议(第二周)
Scrum master :刘耀泽 工作照片: 照片由刘耀泽(本人)拍摄,组内成员刘耀泽,高远博,王磊,王玉玲,王超,任思佳,袁玥全部到齐. 时间跨度: 2017年10月25日 17:00 — 17: ...
- HDU 2105 The Center of Gravity
http://acm.hdu.edu.cn/showproblem.php?pid=2105 Problem Description Everyone know the story that how ...
- PAT 1085 PAT单位排行 (Microsoft_zzt)
https://pintia.cn/problem-sets/994805260223102976/problems/994805260353126400 每次 PAT 考试结束后,考试中心都会发布一 ...