hdu 5068 线段树加+dp
这题说的是 有n 层每层 有两个门 每个门 可以到达上一层的两个门,然后求从a 层到达b 层的方案总数, 不能后退, 在同一层中不能从第一个门到达另一层
我们只要我们可以对于每个 区间内 有dp[o][2][2] , 表示 在这个区间中 从区间起始到达区间末尾 的两个门分别设 a1,a2, b1,b2, dp[o][0][0],和dp[o][0][1],表示从从a1到b1 和 a2 到 b1 的方案总数 然后同理dp[o][1][0]dp[o][1][1],
得到转移 通过线段树去优化他 得到转移 一旦ij 两地相通那么显然 i这个点 的 在前面这个区间的a1 a2 相应的乘上 后面 这个区间在 j 这个位置开始的方案总数, 得到他们在总区间结束时的在 b1上有多少个方案从前面区间的 a1 和a2 过来,通过这样得到整个区间的值
for(int i=; i<; ++i)
for(int j=; j<; ++j)
if(star[mid][i][j]){
value[o].M[][]=(value[o].M[][] + value[o*].M[i][] * value[o*+].M[][j] % mod )%mod;
value[o].M[][]=(value[o].M[][] + value[o*].M[i][] * value[o*+].M[][j]%mod )%mod;
value[o].M[][]=(value[o].M[][] + value[o*].M[i][] * value[o*+].M[][j]%mod )%mod;
value[o].M[][]=(value[o].M[][] + value[o*].M[i][] * value[o*+].M[][j]%mod )%mod;
}
#include <iostream>
#include <cstdio>
#include <string.h>
using namespace std;
typedef __int64 ll;
const int maxn = ;
const ll mod = ;
int loc,x,y;
struct Matx{
ll M[][];
}P;
bool star[maxn+][][];
void maintain(int mid ,Matx &A,Matx B){
Matx ans;
memset(ans.M,,sizeof(ans.M));
for(int i=; i<; ++i)
for(int j=; j<; ++j)
if(star[mid][i][j]){
ans.M[][]=(ans.M[][] + A.M[i][] * B.M[][j] )%mod;
ans.M[][]=(ans.M[][] + A.M[i][] * B.M[][j] )%mod;
ans.M[][]=(ans.M[][] + A.M[i][] * B.M[][j] )%mod;
ans.M[][]=(ans.M[][] + A.M[i][] * B.M[][j] )%mod;
}
for(int i=; i<; ++i)
for(int j=; j<; ++j)
A.M[i][j]=ans.M[i][j];
}
struct Itree{
Matx value[maxn*]; void tain(int o,int mid){
memset(value[o].M,,sizeof(value[o].M));
for(int i=; i<; ++i)
for(int j=; j<; ++j)
if(star[mid][i][j]){
value[o].M[][]=(value[o].M[][] + value[o*].M[i][] * value[o*+].M[][j] % mod )%mod;
value[o].M[][]=(value[o].M[][] + value[o*].M[i][] * value[o*+].M[][j]%mod )%mod;
value[o].M[][]=(value[o].M[][] + value[o*].M[i][] * value[o*+].M[][j]%mod )%mod;
value[o].M[][]=(value[o].M[][] + value[o*].M[i][] * value[o*+].M[][j]%mod )%mod;
}
}
void build(int o, int L, int R){
if(L==R){
value[o].M[][]=;
value[o].M[][]=;
value[o].M[][]=;
value[o].M[][]=;
for(int i=; i<; ++i)
for(int j=; j<; ++j)
star[L][i][j]=true;
return ;
}
int mid= (L+R)/;
build( o* , L , mid );
build( o*+ , mid+ , R );
tain(o,mid);
} void update(int o, int L, int R){
if(L==R){
star[L][x][y]=star[L][x][y]==false;
return ;
}
int mid=(L+R)/;
if(loc<=mid) update(o*,L,mid);
else update(o*+,mid+,R);
tain(o, mid);
}
void query(int o, int L, int R){
if( (L>=x&&R<=y) ){
if(loc==){
P=value[o];loc=;
}else{
maintain(L-,P,value[o]);
}
return ;
}
int mid = (L+R)/;
if(x<=mid)
query(o*,L,mid);
if(y>mid)
query(o*+,mid+,R);
}
}T;
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)==){
T.build(,,n);
for(int i=; i<m; ++i){
loc=;
int op;
scanf("%d",&op);
if(op==) {
scanf("%d%d",&x,&y);
T.query(,,n);
ll ans=;
for(int i=; i<; ++i)
for(int j=; j<; ++j)
ans=(ans+ P.M[i][j])%mod;
printf("%I64d\n",ans);
}else{
scanf("%d%d%d",&loc,&x,&y);
x--; y--;
T.update(,,n);
}
}
}
return ;
}
hdu 5068 线段树加+dp的更多相关文章
- hdu 5068 线段树维护矩阵乘积
http://acm.hdu.edu.cn/showproblem.php?pid=5068 题意给的略不清晰 m个询问:从i层去j层的方法数(求连段乘积)或者修改从x层y门和x+1层z门的状态反转( ...
- hdu 5068(线段树+矩阵乘法)
矩阵乘法来进行所有路径的运算, 线段树来查询修改. 关键还是矩阵乘法的结合律. Harry And Math Teacher Time Limit: 5000/3000 MS (Java/Others ...
- hdu 4533 线段树(问题转化+)
威威猫系列故事——晒被子 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Tot ...
- hdu 1542 线段树扫描(面积)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- hdu 1166 线段树(sum+单点修改)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- Codeforces 834D The Bakery 【线段树优化DP】*
Codeforces 834D The Bakery LINK 题目大意是给你一个长度为n的序列分成k段,每一段的贡献是这一段中不同的数的个数,求最大贡献 是第一次做线段树维护DP值的题 感觉还可以, ...
- 【题解】P4247 [清华集训]序列操作(线段树修改DP)
[题解]P4247 [清华集训]序列操作(线段树修改DP) 一道神仙数据结构(DP)题. 题目大意 给定你一个序列,会区间加和区间变相反数,要你支持查询一段区间内任意选择\(c\)个数乘起来的和.对1 ...
- 【POJ 2750】 Potted Flower(线段树套dp)
[POJ 2750] Potted Flower(线段树套dp) Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4566 ...
- 洛谷$P2605\ [ZJOI2010]$基站选址 线段树优化$dp$
正解:线段树优化$dp$ 解题报告: 传送门$QwQ$ 难受阿,,,本来想做考试题的,我还造了个精妙无比的题面,然后今天讲$dp$的时候被讲到了$kk$ 先考虑暴力$dp$?就设$f_{i,j}$表示 ...
随机推荐
- Facebook广告目标摘要
Facebook Ads look slightly different depending on the results you want. This guide includes recommen ...
- 使用JS播放声音——SoundManager 2
<!DOCTYPE html> <html> <head> <meta charset=utf-8 /> <title>SoundDemo& ...
- Go基础---->go的基础学习(三)
这里面我们简单的介绍go中面向对象编程的知识. Go的面向对象编程 一.为类型添加方法 package main import "fmt" type Integer int // ...
- salt-stack更换主机名
author:headsen chen date: 2018-09-30 11:22:40 1,建立master端和client端的正常连接 #master yum -y install epel ...
- linux查看日志文件内容命令tail、cat、tac、head、echo、vi
linux查看日志文件内容命令tail.cat.tac.head.echo tail -f test.log你会看到屏幕不断有内容被打印出来. 这时候中断第一个进程Ctrl-C, ---------- ...
- 使用 Capistrano 进行自动化部署
最近在折腾这个,弄了好多次都不成功,看了官方文档和很多博客,都没有说清楚,因此,我觉得有必要把它记录下来,以帮助更多像我这样被弄得烦躁的人. 首先是安装,其实 Ubuntu 上面安装 Capistra ...
- ASM学习记录
代理: 代理模式: 静态代理: 动态代理:是指在运行期动态的为指定的类生成其代理类.(需要相关的运行时编译技术) Javassist:Javassist是一个运行时编译库,他能动态的生成或修改类的字节 ...
- collectionView itemW宽度计算不对
([[UIScreen mainScreen] bounds].size.width - 28) / 4.00 没加括号 collectioView不能正常撑开 用flowLayout 不要用 代理方 ...
- php引用(&)详解及注意事项——引用返回function &a();&a()
http://www.cnblogs.com/xiaochaohuashengmi/archive/2011/09/10/2173092.html 函数的引用返回 先看代码 <?php func ...
- Python开发【模块】:Concurrent
concurrent 模块 回顾: 对于python来说,作为解释型语言,Python的解释器必须做到既安全又高效.我们都知道多线程编程会遇到的问题,解释器要留意的是避免在不同的线程操作内部共享的数据 ...