首页 > 其他分享 >CCPC-final 2019 Problem B - Infimum of Paths

CCPC-final 2019 Problem B - Infimum of Paths

时间:2024-01-19 17:45:13浏览次数:43  
标签:Paths ch int CCPC fans maxn ans 2019 mod

链接

参考题解
题意:求0->1路径上的数组成真小数最小值

若最小路径无环,则长度 \(\le\) n-1

方法一

从 \(0\) 开始,维护当前走到的点,每次都走边权(当前总体)最小的且 \(v\) 能到 \(1\) 的边,跑 \(2n\) 条边,

顺便沿路维护走过的边权

连 \(1\rarr 1\)代价为 \(0\) 的环,这样最后一定是在环里。在边权数组的 \(n+1\) 到 \(2n\) 项中一定存在循环,直接找最小周期即可(\(|s|-border(s)\))

方法二(要连 \(0\rarr 0\) 代价为 \(0\) 的环)

从小到大考虑到 1 点路径的距离,同时维护 路径距离为 i 时从 u 出发的路径最小排名为多少:\(f[u][i]\)

从 \(i \rarr i+1\) 时,以边权为第一关键字,\(f[v][i]\) 为第二关键字排序,得到 \(f[u][i+1]\)

同时维护路径(使 \(f[u][i+1]\) 最优的决策点 \(v\))

路径长度跑到 \(2n\) ,把最优路径抠出来,找环算贡献

第一种跟模拟赛上想到的思路比较接近(贪心),下面是代码。

#include<bits/stdc++.h>
#define ri register int
#define ll long long
using namespace std;
const int maxn = 4e3 + 10,mod = 1e9 + 7;
inline int rd(){
	int res = 0,f = 0;
	char ch = getchar();
	for(;!isdigit(ch);ch = getchar()) if(ch == '-') f = 1;
	for(;isdigit(ch);ch = getchar()) res = res * 10 + ch - 48;
	return f ? -res : res;
}
int t,head[maxn],tot,n,m,ok[maxn],ans[maxn],s[maxn],nxt[maxn],len;
struct edge{int to,nex,w;}e[maxn];
ll inv,fans;
inline ll qp(ll x,int k,ll ans = 1){
	for(;k;k>>=1,x=x*x%mod) if(k&1) ans=ans*x%mod;
	return ans;
}
inline void add(int u,int v,int w){e[++tot] = (edge){v,head[u],w}; head[u] = tot;}
vector<int> to[maxn],now,nex;
void dfs(int u){ok[u] = 1; for(auto v : to[u]) if(!ok[v]) dfs(v);}
int main(){
	t = rd(),inv = qp(10,mod - 2);
	int mnw;
	for(ri cas = 1;cas <= t;++cas){
		n = rd(),m = rd();
		tot = 0;
		for(ri i = 0;i < n;++i) ok[i] = head[i] = 0,to[i].resize(0);
		for(ri i = 1,u,v,w;i <= m;++i) u = rd(),v = rd(),w = rd(),add(u,v,w),to[v].push_back(u);
		add(1,1,0);
		dfs(1);
		now.resize(0),nex.resize(0);
		now.push_back(0);
		for(ri k = 1;k <= 2 * n;++k){
			mnw = 10;
			for(auto u : now)
				for(ri i = head[u];i;i = e[i].nex) if(ok[e[i].to]) mnw = min(e[i].w,mnw);
			ans[k] = mnw,nex.resize(0);
			for(auto u : now)
				for(ri i = head[u];i;i = e[i].nex) if(ok[e[i].to] && e[i].w == mnw) nex.push_back(e[i].to);
			sort(nex.begin(),nex.end());
			nex.resize(unique(nex.begin(),nex.end())-nex.begin());
			swap(now,nex);
		}
		for(ri i = n+1;i <= 2*n;++i) s[i-n] = ans[i];
		nxt[1] = 0;
		for(ri i = 2,j = 0;i <= n;++i){
			while(j && s[j+1] != s[i]) j = nxt[j];
			if(s[j+1] == s[i]) ++j;
			nxt[i] = j;
		}
		len = n - nxt[n]; fans = 0;
		for(ri i = 1;i <= len;++i) fans = (fans * 10 + s[i]) % mod;
		fans = fans * qp(qp(10,len)-1,mod - 2) % mod; fans = fans * 10 % mod;
		for(ri i = n;i >= 1;--i) fans = (fans * inv + ans[i]) % mod;
		fans = fans * inv % mod;
		printf("Case #%d: %lld\n",cas,fans);
	}
	return 0;
}

标签:Paths,ch,int,CCPC,fans,maxn,ans,2019,mod
From: https://www.cnblogs.com/Lumos1921/p/17975238

相关文章

  • [极客大挑战 2019]Knife 1
    [极客大挑战2019]Knife1审题没啥好审的,给出eval($_POST["Syc"]);一句话木马了知识点蚁剑连接一句话木马。做题蚁剑连接测试成功后打开找到flag。......
  • CCPC 2022 Guilin
    https://qoj.ac/contest/1303ALily直接做即可。BCodeWithNoForces考虑状压DP:\(f(S,T,R)\)表示对于每个人,时间是否达到要求的状态压缩为\(S\),空间是否达到要求的状态压缩为\(T\),运行结果是否达到要求的状态压缩为\(R\),转移直接枚举下一个跑的测试点即可。CArrayCo......
  • Windows 2016 2019 显示桌面图标
    运行cmd窗口输入命令rundll32.exeshell32.dll,Control_RunDLLdesk.cpl,,0弹出桌面图标设置窗口作者:VipSoft......
  • 《c++dll篇》VS2019生成dll及调用
    VS2019生成dll及调用生成DLL1.创建dll工程2.编写dll函数经过上述过程后工程中会生成几个自带的文件,可以自行创建或者更名,我直接在上面进行编写了。如下我先在pch.h中创建我需要调用函数的声明,他们分别用于实现加法和取最大值的功能,你可以根据自己的需求更改成自己的子程序。......
  • 2019 CSP-J
    2019CSP-JP5660数字游戏(语法)题意给定一个长度最大为\(8\)的01字符串,求字符串中有多少个\(1\)。题解#include<bits/stdc++.h>usingnamespacestd;/*====================*/#defineendl"\n"/*====================*/typedeflonglonglnt;/*===================......
  • 2019 CSP-J 江西
    2019CSP-J江西P5681面积(语法)题意求出边长为\(a\)的正方形与长宽分别为\(b,c\)的矩形哪一个面积更大。题解#include<bits/stdc++.h>usingnamespacestd;/*====================*/#defineendl"\n"/*====================*/typedeflonglonglnt;/*===========......
  • 2019 CSP-J
    P5660数字游戏(语法)题意给定一个长度最大为\(8\)的01字符串,求字符串中有多少个\(1\)。题解#include<bits/stdc++.h>usingnamespacestd;/*====================*/#defineendl"\n"/*====================*/typedeflonglonglnt;/*====================*/voidSo......
  • [极客大挑战 2019]HTTP 1
    [极客大挑战2019]HTTP1审题看到题目页面发现没啥东西,直接看源码发现了,Secret.php进入查看题目,发现又是一道跟着提示达到条件的题目知识点跟着题目走。解题题目说不是来自https://Sycsecret.buuoj.cn的访问,但是我们发现没有Referer,所以我们加入表示来源看到回显,他......
  • WindowsServer 2019安装域服务
    WindowsServer2019安装域服务导航目录WindowsServer2019安装域服务导航一、重命名主控服务器固定IP地址重命名域控服务器二、登录并创建服务三、检验安装域服务一、重命名主控服务器固定IP地址右击电脑右下角网络的标志,点击打开“网络和internet”设置,在屏幕中间的......
  • [极客大挑战 2019]LoveSQL 1
    [极客大挑战2019]LoveSQL1审题又是一道SQL题,还和上面Easy_SQL是一个系列的题。知识点SQL注入之联合查询。知识点详解联合查询基础讲解:union联合查询定义是:可以使用UNION操作符,将多个查询结果,按行进行纵向合并。基本语法SELECT<字段名>FROM<表名>UNIONSELECT<字......