题解 DTOJ #3861.基里巴斯(path)
欢迎访问 My Luogu Space。
【题目描述】
最近,帕特里克沉迷于世界地图上的太平洋地区。他发现了一个名字奇异的岛国:基里巴斯共和国,简称基里巴斯,是一个太平洋岛国。
其由 33 33 33 个岛屿组成。
“可惜它快被淹没了,该死的全球变暖”。
真悲哀。
我们这里讨论其在四维平行宇宙中的另一个国家:巴里基斯。这个国家由 N N N 个岛屿或岛礁组成。
由于岛屿众多,政府在所有的岛屿之间均设有固定的经济航线连接。对于编号为 u , v u, v u,v 的岛屿 ( u , v ) (u, v) (u,v) 对,连接两岛的单向航线通行费用是 ( u ⊕ v ) × K (u \oplus v) \times K (u⊕v)×K 。其中, ⊕ \oplus ⊕ 表示异或 ( X o r ) (Xor ) (Xor)。
泛美航空公司开设了 M M M 条往返于各岛的单向航线,每条航线均有一个固定的通行费用以期以更低的价格占有更多的用户群。
另外,泛美打算在岛礁中心建设了一个机场作为中转枢纽,这个枢纽建成后或许能大大降低泛美的航空成本。但是作为邪恶的资本主义财团,董事长还是希望调研一下收益。
于是,他打算从 S S S 飞到城市 T T T 。他希望得知从 S S S 到城市 T T T 的最小费用。
【输入输出格式】
输入格式:
第一行一个整数 n ( 1 < = n < = 1000000 ) n (1<=n<=1000000) n(1<=n<=1000000),表示商品数量。
接下来一行有 n n n 个整数,表示每件商品的价格,范围在 [ 1 , 1 0 9 ] [1,10^9] [1,109] 。
接下来一行有一个整数 m ( 1 < = m < = 1000000 ) m (1<=m<=1000000) m(1<=m<=1000000),表示询问数。
接下来 m m m 行,每行一个整数 k i ki ki。
输出格式:
对于每个询问,输出一行表示至少要带多少钱。若无法满足要求,输出 − 1 -1 −1 。
【输入输出样例】
输入样例1:
5 3 3
1 3 2
2 4 4
2 3 2
1 5
输出样例1:
7
9
-1
输入样例2:
1000 1 85
829 630 1
633 492
输出样例2:
77945
【标签】
最短路。
【分析】
通过减少加边的个数来加快最短路算法。
基本想法:
对于每一个点 i i i,向其他所有点 j j j 连一条费用为 i i i x o r xor xor j j j 的边。再连上题目中给的边,跑单源最短路。
改进:
我们发现,对于两个点,如果两个点的异或结果包含超过一个二进制位,可以通过先走到只有一个二进制位不同的点,再走到另一个二进制位也不同的点来达到一样的效果,而且费用是相等的:费用只是单纯的依靠异或的结果来计算。
因此,对于每一个点我们只需向与它二进制有一位之差的每一个点(注意判断点的范围)连边就好。然后跑堆优化Dijkstra。
【代码 】
[C++]
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
struct Edge{int to; LL w;
}E[20000005];
struct Point{ //堆优化int id; LL dis;bool operator<(const Point &T)const{return dis > T.dis;}
};int n, m, s, t, ct, K;
int Hed[200005], Nex[20000005];
LL Dis[200005];
char F[200005];void Add(int a, int b, LL w){E[++ct].to = b, E[ct].w = w, Nex[ct] = Hed[a], Hed[a] = ct;
}
LL Dijkstra(){priority_queue<Point> Q; Q.push((Point){s, 0ll});memset(Dis, 0x3f, sizeof Dis);Dis[s] = 0ll; int k;while(!Q.empty()){k = Q.top().id; Q.pop();if(k == t) break; //汇点的答案一旦被确定就可以直接退出F[k] = 1;for(int i=Hed[k]; i; i=Nex[i]){if(Dis[k]+E[i].w < Dis[E[i].to]){Dis[E[i].to] = Dis[k]+E[i].w;Q.push((Point){E[i].to, Dis[E[i].to]}); }}while(!Q.empty() && F[Q.top().id]) Q.pop();}return Dis[t];
}
int main(){scanf("%d%d%d", &n, &m, &K);int u, v, w;while(m--){scanf("%d%d%d", &u, &v, &w);Add(u, v, w);}for(int i=1; i<=n ; ++i)for(int j=1; j<=(1<<20); j<<=1)if((i^j) <= n && (i^j)) Add(i, i^j, 1ll*j*K); //加边scanf("%d%d", &s, &t);printf("%lld", Dijkstra());return 0;
}
【补充】
注意加边时候的范围,不要漏加或者多加了。
Over
题解 DTOJ #3861.基里巴斯(path)相关推荐
- 题解 DTOJ #1438. 矮人排队(lineup)
欢迎访问 My Luogu Space. [题目大意] 有 \(n\) 个身高为 \([1,\ n]\) 的且各不相同的人排成一个序列. 有两种操作: 让位置 \(x,\ y\) 的人交换位置. 给定 ...
- 题解 DTOJ #4016.辉夜的夜空明珠(moon)
欢迎访问 My Luogu Space. [题目大意] 一张无向图,边的长度都为 111,每个点被染成了 "R,B,Y,G""R,B,Y,G""R,B ...
- Zuora在线测试题解之Three Page Path
题目记不清楚了,大概是给出用户访问页面的记录(user, page),要求给出最经常被访问的前M个路径,每个路径至少包含n个页面. 定义类如下,测试通过. 1. 原始数据 package com.zu ...
- 题解 DTOJ #1515.三塔合一
欢迎访问 My Luogu Space. [题目描述] [输入输出格式] 输入格式: 输出格式: [输入输出样例] 输入样例: 5 1 1 2 2 输出样例: 643 [标签] 模拟,数学推演. [分 ...
- ---排列数字---
排列数字(回溯的应用) 题目链接,点击直达 题解: 1.用path数组来保存排列 2.bool st[]数组来标识当前数字是否被用过 3.dfs继续递归下一层 4,恢复现场,第 i 个位置填写某个数字 ...
- c++/go算法模板, 刷题记录
◉ 一.数组 912. 排序数组 给你一个整数数组 nums,请你将该数组升序排列. 示例 1: 输入:nums = [5,2,3,1] 输出:[1,2,3,5] 示例 2: 输入:nums = [5 ...
- PAT甲级1126 Eulerian Path:[C++题解] 欧拉路径、并查集,测试点4有问题请进来
文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 欧拉图: 1)连通 2)度都为偶数 半欧拉图:欧拉路径:2)连通2) 度为奇数的结点有两个,其他度都是偶数 非欧拉图:不是欧拉图和半 ...
- PAT甲级1053 Path of Equal Weight (30分) :[C++题解]dfs求树的路径长度、邻接表
文章目录 题目分析 题目链接 题目分析 输入样例: 20 9 24 10 2 4 3 5 10 2 18 9 7 2 2 1 3 12 1 8 6 2 2 00 4 01 02 03 04 02 1 ...
- 算法(第四版)C# 习题题解——1.3
写在前面 整个项目都托管在了 Github 上:https://github.com/ikesnowy/Algorithms-4th-Edition-in-Csharp 这一节内容可能会用到的库文件有 ...
最新文章
- 阿里大佬告诉我,想学习设计模式,得先学好这些硬核技能
- 用MATLAB读取MORSE、BPSK、QPSK信号的波形和频谱
- 【Android 逆向】Android 进程代码注入原理 ( 注入本质 | 静态注入和动态注入 | 静态注入两种方式 | 修改动态库重打包 | 修改 /data/app/xx/libs 动态库 )
- 学习动态性能表(20)--v$waitstat
- CodeForces - 1480D2 Painting the Array II(dp)
- MacBook如何设置自动纠正拼写和自动大写字词的首字母
- div不继承父类样式_Python编程思想(27):类的继承
- 《人民日报》专访姚期智院士:AI是历史性的起跑线机遇
- VMware 虚拟上网的的三种模式 ——bridged、host-only、NAT 模式
- AI(3)--手机上的AI技术
- 字符转获取拼音首字母php实现
- 社交网络分析——信息传播模型(附带三个模型的python实现)
- CreatePipe、CreateProcess函数
- 中维监控显示无法连接服务器失败,中维远程监控系统服务器端
- AndRoid studio创建APP图标
- 毕设 - 网络商城 开篇
- markdown文档:一个简单标记语言的使用及GitHub实际应用
- mybatis-动态sql动态bean实例
- CS:GO开服架设服务器搭建游戏配置方法教程教学插件配置下载资源配置
- JAVA开发---微信文章留言功能实现