JZOJ 4320. 【NOIP2015模拟11.5】旅行
题目
思路
不想写了,直接使用
没错,关键就在求第 \(k\) 小的路径
上述提到堆的做法,我们可以用 \(STL\) 的优先队列来实现
只不过常数有点大~~~
\(Code\)
#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
typedef long long LL;
const int N = 1e5 + 5;
int n , k , h[N] , tot , cnt1 , cnt2;
LL a[N] , b[N];
struct edge{
int to , nxt , w;
}e[N << 1];
struct node{
int l , r;
LL d;
bool operator < (node c) const {return d > c.d;}
};
priority_queue<node> Q;
inline void add(int x , int y , int z)
{
e[++tot].to = y;
e[tot].w = z;
e[tot].nxt = h[x];
h[x] = tot;
}
inline void dfs(int x , int fa , int fl , LL D , int ad)
{
for(register int i = h[x]; i; i = e[i].nxt)
{
int v = e[i].to;
if (v == fa) continue;
D = D + 1LL * fl * e[i].w;
if (ad) a[++cnt1] = D;
else b[++cnt2] = -D;
dfs(v , x , -fl , D , ad ^ 1);
D = D - 1LL * fl * e[i].w;
}
}
int main()
{
freopen("travel.in" , "r" , stdin);
freopen("travel.out" , "w" , stdout);
scanf("%d%d" , &n , &k);
int u , v , w;
for(register int i = 1; i < n; i++)
{
scanf("%d%d%d" , &u , &v , &w);
add(u , v , w) , add(v , u , w);
}
b[++cnt2] = 0;
dfs(1 , 0 , 1 , 0 , 1);
sort(a + 1 , a + cnt1 + 1) , sort(b + 1 , b + cnt2 + 1);
for(register int i = 1; i <= cnt1; i++) Q.push((node){i , 1 , a[i] + b[1]});
node now;
for(register int i = 1; i <= k; i++)
{
if (Q.size())
{
now = Q.top() , Q.pop();
if (i == k)
{
printf("%lld" , now.d);
return 0;
}
if (now.r + 1 <= cnt2) Q.push((node){now.l , now.r + 1 , a[now.l] + b[now.r + 1]});
}
else{
printf("Stupid Mike");
return 0;
}
}
}
对于此类问题,我们还有一个很经典的做法
二分答案,然后判断路径组合中比这个答案小的能不能达到 \(k\)
后半句可以再套个二分实现
\(Code\)
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long LL;
const int N = 1e5 + 5;
int n , k , h[N] , tot , cnt1 , cnt2;
LL a[N] , b[N];
struct edge{
int to , nxt , w;
}e[N << 1];
inline void add(int x , int y , int z)
{
e[++tot].to = y;
e[tot].w = z;
e[tot].nxt = h[x];
h[x] = tot;
}
inline void dfs(int x , int fa , int fl , LL D , int ad)
{
for(register int i = h[x]; i; i = e[i].nxt)
{
int v = e[i].to;
if (v == fa) continue;
D = D + 1LL * fl * e[i].w;
if (ad) a[++cnt1] = D;
else b[++cnt2] = -D;
dfs(v , x , -fl , D , ad ^ 1);
D = D - 1LL * fl * e[i].w;
}
}
inline int check(LL m)
{
int l , r , mid , res , sum = 0;
for(register int i = 1; i <= cnt1; i++)
{
l = 1 , r = cnt2 , res = 0;
while (l <= r)
{
mid = (l + r) >> 1;
if (b[mid] + a[i] <= m) res = mid , l = mid + 1;
else r = mid - 1;
}
sum += res;
}
return sum >= k;
}
int main()
{
freopen("travel.in" , "r" , stdin);
freopen("travel.out" , "w" , stdout);
scanf("%d%d" , &n , &k);
int u , v , w;
for(register int i = 1; i < n; i++)
{
scanf("%d%d%d" , &u , &v , &w);
add(u , v , w) , add(v , u , w);
}
b[++cnt2] = 0;
dfs(1 , 0 , 1 , 0 , 1);
sort(a + 1 , a + cnt1 + 1) , sort(b + 1 , b + cnt2 + 1);
if ((LL)cnt1 * cnt2 < k)
{
printf("Stupid Mike");
return 0;
}
LL l = a[1] + b[1] , r = a[cnt1] + b[cnt2] , mid , res = l;
while (l <= r)
{
mid = (l + r) >> 1;
if (check(mid)) res = mid , r = mid - 1;
else l = mid + 1;
}
printf("%lld" , res);
}
实际上这两做法各有优劣
如果要求前 \(k\) 的话显然用堆,它的过程本质上就是取出了前 \(k\) 的数
JZOJ 4320. 【NOIP2015模拟11.5】旅行的更多相关文章
- [JZOJ 4307] [NOIP2015模拟11.3晚] 喝喝喝 解题报告
题目链接: http://172.16.0.132/senior/#main/show/4307 题目: 解题报告: 题目询问我们没出现坏对的连续区间个数 我们考虑从左到有枚举右端点$r$,判断$a[ ...
- 【NOIP2015模拟11.5】JZOJ8月5日提高组T3 旅行
[NOIP2015模拟11.5]JZOJ8月5日提高组T3 旅行 题目 若不存在第\(k\)短路径时,输出"Stupid Mike" 题解 题意 给出一个有\(n\)个点的树 问这 ...
- JZOJ 4298. 【NOIP2015模拟11.2晚】我的天
4298. [NOIP2015模拟11.2晚]我的天 (File IO): input:ohmygod.in output:ohmygod.out Time Limits: 1000 ms Memor ...
- 【NOIP2015模拟11.5】JZOJ8月5日提高组T2 Lucas的数列
[NOIP2015模拟11.5]JZOJ8月5日提高组T2 Lucas的数列 题目 PS:\(n*n*T*T<=10^{18}\)而不是\(10^1*8\) 题解 题意: 给出\(n\)个元素的 ...
- 【NOIP2015模拟11.5】JZOJ8月5日提高组T1 俄罗斯套娃
[NOIP2015模拟11.5]JZOJ8月5日提高组T1 俄罗斯套娃 题目 题解 题意就是说 将1~\(n\)排列,问有多少种方案使得序列的逆序对个数小于\(k\) 很容易想到DP 设\(f[i][ ...
- 【NOIP2015模拟11.2晚】JZOJ8月4日提高组T2 我的天
[NOIP2015模拟11.2晚]JZOJ8月4日提高组T2 我的天 题目 很久很以前,有一个古老的村庄--xiba村,村子里生活着n+1个村民,但由于历届村长恐怖而且黑暗的魔法统治下,村民们各自过着 ...
- 【NOIP2015模拟11.4】JZOJ2020年8月6日提高组T2 最优交换
[NOIP2015模拟11.4]JZOJ2020年8月6日提高组T2 最优交换 题目 题解 题意 有一个长度为\(n\)的正整数 最多可以进行\(k\)次操作 每次操作交换相邻两个位置上的数 问可以得 ...
- 【NOIP2015模拟11.4】JZOJ8月6日提高组T1 刷题计划
[NOIP2015模拟11.4]JZOJ8月6日提高组T1 刷题计划 题目 题解 题意 有\(n\)道题,编号为1~\(n\) 给出\(m\)次操作 每次操作有3种类型 1 \(x\) 表示交了\(A ...
- 【NOIP2015模拟11.3】备用钥匙
题目 你知道Just Odd Inventions社吗?这个公司的业务是"只不过是奇妙的发明(Just Odd Inventions)".这里简称为JOI社. JOI社有N名员工, ...
- JZOJ4307. 【NOIP2015模拟11.3晚】喝喝喝
Description
随机推荐
- 关于python实现与体重秤蓝牙ble通信研究(Linux)
前言 前几天买一个带蓝牙的体重秤,功能就是可以通过手机app连接,然后每一次称重都会记录下来,然后进行一些计算(体脂等),但是我不想用手机来操作,我习惯用电脑,就想写一个软件来与体重秤通信,记录我的每 ...
- 关于 Windows6.1-KB2999226-x64.msu 此更新不适用你的计算机解决办法
前言 今天被这个破问题坑了很长时间,网上一大堆扯跳过那个检查,通过提取 cab 文件然后直接用命令安装,我可以明确的告诉你不是那样的解决的,因为我实际用命令装过也装不上(这里我吐槽一下,我猜你最初的问 ...
- EndNote设置导出参考文献格式为中文国标GBT7714
笔者使用的版本是最新的EndNote 20,其他版本大同小异. 依次打开:Tools -> Output Styles -> Open Style Manager.其他版本可能有差异,只要 ...
- C#代码扫描工具Sonarqube + Win10+SqlServer2017
在之前的公司, 看到有用过代码扫描工具, 扫描C#代码, 最近公司也有考虑做这个,于是我便独自研究了一下,这里给大家做个分享 网上找了很多资料, 主要有以下问题: 1. Sonarqube用的是 旧版 ...
- CONDITION EVALUATION DELTA热部署启动失效
1.问题描述 我在启动一个SpringBoot项目的时候,在启动中控制台不停的打印日志(如下图所示) 2.产生原因 当时我是看了这篇文章后CONDITION EVALUATION DELTA_苦逼码农 ...
- 启动springboot项目报错Unable to start embedded Tomcat
1.问题描述 最近在学习springcloud的时候,在父工程下新建一个model后,引入dashboard相关依赖后启动报错 2.产生原因 产生原因有可能就是pom.xml中下载的jar包版本冲突 ...
- 第六节 FAF与GP不工作保护区的绘制
飞行程序设计软件实践 前一篇文章中,通过风标设计2023插件,我们在CAD中绘制了FAP方式下的精密进近保护区. 接着这个话题我们继续来看一下FAF方式下的保护区应该怎样绘制,以及OAS参数的其它用法 ...
- BBS项目(二): 登录功能 首页导航条搭建 首页主体部分 个人站点页面搭建 文章分类与标签 日期归档
目录 登录功能 pillow模块生成验证码 前端发送ajax请求 后端auth模块校验 sweetalert弹窗提示登录失败 首页导航条搭建 修改密码 退出登录 首页主体部分 首页前端框架搭建 adm ...
- python之路51 聚合查询 分组查询
图书管理系统 1.表设计 先考虑普通字段再考虑外键字段 数据库迁移.测试数据录入 2.首页展示 3.书籍展示 4.书籍添加 5.书籍编辑 后端如何获取用户想要编辑的数据.前端如何展示出待编辑的数据 6 ...
- [LeetCode]819. 最常见的单词
题目 给定一个段落 (paragraph) 和一个禁用单词列表 (banned).返回出现次数最多,同时不在禁用列表中的单词.题目保证至少有一个词不在禁用列表中,而且答案唯一. 禁用列表中的单词用小写 ...