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) ...
随机推荐
- HTML5 + CSS3 实现地球绕太阳公转
使用的是正面视角,主要是用 HTML5 + CSS3 来实现,JS只是用来画图. test.html: <!DOCTYPE html> <html> <head> ...
- 小白初识 - 快速排序(QuickSort)
我个人觉得快速排序和归并排序有相似之处,都是用到了分治的思想,将大问题拆分成若干个小问题. 不同的地方是归并排序是先把大问题拆分好了之后再排序,而快速排序则是一边拆分,一边排序. 快速排序的原理就是, ...
- java基础学习总结--开篇
春去秋来,转眼间,参加工作快2年了.本来应该是3年,然在毕业的第一年,有试着从事过其他行业.最终结果是失败了.2016年又回来从事软件开发,转眼即将2年,在这期间有许多收获,当然也有彷徨迷茫的时候,人 ...
- Windows和Linux系统如何退出python命令行
python命令行是新手学习python过程中必须要学的一个工具,下面我们来看一下怎么退出python命令行. 第一种方式: 使用python提供的exit()函数,linux平台和windows平台 ...
- golang笔记1
golang笔记1 go代码是用包来组织的,每个包有一个或多个go文件组成,这些go文件文件放在一个文件夹中 每个源文件开始都用一个package声明,指明本源文件属于哪个包 pakage声明后紧跟这 ...
- CSS3在线实战
作者声明:本博客中所写的文章,都是博主自学过程的笔记,参考了很多的学习资料,学习资料和笔记会注明出处,所有的内容都以交流学习为主.有不正确的地方,欢迎批评指正. 本节课视频网站:https://www ...
- 对字符串进行base64加解密---基于python
本文介绍Python 2.7中的base64模块,该模块提供了基于rfc3548的Base16, 32, 64编解码的接口.官方文档,参考这里. 当前接口基于rfc3548的Base16/32/64编 ...
- Scrum立会报告+燃尽图(Beta阶段第七次)
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2388 项目地址:https://coding.net/u/wuyy694 ...
- 在windows和unbuntu上安装octave
windows安装octave 安装wiki Octave ftp库 从上述的库中可以找到对应的版本的octave的exe安装程序,或者是zip等的压缩包,建议直接下载对应系统的exe执行文件.安装. ...
- 第九章 Mysql函数
简介 数学函数:处理数字 字符串函数:处理字符串 日期和时间函数:处理日期和时间,获取时间 条件判断函数:控制条件选择 系统信息函数:获取MySQL系统信息,包括数据库名称,当前用户名和数据库版本 加 ...