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}$表示 ...
随机推荐
- laravel 使用 vue (gulp)
1)首先要安装 gulp 看这里 http://www.cnblogs.com/tujia/p/6397779.html 2)编辑js 默认 laravel 里有一个 /resources/asset ...
- OnGlobalLayoutListener用法
1.implements ViewTreeObserver.OnGlobalLayoutListener{} 2.mContentView.getViewTreeObserver().addOnGlo ...
- ARM漏洞
Google安全团队Project Zero公布了多个高危漏洞,称这些漏洞几乎影响到了市面上所有的微处理器,AMD.ARM还是英特尔的处理器都难以幸免,围绕这些处理器打造的操作系统和硬件设备也会受到影 ...
- 怎样使用es6 export,import不会报错
如果浏览器支持es6的话,需要加上type="module" <script type="module"> import Store from &q ...
- Spring 工作流程简单介绍
Spring Web MVC 处理Http请求的大致过程: 一旦Http请求到来,DispatcherSevlet将负责将请求分发. DispatcherServlet可以认为是Spring提供的前端 ...
- poj_1390 动态规划
题目大意 将一些连续的序列根据颜色分为N段,每段有颜色 为 Ci, 长度为 Li.每次点击其中的一段 i ,则可以将该段i消除,该段相邻的两段自动连接到一起,如果连接到一起的两段之前的颜色相同,则更新 ...
- 【Mysql】大数据处理优化方法
1.应尽量避免在 where 子句中使用 != 或 <> 操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 orde ...
- OneThink友情链接插件使用!
OneThink友情链接插件使用: 直接安装插件就好,查看数据库会有:onethink_links 这个表: 写 links 标签,调用友情链接: <?php namespace Common\ ...
- Web安全开发建议
版权声明:原创作品,如需转载,请与作者联系.否则将追究法律责任. Web安全问题,很多时候会被人所忽略,安全漏洞造成了很多不必要的维护和开发任务,产生的问题有时候更是致命的. 实际上,只要我们养成一些 ...
- mysql 内连接原理