CF954F Runner's Problem
离散化+矩阵快速幂
首先看数据范围可以确定该题的算法为矩阵快速幂
然后易得转移矩阵
\]
然后把障碍离散下来重构,获取每段区间内障碍的情况(共\(2^3=8\)种)
重构的时候用辅助变量\(pre\)表示上一段区间对应的情况,易得重构部分的算法
若某一列有障碍,则将转移矩阵中的这一列全置0即可
为了减小代码复杂度,我们将每种情况与预处理后的转移矩阵一一对应,即可快速选择需要的转移矩阵
代码中用对应\(.kd\)二进制位为1表示该列有障碍
初始矩阵显然是
\]
分段求矩阵快速幂即可
时间复杂度\(\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的更多相关文章
- CF954F Runner's Problem(动态规划,矩阵快速幂)
CF954F Runner's Problem(动态规划,矩阵快速幂) 题面 CodeForces 翻译: 有一个\(3\times M\)的田野 一开始你在\((1,2)\)位置 如果你在\((i, ...
- CF954F Runner's Problem(DP+矩阵快速幂优化)
这题是一年前某场我参加过的Education Round codeforces的F题,当时我显然是不会的. 现在看看感觉应该是能做出的. 不扯了写题解: 考虑朴素的DP,在不存在障碍的情况下:f[i] ...
- Educational Codeforces Round 40 F. Runner's Problem
Educational Codeforces Round 40 F. Runner's Problem 题意: 给一个$ 3 * m \(的矩阵,问从\)(2,1)$ 出发 走到 \((2,m)\) ...
- Educational Codeforces Round 40 (Rated for Div. 2) Solution
从这里开始 小结 题目列表 Problem A Diagonal Walking Problem B String Typing Problem C Matrix Walk Problem D Fig ...
- Problem G
Problem Description A relay is a race for two or more teams of runners. Each member of a team runs o ...
- AnsibleAPI源码剖析(1)-Runner类的 初始化
#ansible版本说明:ansible1.9.1 1.简单使用例子 # -*- coding=utf-8 -*- import ansible.runner #################### ...
- 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 ...
- org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Can
org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Can ...
- 整合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 ...
随机推荐
- 使用VS Code开发.Net Core 2.0 MVC Web应用程序教程之一
好吧,现在我们假设你已经安装好了VS Code开发工具..Net Core 2.0预览版的SDK dotnet-sdk-2.0.0(注意自己的操作系统),并且已经为VS Code安装好了C#扩展(在V ...
- 堆排序(最大堆)的理解和实现(Java)
堆的定义 堆是具有下列性质的完全二叉树:每个节点的值都大于或等于其左右孩子节点的值,称为大顶堆:或者每个节点的值都小于或等于其左右孩子的值,称为小顶堆.如下图举例: 通过堆的定义可知,根节点一定是对中 ...
- 使用js栈stack类的实现
使用js栈stack类的实现 /*使用栈stack类的实现*/ function stack() { this.dataStore = [];//保存栈内元素,初始化为一个空数组 this.top = ...
- Delphi获取IdHTTP1.Get(url)的返回参数
var ss: TStringStream; begin ss := TStringStream.Create(''); idHTTP1.get(url, ss); ss.Positi ...
- json,DataTable,model
1.DataTable转json public class DataTableConvertJson { #region dataTable转换成Json格式 /// <summary> ...
- 学生信息管理系统-顺序表&&链表(数据结构第一次作业)
实验目的 : 1 .掌握线性表的定义: 2 .掌握线性表的基本操作,如建立.查找.插入和删除等. 实验内容: 定义一个包含学生信息(学号,姓名,成绩)的的 顺序表和链表,使其具有如下功能: (1) 根 ...
- AbstractFactory抽象工厂模式(创建型模式)
1.new 的问题 常见的对象创建方法: //创建一个Road对象 Road road=new Road(); new的问题:实现依赖,不能应对具体实例的变化 怎么理解上面这句话呢? 可以这样理解:我 ...
- Spring Security构建Rest服务-0702-个性化用户认证流程2
登录成功后的处理AuthenticationSuccessHandler: 认证成功后,默认情况下spring security会继续访问之前访问的url,如果想自定义处理逻辑,用默认的就不行了.此时 ...
- 使用EntityFrameworkCore 连接 MySql
上篇文章介绍了如何在dotnetcore下使用Dapper连接MySql,这里再介绍使用使用EntityFrameworkCore 连接 MySql. 新建控制台项目,安装下面两个nuget包: In ...
- js验证整数,浮点数
//验证数字(整数.浮点数都可以通过) function isfloat(oNum){ if(!oNum) return false; var strP=/^\d+(\.\d+)?$/; if(!st ...