首页 > 其他分享 >做题记录 // 230325

做题记录 // 230325

时间:2023-03-25 10:46:48浏览次数:43  
标签:std 连边 记录 int 二进制位 maxn 230325 dis

我欲乘风归去,又恐天上下雨。高处不撑伞。

B. 最短路

http://222.180.160.110:1024/contest/3459/problem/2

非常直白的标题让我在点进去之前认为这是一个板子。我错了。

如果我们真的按照题目所说连边,那么只需要整个数列的值全部相同,就会存在 \(n^2\) 条边,不管是时间还是空间都会起飞。

我们发现两个点之间,至少需要一个公有的二进制位才能相连。那假如,我们把所有二进制位建虚点,并将点与其拥有的二进制位相连呢?

因为点与点之间没有直接连边,二进制位与二进制位之间也没有直接连边,它会变成一个二分图,其边数最多为 \(31\times n\)。

如何处理边权?考虑两个数,他们途径公有二进制位连边,边权应为两个点的权值之和。那这就很明显了,我们只需将一个点和其拥有的二进制位间连一条权值为该点数值的边即可。

namespace XSC062 {
using namespace fastIO;
const int inf = 1e18;
const int maxn = 1e5 + 5;
#define mkp std::make_pair
using pii = std::pair<int, int>;
struct _ {
	int v, w;
	_() {}
	_(int v1, int w1) {
		v = v1, w = w1;
	}
};
int n;
bool vis[maxn];
int a[maxn], dis[maxn];
std::vector<_> g[maxn];
std::priority_queue<pii> q;
inline void add(int x, int y, int w) {
	g[x].push_back(_(y, w));
	return;
}
inline void Dijk(int s) {
	for (int i = 2; i <= n + 32; ++i)
		dis[i] = inf;
	q.push(mkp(0, s));
	while (!q.empty()) {
		int f = q.top().second;
		q.pop();
		if (vis[f])
			continue;
		vis[f] = 1;
		for (auto i : g[f]) {
			if (dis[i.v] > dis[f] + i.w) {
				dis[i.v] = dis[f] + i.w;
				q.push(mkp(-dis[i.v], i.v));
			}
		}
	}
	return;
}
int main() {
	read(n);
	for (int i = 1; i <= n; ++i) {
		read(a[i]);
		for (int j = 0; j <= 31; ++j) {
			if (a[i] & (1ll << j)) {
				add(i, j + n + 1, a[i]);
				add(j + n + 1, i, a[i]);
			}
		}
	}
	Dijk(1);
	for (int i = 1; i <= n; ++i) {
		if (dis[i] == inf)
			print(-1, ' ');
		else print(dis[i], ' ');
	}
	return 0;
}
} // namespace XSC062

标签:std,连边,记录,int,二进制位,maxn,230325,dis
From: https://www.cnblogs.com/XSC062/p/17254240.html

相关文章

  • 做题记录 230324 // 最小生成树
    为什么擦眼睛会痛因为拭目痛いA.JungleRoadshttp://222.180.160.110:1024/contest/3452/problem/1纯最小生成树,比较坑的点是因为向POJ远程提交,所以没办法用万能头,......
  • 20230325 LCD1602
    关于模块式编程:模块化编程是一种编写代码的方法,将大型程序分解成小的、独立的模块,每个模块实现特定的功能,并且可以被其他程序调用和重复使用。这种方法可以提高代码的可维......
  • 一些操作系统相关的小题记录(未分类)
    4.以下哪—项不能有效利用程序的局部性?()A顺序读取数据对象B将主要的计算逻辑集中在内部循环并做优化C将相关代码拆散到多个c文件中D精简程序binary的大小这道题答......
  • java学习日记20230325-抽象类
    抽象类:当父类的某些方法需要声明,但是又不确定如何实现时,可以将其声明为抽象方法,那么这个类就是抽象类!所谓抽象方法,就是没有实现的方法;当一个类中存在抽象方法时,需要将......
  • SQLite数据库恢复,sqlite数据库删除记录恢复,sqlite误删除表数据恢复
    SQLite数据库恢复sqlite数据库删除记录恢复sqlite误删除表数据恢复客户名称保密数据类型SQlite3.x数据容量35MB故障类型客户误删除了表内数据需要恢复。修复结......
  • 记录两个赋值名次的方法,顺序保持不变
     有这样一个需要,在一个list<Bean>中,给Bean中的多个字段进行排名,例如数量、金额、同比、占比等添加上名次。写了以下两个工具类,将List,Bean.class和需要排名的字段传入即可......
  • 记录实习遇到的问题(二)
    **用于判断Int类型是否为空值**获取一个值,该值指示Nullable对象是否具有基础类型的有效值publicboolHasValue{get;}模式匹配-模式中的is和switch表达式,以......
  • 记录--用three.js渲染真实的下雨效果
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助建模首先我们需要一些贴图素材贴图素材一般可以在3dtextures网站上找到,这里我找了2份,包含了墙的法线贴......
  • 蒟蒻成长记录
    血的教训()不用#defineintlonglong了,今天poj死活过不去,把这行注释了就过了,以后还是用typedeflonglongll吧; 查了下 对于题目给定的数据范围,有必要选择一......
  • Django 大数据 orm 操作 - 报错及解决方法记录
    报错:django.db.utils.OperationalError:(1153,"Gotapacketbiggerthan'max_allowed_packet'bytes")解决方法:修改mysql配置文件的max_allowed_packet配置参数......