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 ...
随机推荐
- [Auto Testing] 工具准备:Selenium 与 ChromeDriver
<留存> Selenium http://selenium-release.storage.googleapis.com/index.html https://www.seleniumhq ...
- SVN常用操作介绍
SVN:全称subversion,开源代码版本控制系统,也就是常说的“版本控制工具”,实现代码.文档等的历史版本保存.共享和权限管理.常用于软件开发项目中,开发将最新的代码放到svn,其他同事可在这个 ...
- HTTP2.0探究
http1.1和http2.0在请求379张图片的对比演示(HTTP2.0性能惊人). HTTP2.0是HTTP协议自1999年HTTP1.1发布后的首个更新,主要基于SPDY(读speedy). ...
- ubuntu生成core转储文件
1.ulimit -c 判断是否开启转储 为0 则没有开启 2.ulimit -c unlimited 设置转储core大小没有限制 3.设置转储文件位置 echo "/var/core/% ...
- 各种”xxx“ native gem required installed build tools 报错
报错情况:(类似毛病 提示native gem require installed builld tools的解决方法是一样的)) 解决方法:http://rubyinstaller.org/down ...
- linux 系统清除日志 .sh
clear.sh #!/bin/sh cat /dev/null > /var/log/syslogcat /dev/null > /var/adm/sylogcat /dev/null ...
- gitHub-高仿58同城加载动画
导入方式: /build.gradle repositories { maven { url "https://jitpack.io" } } /app/build.gradle ...
- 关于class的签名Signature
举例1: public class Test05<A, B extends java.util.List<String>, C extends InputStream&Ser ...
- warning: already initialized constant FileUtils::VERSION
Ran into this, and the solution here works: https://stackoverflow.com/questions/51334732/rails-5-2-0 ...
- 笔记三:python乱码深度剖析一
一:学习内容 python编码转换 python乱码原因深入解析 二:python编码转换 1. Python内部字符串一般都是Unicode编码,代码中字符串的默认编码与代码文件本身的编码是一致的. ...