离散化+矩阵快速幂

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

然后易得转移矩阵

\[\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. Tomcat启动内存设置

    Tomcat启动内存设置 Tomcat的启动分为startupo.bat启动和注册为windows服务的启动,下面一一说明. 1.startup.bat启动 在tomcat_home/bin目录下找到 ...

  2. HTML+Javascript制作拼图小游戏详解(一)

    本文章将分享一个来自前端菜鸟突发奇想的拼图游戏制作方法以及实现过程. 话不多说,先上图. 首先我们需要写好网页的基本布局(此处涉及简单的HTML和CSS知识). 网页一共分为三个区域,左侧时间显示区, ...

  3. Vue+Flask看这篇就够了

    一.项目目录结构 使用Vue+Flask搭建前后端分离的基础平台. my_project/ app/ //vue目录 static/ models/ remplates/ 404.html index ...

  4. day 53 Django form 组件 autu 组件

    https://github.com/Endless-Clould/homework/tree/master/auto_zujian ---恢复内容开始--- 前情提要: Django 组件 的 fo ...

  5. 通过sessionStorage来根据屏幕宽度变化来加载不同的html页面

    因为项目需要,分别写了移动端和PC端的两个html页面,现在需要根据不同的屏幕宽度来加载对应的页面. 先说一下本人的思路-- 刚开始我直接在加载页面的时候判断屏幕宽度,然后加载相应的页面,大家是不是也 ...

  6. 初始化css文件

    首先我们需要了解一下为什么需要公共样式(公共样式是为了初始化某些标签的默认值): 1. 因为浏览器的兼容问题,不同浏览器对有些标签的默认值是不同的,如果没对CSS初始化往往会出现浏览器之间的页面显示差 ...

  7. NOIP2017滚粗记【下】

    (续上篇) Day1: 下午,全竞赛队的人都在竞赛室颓~,再次吐槽下我校网管科的,下午普及考试又把竞赛室的网络切掉了,还好我们机制地准别了一堆单机游戏.普及组考完后,网络又恢复正常了,但晚上9点左右又 ...

  8. js集合set类的实现

    js集合set类的实现 /*js集合set类的实现*/ function Set() { this.dataStore = []; this.add = add;//新增元素 this.remove ...

  9. Linux终端复用工具 tmux

    简介 Terminal Multiplexer (From WIKIPEDIA) - A terminal multiplexer is a software application that can ...

  10. Java之IO(七)ObjectInputStream和ObjectOutputStream

    转载请注明源出处:http://www.cnblogs.com/lighten/p/7003536.html 1.前言 本章介绍Java字节流中重要的成员,对象流ObjectInputStream和O ...