这破题调了我一天...错了一大堆细节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)的更多相关文章

  1. Codeforces 576D Flights for Regular Customers(矩阵加速DP)

    题目链接  Flights for Regular Customers 首先按照$d$的大小升序排序 然后分成$m$个时刻,每条路径一次处理过来. $can[i][j]$表示当前时刻$i$能否走到$j ...

  2. Codeforces 576D Flights for Regular Customers (图论、矩阵乘法、Bitset)

    题目链接 http://codeforces.com/contest/576/problem/D 题解 把边按\(t_i\)从小到大排序后枚举\(i\), 求出按前\((i-1)\)条边走\(t_i\ ...

  3. Codeforces 576D Flights for Regular Customers 矩阵快速幂+DP

    题意: 给一个$n$点$m$边的连通图 每个边有一个权值$d$ 当且仅当当前走过的步数$\ge d$时 才可以走这条边 问从节点$1$到节点$n$的最短路 好神的一道题 直接写做法喽 首先我们对边按$ ...

  4. Codeforces 576D - Flights for Regular Customers(bitset 优化广义矩阵乘法)

    题面传送门 题意: 有一张 \(n\) 个点 \(m\) 条边的有向图,你初始在 \(1\) 号点,边上有边权 \(c_i\) 表示只有当你经过至少 \(c_i\) 条边的时候你才能经过第 \(i\) ...

  5. CF576D Flights for Regular Customers 矩阵乘法 + Bitset优化

    %%%cxhscst2's blog Codeforces 576D Flights for Regular Customers(矩阵加速DP) 代码非常优美 + 简洁,学习到了 Code: #inc ...

  6. (中等) 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 ...

  7. 576D Flights for Regular Customers

    分析 https://www.cnblogs.com/onioncyc/p/8037056.html 写的好像有点问题 但是大致就是这个意思 代码很好理解 代码 #include<bits/st ...

  8. 【CodeForces】576 D. Flights for Regular Customers

    [题目]D. Flights for Regular Customers [题意]给定n个点m条边的有向图,每条边有di表示在经过该边前必须先经过di条边,边可重复经过,求1到n的最小经过边数.n,m ...

  9. 「CF576D」 Flights for Regular Customers

    「CF576D」 Flights for Regular Customers 对不起我又想网络流去了 你看这长得多像啊,走过至少多少条边就是流量下界,然后没上界 但是这个题求的最少走多少条边啊...完 ...

随机推荐

  1. halcon中关于文本的创建以及写入

    原文链接:http://blog.sina.com.cn/s/blog_61cc743001017nxr.html#FileName 1.open_file( : : FileName, FileTy ...

  2. 用Micro:bit做床头灯

    这是一个非常简单的项目,给孩子们介绍感应和控制,使用光敏电阻LDR作为光线传感器和床头灯的LED. 这也介绍了模拟输入的概念.数字输入为ON或OFF.只有0和1两种可能的条件.仿真输入是一系列可能值中 ...

  3. EasyUI validatebox 自定义ajax验证用户名是否已存在

    <td><input type="text" id="userName" name="userName" class=&q ...

  4. 特征点检测--基于CNN:TILDE: A Temporally Invariant Learned DEtector

    TILDE: A Temporally Invariant Learned DEtector Yannick Verdie1,∗ Kwang Moo Yi1,∗ Pascal Fua1 Vincent ...

  5. Dev C++支持ISOC++11标准

    报错如下: [Error] #error This file requires compiler and library support for the ISO C++ 2011 standard. ...

  6. [咸恩静][Coffee House]

    歌词来源:http://music.163.com/#/song?id=5400159 하루의 시작은 향긋한 커피 [ha-lu-e xi-ja-geun hyang-geu-Tan Keo-Pi] ...

  7. UI优秀框架(库)

    1.vux 官网:https://doc.vux.li/zh-CN/ Github:https://github.com/airyland/vux 13818  Stars  3064 Forks   ...

  8. nagios监控安装esxi的服务器(宿主机)

    首先,该博文大部分内容来自网络,少部分是自己监控过程中遇到的问题.如果有侵权,请联系告知!!! 现在互联网公司,有能力的都是自己研发监控系统,要么就是zabbix或者小米的监控,还都二次开发等等,可能 ...

  9. KETTLE监控

    kettle单实例环境下自身没有监控工具,但在集群下自带了监控工具. 一.集群自带的监控 kettle自带的集群监控工具可以监控转换的执行情况. 配置好集群后,打开浏览器:输入http://local ...

  10. python 二维矩阵及转byte知识点

    1.注意python中的数组和list形式混合: 数组在numpy里面: 2.二维数组这样定义可以修改固定位置的值: rawDataArray_temp = [([0]*nIRImageWidth)f ...