这破题调了我一天...错了一大堆细节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. scrapy 爬取知乎问题、答案 ,并异步写入数据库(mysql)

      python版本  python2.7 爬取知乎流程: 一 .分析 在访问知乎首页的时候(https://www.zhihu.com),在没有登录的情况下,会进行重定向到(https://www. ...

  2. Update类型_JDBC的方法_JAVA方法_Loadrunner脚本

    java vuser   JDBC 参数化的方法 如果不进行参数化 直接把32  33行去掉 ,sql 值写到valuers  中就行了 下面这是 insert,delete,update  三种方法 ...

  3. MongoDB Chapter1:Introduction

    你是在防火墙后面吗? 为了继续本课程,您必须能够将计算机的传出请求发送到我们在MongoDB Atlas中设置的数据库服务器.这些服务器在Amazon AWS中的端口27017上运行. 请单击http ...

  4. python基础-02-while格式化逻辑运算

    python其他知识目录 1.循环打印“我是小马过河” while True:    print('我是小马过河') #4.用while从一打印到10 #5.请通过循环,1 2 3 4 5 6 8 9 ...

  5. [笔记] FreeBSD使用小技巧

    非交互式添加用户 sed直接修改文件 sed -i '' 's/a/b/' file sed添加一行 sed '1a\ newline' file sed '1s/.*/&\'$'\nnewl ...

  6. Scrum立会报告+燃尽图(十一月十九日总第二十七次):功能开发与修复上一阶段bug

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2284 项目地址:https://git.coding.net/zhang ...

  7. 跳蚤APP

    1.项目描述 我们致力于制作一款服务于校内师生的物品转让平台,在此平台上的用户可以发布要转让或欲购买的物品信息. 2.创新与收益 Need(需求) 如今在市场上有许多的二手交易线上平台,它们的服务范围 ...

  8. 利用p4实现ipv6转发实验

    写在前面 只是作为一个入门p4的实验尝试,借用了一些即成的运行代码. p4代码 /**p4_16,v1_model**/ #include<core.p4> #include<v1m ...

  9. 关于在eclipse Oxygen 2017环境下spring3.2 asm的异常

    今天在oxygen 2017下构建spring3.2+mybatis项目时,发生异常,大概是说无法解析我mapper.class文件,错误发生在core.asm中<unknow:source&g ...

  10. 安装Ubuntu 16.04双系统详解(Nvidia显卡)

    Ubuntu16.04双系统安装 一.准备工作 设备:惠普台式机,i5-7400.8G内存.1T机械硬盘.NVIDIA GTX1050显卡.预装系统:Win10. 1.下载ubuntu镜像文件,本人使 ...