Codeforces 576D. Flights for Regular Customers(倍增floyd+bitset)
这破题调了我一天...错了一大堆细节T T
首先显然可以将边权先排序,然后逐个加进图中。
加进图后,倍增跑跑看能不能到达n,不能的话加新的边继续跑。
倍增的时候要预处理出h[i]表示转移矩阵的2^0~i的或和,转移是h[i]=h[i-1]*h[i-1]。
注意两个矩阵包含0~i和0~j相乘的时候,得到的矩阵是0~i*j的,而两个矩阵包含0~i和0~j或起来的时候,得到的矩阵是j~i+j的。
倍增的时候因为必须答案单调,所以当前的值必须或上之前的值。
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<bitset>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=, inf=1e9+;
struct mtx{bitset<maxn>mp[maxn]; mtx(){for(int i=;i<maxn;i++) mp[i].reset();}}tmp, tmp2, f, base, h[];
struct poi{int x, y, dis;}a[maxn];
int n, m;
mtx operator *(mtx a, mtx b)
{
mtx c;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(a.mp[i][j]) c.mp[i]|=b.mp[j];
return c;
}
mtx operator |(mtx a, mtx b)
{
mtx c;
for(int i=;i<=n;i++)
c.mp[i]|=a.mp[i]|b.mp[i];
return c;
}
inline void power(int b)
{
if(b<=) return;
for(;b;b>>=, tmp=tmp*tmp)
if(b&) f=f*tmp;
}
inline bool cmp(poi a, poi b){return a.dis<b.dis;}
int main()
{
scanf("%d%d", &n, &m);
for(int i=;i<=m;i++) scanf("%d%d%d", &a[i].x, &a[i].y, &a[i].dis);
sort(a+, a++m, cmp); a[m+].dis=inf;
if(a[].dis) return puts("Impossible"), ;
for(int i=;i<=n;i++) f.mp[i][i]=;
for(int i=;i<=m;i++)
{
tmp=base; power(a[i].dis-a[i-].dis);
base.mp[a[i].x][a[i].y]=;
int up=log2(a[i+].dis-a[i].dis);
h[]=base; for(int j=;j<=n;j++) h[].mp[j][j]=h[].mp[j][j]|;
mtx tmpx; for(int j=;j<=n;j++) tmpx.mp[j][j]=;
if(a[i+].dis-a[i].dis & ) tmpx=tmpx|(tmpx*h[]);
for(int j=;j<=up;j++)
{
h[j]=h[j-]*h[j-];
if(a[i+].dis-a[i].dis & (<<j)) tmpx=tmpx|(tmpx*h[j]);
}
tmpx=f*tmpx;
if(!tmpx.mp[][n]) continue;
mtx tmp1=f; int ans=;
for(int j=up;j>=;j--)
if(a[i].dis+ans+(<<j)<=a[i+].dis)
{
tmp2=tmp1; tmp2=tmp2*h[j];
if(tmp2.mp[][n]) continue;
ans+=(<<j); tmp1=tmp2;
}
return printf("%d\n", a[i].dis+ans+), ;
}
puts("Impossible");
}
Codeforces 576D. Flights for Regular Customers(倍增floyd+bitset)的更多相关文章
- Codeforces 576D Flights for Regular Customers(矩阵加速DP)
题目链接 Flights for Regular Customers 首先按照$d$的大小升序排序 然后分成$m$个时刻,每条路径一次处理过来. $can[i][j]$表示当前时刻$i$能否走到$j ...
- Codeforces 576D Flights for Regular Customers (图论、矩阵乘法、Bitset)
题目链接 http://codeforces.com/contest/576/problem/D 题解 把边按\(t_i\)从小到大排序后枚举\(i\), 求出按前\((i-1)\)条边走\(t_i\ ...
- Codeforces 576D Flights for Regular Customers 矩阵快速幂+DP
题意: 给一个$n$点$m$边的连通图 每个边有一个权值$d$ 当且仅当当前走过的步数$\ge d$时 才可以走这条边 问从节点$1$到节点$n$的最短路 好神的一道题 直接写做法喽 首先我们对边按$ ...
- Codeforces 576D - Flights for Regular Customers(bitset 优化广义矩阵乘法)
题面传送门 题意: 有一张 \(n\) 个点 \(m\) 条边的有向图,你初始在 \(1\) 号点,边上有边权 \(c_i\) 表示只有当你经过至少 \(c_i\) 条边的时候你才能经过第 \(i\) ...
- CF576D Flights for Regular Customers 矩阵乘法 + Bitset优化
%%%cxhscst2's blog Codeforces 576D Flights for Regular Customers(矩阵加速DP) 代码非常优美 + 简洁,学习到了 Code: #inc ...
- (中等) CF 576D Flights for Regular Customers (#319 Div1 D题),矩阵快速幂。
In the country there are exactly n cities numbered with positive integers from 1 to n. In each city ...
- 576D Flights for Regular Customers
分析 https://www.cnblogs.com/onioncyc/p/8037056.html 写的好像有点问题 但是大致就是这个意思 代码很好理解 代码 #include<bits/st ...
- 【CodeForces】576 D. Flights for Regular Customers
[题目]D. Flights for Regular Customers [题意]给定n个点m条边的有向图,每条边有di表示在经过该边前必须先经过di条边,边可重复经过,求1到n的最小经过边数.n,m ...
- 「CF576D」 Flights for Regular Customers
「CF576D」 Flights for Regular Customers 对不起我又想网络流去了 你看这长得多像啊,走过至少多少条边就是流量下界,然后没上界 但是这个题求的最少走多少条边啊...完 ...
随机推荐
- 面向英特尔® x86 平台的 Unity* 优化指南: 第 1 部分
原文地址 目录 工具 Unity 分析器 GPA 系统分析器 GPA 帧分析器 如要充分发挥 x86 平台的作用,您可以在项目中进行多种性能优化,以最大限度地提升性能. 在本指南中,我们将展示 Uni ...
- 内网集群准同步shell脚本
在公司的内网中配置集群同步,可能是代理问题,ntpd和chrony都没有用,所以只好写shell脚本解决 前提条件集群中各台机器已经配置好了免密登录 一.免密登录配置 1. 用 root 用户登录.每 ...
- 观察者模式——Java实例
一.定义 观察者模式(有时又被称为模型-视图(View)模式.源-收听者(Listener)模式或从属者模式)是软件设计模式的一种.观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个 ...
- 在香港网站使用工商银行的MasterCard,工商银行所犯的低级的错误,金融安全何在
- pyextend库-accepts函数参数检查
pyextend - python extend lib accepts(exception=TypeError, **types) 参数: exception: 检查失败时的抛出异常类型 **typ ...
- LeetCode 888. Fair Candy Swap(C++)
题目: Alice and Bob have candy bars of different sizes: A[i] is the size of the i-th bar of candy that ...
- Scrum立会报告+燃尽图(十月二十三日总第十四次)
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2246 项目地址:https://git.coding.net/zhang ...
- Thunder团队第七周 - Scrum会议4
Scrum会议4 小组名称:Thunder 项目名称:i阅app Scrum Master:翟宇豪 工作照片: 宋雨在照相,所以不在相片中. 参会成员: 王航:http://www.cnblogs.c ...
- C#中委托的理解
请注意,这只是个人关于C#中委托的一点点理解,参考了一些博客,如有不周之处,请指出,谢谢! 委托是一种函数指针,委托是方法的抽象,方法是委托的实例.委托是C#语言的一道坎,明白了委托才能算是C#真正入 ...
- rsyslog配置文件详解(rsyslog.conf)
# rsyslog configuration file # For more information see /usr/share/doc/rsyslog-*/rsyslog_conf.html # ...