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 ...
随机推荐
- 微信Netting-QRLJacking分析利用-扫我二维码获取你的账号权限
首先我们来看一下QRLJacking的实际原理:.攻击者首先进行客户端QR会话,并将登录QR码复制到网络钓鱼网站.“现在,一个精心制作的网络钓鱼页面有一个有效和定期更新的QR码可以被发送给受害者.” ...
- Netty核心概念(7)之Java线程池
1.前言 本章本来要讲解Netty的线程模型的,但是由于其是基于Java线程池设计而封装的,所以我们先详细学习一下Java中的线程池的设计.之前也说过Netty5被放弃的原因之一就是forkjoin结 ...
- Dubbo架构设计详解(转载)
原文地址:http://shiyanjun.cn/archives/325.html Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解 ...
- Eclipse *版本(图文详解)
不多说,直接上干货! 关于Eclipse的版本介绍 Eclipse Standard 该版本是eclipse最基础的版本,适合Java se个人开发者.或希望根据自己需求配置插件的开发者使用. Ecl ...
- golang-nsq消息队列应用
1. 安装nsq brew install nsq 2.启动nsq https://nsq.io/overview/quick_start.html 3.golang client var produ ...
- Java虚拟机(一):JVM简介
JVM简介 Java虚拟机(JVM)是由Java虚拟机规范定义的,其上运行的是字节码指令集.这种字节码指令集包含一个字节的操作码(opcode),零至多个操作数(oprand),虚拟机规范明确定义了每 ...
- B+树 -- Java实现
一.B+树定义 B+树定义:关键字个数比孩子结点个数小1的树. 除此之外B+树还有以下的要求: B+树包含2种类型的结点:内部结点(也称索引结点)和叶子结点.根结点本身即可以是内部结点,也可以是叶子结 ...
- JAVA 图像操作辅助类
package util; import java.awt.Component; import java.awt.Image; import java.awt.MediaTracker; import ...
- spark报错处理
Spark报错处理 1.问题:org.apache.spark.SparkException: Exception thrown in awaitResult 分析:出现这个情况的原因是spark启动 ...
- python while嵌套循环
while循环1.输出打印以#组成的长方形,自己定义长和宽.# -*-encoding:utf-8-*-'''This is script for start docker containor!Aut ...