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 对不起我又想网络流去了 你看这长得多像啊,走过至少多少条边就是流量下界,然后没上界 但是这个题求的最少走多少条边啊...完 ...
随机推荐
- 二、Django快速安装
一.安装Python 作为一个Python Web框架,Django依赖Python.从Django适用于哪些版本的Python可以获取更多信息.较新版本的Python内置一个轻量级的数据库SQLit ...
- 使用Firebug或chrome-devToolBar深入学习javascript语言核心
使用Firebug和chrome-devToolBar调试页面样式或脚本是前端开发每天必做之事.这个开发神器到底能给我们带来哪些更神奇的帮助呢?这几天看的一些资料中给了我启发,能不通过Firebug和 ...
- fail-fast 机制 思考
HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的. Iterator支持fail-fast机制,而Enum ...
- Python多重赋值
可以将变量名视对象的一个链接 >>>foo1 = foo2 = 4.3 >>>foo1 is foo2 True >>>foo1 = 4.3 &g ...
- mysql系列学习
# 帮助help create user;# 查看当前用户select user();# 创建用户create user 'egon'@'localhost' identified by '123'; ...
- 2.openldap安装
1.安装步骤如下 获取软件包 安装软件包(rpm或者源码编译) 生产openldap配置文件及数据库文件 配置 添加目录树条目 加载slapd进程 验证 2.所需安装包说明 openldap,open ...
- Spark SQL、DataFrame和Dataset——转载
转载自: Spark SQL.DataFrame和Datase
- Thunder团队——选题展示
团队名称:Thunder 组长:王航 成员:李传康.代秋彤.邹双黛.苗威.宋雨.胡佑蓉.杨梓瑞 项目名称:爱阅app 视频展示: http://www.cnblogs.com/lick468/p/76 ...
- 2018-2019-20172321 《Java软件结构与数据结构》第四周学习总结
2018-2019-20172321 <Java软件结构与数据结构>第四周学习总结 教材学习内容总结 第六章 6.1列表集合 列表集合是一种概念性表示法,其思想是使事物以线性列表的方式进行 ...
- TensorFlow:NameError: name ‘input_data’ is not defined
在运行TensorFlow的MNIST实例时,第一步 import tensorflow.examples.tutorials.mnist.input_data mnist = input_data. ...