首页 > 其他分享 >快速幂模板/洛谷P1226【模板】快速幂

快速幂模板/洛谷P1226【模板】快速幂

时间:2024-09-20 16:45:21浏览次数:13  
标签:洛谷 read ll P1226 时间 号点 可以 模板 dis

​本题是CSP-J组的第四题。

题意:
给出一个有向图,当前在 1号点,初始在时间 0,必须在 k的倍数的时间出发,且到终点的时间也必须是 k 的倍数。

每条边有一个边权 ,只有在当前时间 ≥时才可以通过,且不能在原地不动,即每一个时间点必须走一条边。

问从 11 号点出发到 nn 号时最早的时刻。(没有方案则输出 −1−1)

思路:
因为 k≤100k≤100 很小,所以我们可以从 k入手。

注意到,如果我当前到达了 u号点,且当前时间为 p,这条边边权为 w,如果 p<wp<w,那么显然当前不能通过。

但是因为如果当前可以走到这个点,那么可以晚一些 kk 的倍数的时间出发,依然可以走到这个点,则我们可以在入口处等待一些时间,使得可以通过这条边,等待时间为,即等待 个k 的倍数,这样就可以通过这条边了,耗费时间为。

现在通过每条边的时间更出发点为 k的倍数有关系,则我们可以建立以下状态:定义 为到达 i号点的时间modk 的值为 j时的最短消耗时间。

那么答案显然是。

然后看一下转移,如果 p≥w了,那么可以直接通过,则 ——>。

否则的话,令,即我们在入口处等待一些时间,使得可以走到这条边,转移为 ——>min(,p+1)。

可以运用 dijkstra 算法的思想来进行转移,每次去堆顶选取耗时最短的那个点,然后逐层松弛。

时间复杂度为:O(n×klog⁡n)。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N = 10010, M = 105;
inline ll read() {
	ll x = 0, f = 1;
	char c = getchar();
	while (c < '0' || c>'9') {
		if (c == '-')
			f = -1;
		c = getchar();
	}
	while (c >= '0' && c <= '9') {
		x = (x << 1) + (x << 3) + (c ^ 48);
		c = getchar();
	}
	return x * f;
}
inline void write(ll x) {
	if (x < 0) {
		putchar('-');
		x = -x;
	}
	if (x > 9)
		write(x / 10);
	putchar(x % 10 + '0');
}
ll n, m, k;
ll dis[N][M];
bool f[N][M];
vector<pair<ll, ll>> E[N];
priority_queue<pair<ll, ll>, vector<pair<ll, ll>>, greater<pair<ll, ll>>> q;
void add(ll u, ll v, ll w) {
	E[u].push_back({ v,w });
}
void dijkstra(ll s) {
	dis[s][0] = 0;
	q.push({ 0,s });
	while (!q.empty()) {
		ll u = q.top().second, p = q.top().first;
		q.pop();
		if (f[u][p % k])
			continue;
		f[u][p % k] = 1;
		for (auto d : E[u]) {
			ll v = d.first, w = d.second, t = (p + 1) % k;
			if (p >= w)
				t = p;
			else
				t = ((w - p + k - 1) / k) * k + p;
			if (dis[v][(t + 1) % k] > t + 1) {
				dis[v][(t + 1) % k] = t + 1;
				q.push({ t + 1,v });
			}
		}
	}
}
int main() {
	memset(dis, 0x3f, sizeof(dis));
	n = read(), m = read(), k = read();
	for (int u, v, w, i = 0; i < m; i++) {
		u = read(), v = read(), w = read();
		add(u, v, w);
	}
	dijkstra(1);
	if (!f[n][0])
		puts("-1");
	else
		write(dis[n][0]);
	return 0;
}

标签:洛谷,read,ll,P1226,时间,号点,可以,模板,dis
From: https://www.cnblogs.com/src1024/p/18422802

相关文章

  • VSCode 定义代码模板
    在使用编写代码的过程中,经常会写一些固定代码段。以Java为例,定义实体类时一般都会编写序列化版本号:@SerialprivatestaticfinallongserialVersionUID=1L;这段代码是固定写法,基本不会变,如果每次都手写的话,就比较繁琐了。VSCode提供了生成代码段的功能,为我们提供了便......
  • Nuxt Kit 中的模板处理
    title:NuxtKit中的模板处理date:2024/9/20updated:2024/9/20author:cmdragonexcerpt:摘要:本文详细介绍了在Nuxt3框架中,使用NuxtKit进行模板处理的方法,包括理解模板基本概念、使用addTemplate动态生成文件、应用addTypeTemplate注册类型模板以增强TypeScript支持,以......
  • Nuxt Kit 中的模板处理
    title:NuxtKit中的模板处理date:2024/9/20updated:2024/9/20author:cmdragonexcerpt:摘要:本文详细介绍了在Nuxt3框架中,使用NuxtKit进行模板处理的方法,包括理解模板基本概念、使用addTemplate动态生成文件、应用addTypeTemplate注册类型模板以增强TypeScript......
  • 帝国cms标签模板调用不了怎么办
    对于EmpireCMS(帝国CMS)标签模板调用失败的问题,可以尝试以下几个步骤来排查和解决:检查标签语法:确认使用的标签语法是否正确,包括标签名称、属性及其值是否符合EmpireCMS的规范。检查是否有拼写错误或遗漏的部分。验证数据表和字段:确保在标签中引用的数据表和字段......
  • 基于Uni-app前端框架的SUMER UI3.0组件库!一端开发,多端运行!本组件库可快速二次开发各种
    基于Uni-app前端框架的SUMERUI3.0组件库!一端开发,多端运行!本组件库可快速二次开发各种类别各行业模板,包括:商城、视频、直播、聊天、支付、新闻、社区、地图、导航、出行、社区、博客等sumer-ui介绍基于uView微信小程序UI组件库,兼容vue3。本插件是SUMER组件库,只提供组件......
  • C++刷怪笼(6)模板初阶
    1.前言在学习C++模板之前,我们会被同种函数的不同数据类型的繁琐写法而折磨,今天我们进入对模板的学习,来进一步的感受C++为我们今后的编程学习和工作所带来的便利。2.模板2.1泛型编程我们应该如何去实现一个所有数据类型通用的函数?voidSwap(int&left,int&right){i......
  • 【洛谷 P5730】【深基5.例10】显示屏 题解(数组+循环)
    【深基5.例10】显示屏题目描述液晶屏上,每个阿拉伯数字都是可以显示成的点阵的(其中X表示亮点,.表示暗点)。现在给出数字位数(不超过)和一串数字,要求输出这些数字在显示屏上的效果。数字的显示方式如同样例输出,注意每个数字之间都有一列间隔。输入格式第一行输入一个正整数,表示数......
  • 公众号发送模板消息
    gradle配置plugins{id'java'id'org.springframework.boot'version'3.0.4'id'io.spring.dependency-management'version'1.1.0'}group='com.example'version='0.0.1-SNAPSHO......
  • java 根据模板导出word文档(poi-tl)
    poi-tl是什么poi-tl是一个基于Apache POI的Word模板引擎,也是一个免费开源的Java类库,你可以非常方便的加入到你的项目中,并且拥有着让人喜悦的特性。为什么选择poi-tl方案移植性功能性易用性Poi-tlJava跨平台Word模板引擎,基于ApachePOI,提供更友好的API低代码,准备......
  • 洛谷题单指南-分治与倍增-P2345 [USACO04OPEN] MooFest G
    原题链接:https://www.luogu.com.cn/problem/P2345题意解读:有n头牛,每头牛都有听力v、坐标x两个属性,要计算每两头牛的max{vi​,vj​}×∣xi​−xj​∣之和。解题思路:首先想到的肯定是枚举法,需要O(n^2)的复杂度有没有优化的方法?可以采用分治法!由于是计算两头牛之间的max{vi​,......