离散化+矩阵快速幂

首先看数据范围可以确定该题的算法为矩阵快速幂

然后易得转移矩阵

\[\begin{bmatrix} 1 & 1 & 0 \\ 1 & 1 & 1 \\ 0 & 1 & 1 \end{bmatrix}
\]

然后把障碍离散下来重构,获取每段区间内障碍的情况(共\(2^3=8\)种)

重构的时候用辅助变量\(pre\)表示上一段区间对应的情况,易得重构部分的算法

若某一列有障碍,则将转移矩阵中的这一列全置0即可

为了减小代码复杂度,我们将每种情况与预处理后的转移矩阵一一对应,即可快速选择需要的转移矩阵

代码中用对应\(.kd\)二进制位为1表示该列有障碍

初始矩阵显然是

\[\begin{bmatrix} 0 \\ 1 \\ 0 \end{bmatrix}
\]

分段求矩阵快速幂即可

时间复杂度\(\Theta(n \log n + siz^3n \log m)\)

#include"cstdio"
#include"cstring"
#include"iostream"
#include"algorithm"
using namespace std; const int siz=8;
const int MAXN=1e4+5;
const int MOD=1e9+7; int n,pre,np;
long long m;
int cnt[siz];
struct Matrix{
int v[siz][siz];
int x,y; void clear(){memset(v,0,sizeof(v));x=y=0;}
void Mmul(Matrix a,Matrix b)
{
clear();x=a.x,y=b.y;int c=a.y;
for(int i=1;i<=x;++i){
for(int j=1;j<=y;++j){
for(int k=1;k<=c;++k){
v[i][j]+=(long long)a.v[i][k]*b.v[k][j]%MOD;
v[i][j]%=MOD;
}
}
}return;
} Matrix Mpw(Matrix a,long long b)
{
Matrix x;x.clear();x.x=x.y=a.x;
for(int i=1;i<=x.x;++i) x.v[i][i]=1;
while(b){
if(b&1) x.Mmul(x,a);
b>>=1;a.Mmul(a,a);
}return x;
} void write()
{
for(int i=1;i<=x;++i){
for(int j=1;j<=y;++j){
printf("%d ",v[i][j]);
}puts("");
}puts("");
return;
}
}A[siz],B;
struct rpg{
long long x;
int h;
bool kd;
}a[MAXN<<1];
struct lint{
long long siz;
int kd;
}line[MAXN<<1]; bool cmp(rpg a,rpg b){return a.x<b.x;}
void build()
{
for(int i=0;i<siz;++i) A[i].x=A[i].y=3;
for(int i=0;i<siz;++i){
for(int j=1;j<=2;++j){
for(int k=1;k<=2;++k){
A[i].v[j][k]=A[i].v[4-j][4-k]=1;
}
}for(int j=0;j<3;++j){
if(i&(1<<j)){
for(int k=1;k<=3;++k){
A[i].v[k][j+1]=0;
}
}
}
}B.x=3,B.y=B.v[2][1]=1;
return;
} void init()
{
build();
scanf("%d%lld",&n,&m);
for(int i=1;i<=n;++i) scanf("%d%lld%lld",&a[i].h,&a[i].x,&a[i+n].x),a[i+n].kd=1,a[i+n].h=a[i].h,++a[i+n].x;
sort(a+1,a+(n<<1)+1,cmp);np=line[1].siz=1;
for(int i=1;i<=n<<1;++i){
if(a[i].kd) --cnt[a[i].h];
else ++cnt[a[i].h];
if(a[i+1].x!=a[i].x){
int nw=0;
for(int j=1;j<=3;++j) if(cnt[j]) nw|=1<<j-1;
if(nw!=pre){
line[np].siz=a[i].x-line[np].siz;
pre=nw;
line[++np]=(lint){a[i].x,pre};
}
}
}line[np].siz=m-line[np].siz;
return;
} void solve()
{
for(int i=1;i<=np;++i) B.Mmul(A[line[i].kd].Mpw(A[line[i].kd],line[i].siz),B);
printf("%d\n",B.v[2][1]);
return;
} int main()
{
init();
solve();
return 0;
}

CF954F Runner's Problem的更多相关文章

  1. CF954F Runner's Problem(动态规划,矩阵快速幂)

    CF954F Runner's Problem(动态规划,矩阵快速幂) 题面 CodeForces 翻译: 有一个\(3\times M\)的田野 一开始你在\((1,2)\)位置 如果你在\((i, ...

  2. CF954F Runner's Problem(DP+矩阵快速幂优化)

    这题是一年前某场我参加过的Education Round codeforces的F题,当时我显然是不会的. 现在看看感觉应该是能做出的. 不扯了写题解: 考虑朴素的DP,在不存在障碍的情况下:f[i] ...

  3. Educational Codeforces Round 40 F. Runner's Problem

    Educational Codeforces Round 40 F. Runner's Problem 题意: 给一个$ 3 * m \(的矩阵,问从\)(2,1)$ 出发 走到 \((2,m)\) ...

  4. Educational Codeforces Round 40 (Rated for Div. 2) Solution

    从这里开始 小结 题目列表 Problem A Diagonal Walking Problem B String Typing Problem C Matrix Walk Problem D Fig ...

  5. Problem G

    Problem Description A relay is a race for two or more teams of runners. Each member of a team runs o ...

  6. AnsibleAPI源码剖析(1)-Runner类的 初始化

    #ansible版本说明:ansible1.9.1 1.简单使用例子 # -*- coding=utf-8 -*- import ansible.runner #################### ...

  7. org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Unexpected failure during bean definition parsing Offending resource: class path resource [applicationC

    这个错误是 org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration proble ...

  8. org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Can

    org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Can ...

  9. 整合mybatis时报错:Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/tx]

    org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Una ...

随机推荐

  1. python打造渗透工具集

    python是门简单易学的语言,强大的第三方库让我们在编程中事半功倍,今天我们就来谈谈python在渗透测试中的应用,让我们自己动手打造自己的渗透工具集. 难易程度:★★★阅读点:python;web ...

  2. pythonweb框架Flask学习笔记04-模板继承

    # -*- coding:utf-8 -*- from flask import render_template,Flask app=Flask(__name__) @app.route('/hell ...

  3. Linux必备命令

      目录                                                              概述 常用系统工作命令 系统状态检测命令 工作目录切换命令 文本文件 ...

  4. POJ 1050

    #include <stdio.h> #include <string.h> #define mt 101 int main() { int a[mt][mt]; int st ...

  5. POJ 1046

    #include<iostream> using namespace std; #define MAXN 16 #define inf 100000000 struct node { in ...

  6. (转)Linux 文件目录特殊权限设定(SUID,SGID,SBIT)

    原文:https://blog.csdn.net/leshami/article/details/77184029 Linux文件及目录的权限设定,除了我们孰知的读写执行(rwx)之外,还有一些特殊的 ...

  7. android Service 学习总结

    学习android开发已经四五个月,由于项目中职责的原因一直没有接触过Service的实际项目,今天重新学一遍Service用法. 问题: 作为四大组件,为什么需要Service? 它与Thread又 ...

  8. C++的开源跨平台日志库glog学习研究(二)--宏的使用

    上一篇从整个工程上简单分析了glog,请看C++的开源跨平台日志库glog学习研究(一),这一篇对glog的实现代码入手,比如在其源码中以宏的使用最为广泛,接下来就先对各种宏的使用做一简单分析. 1. ...

  9. 如何使用Android Studio提高App质量

    Android Studio作为现在谷歌主推的Android开发功能,除了提供了大量的功能帮助快速开发Android代码之外,在代码质量控制方面也提供了很多工具,这些工具都放在Analyze菜单下, ...

  10. Android_Activity启动模式

    在android里,有4种activity的启动模式,分别为: “standard” (默认) “singleTop” “singleTask” “singleInstance” 它们主要有如下不同: ...