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) ...
随机推荐
- 函数parseQuery用于解析url查询参数
在百度上找的,以后忘了再看. 语法如下: var obj = parseQuery(query) query是被解析的查询参数,函数返回解析后的对象. 使用范例如下: var jerry = pars ...
- website for personal research
YOLO https://pjreddie.com/darknet/yolo/ Low Rank Matrix Recovery and Completion via Convex Optimizat ...
- Codeforces Round #765 Div.1 F. Souvenirs 线段树
题目链接:http://codeforces.com/contest/765/problem/F 题意概述: 给出一个序列,若干组询问,问给出下标区间中两数作差的最小绝对值. 分析: 这个题揭示着数据 ...
- 城联数据TSM技术方案起底
近日,城联数据有限公司与中国电信签订了<基于NFC技术的公交业务的合作协议>.双方基于NFC技术开展互联互通城市公交卡业务合作,实现符合住房和城乡建设部城市公用事业互联互通卡系列标准的移动 ...
- pygame (1) 移动小乌龟
小乌龟图片素材: 第一个简单的小游戏: 小乌龟会不断的移动,并且每当到达窗口的左右边界的时候,还会自动的掉头. 源码: import pygame import sys# 导入sys模块,退出时使用 ...
- C++ map 遍历
#include <iostream> #include <map> using namespace std; int main(){ map<int,int> m ...
- scrum立会报告+燃尽图(第二周第七次)
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2252 一.小组介绍 组名:杨老师粉丝群 组长:乔静玉 组员:吴奕瑶.公冶 ...
- 王者荣耀交流协会final发布WBS+PSP
WBS: PSP: 时间为估计,大致精确. 类型 personal software process stages 预估时间 实际花费时间 planning 计划 4h 4h estimate 4h ...
- “Hello World!”团队第七次Scrum立会
"Hello world!"团队召开第七次Scrum立会.博客内容: 1.会议时间 2.会议成员 3.会议地点 4.会议内容 5.Todo list 6.会议照片 7.燃尽图 一. ...
- Ubuntu16.04下安装显卡驱动记录
安装环境及硬件信息 Ubuntu16.04 LTS 内核版本:4.4.0 显卡:Nvidia GeForce GTX 1060 安装过程 一.首先要下载好显卡驱动程序,官方网址:http://www. ...