【BZOJ3939】[Usaco2015 Feb]Cow Hopscotch 动态规划+线段树
【BZOJ3939】[Usaco2015 Feb]Cow Hopscotch
Description
Just like humans enjoy playing the game of Hopscotch, Farmer John's cows have invented a variant of the game for themselves to play. Being played by clumsy animals weighing nearly a ton, Cow Hopscotch almost always ends in disaster, but this has surprisingly not deterred the cows from attempting to play nearly every afternoon.
The game is played on an R by C grid (2 <= R <= 750, 2 <= C <= 750), where each square is labeled with an integer in the range 1..K (1 <= K <= R*C). Cows start in the top-left square and move to the bottom-right square by a sequence of jumps, where a jump is valid if and only if
1) You are jumping to a square labeled with a different integer than your current square,
2) The square that you are jumping to is at least one row below the current square that you are on, and
3) The square that you are jumping to is at least one column to the right of the current square that you are on.
Please help the cows compute the number of different possible sequences of valid jumps that will take them from the top-left square to the bottom-right square.
Input
Output
Output the number of different ways one can jump from the top-left square to the bottom-right square, mod 1000000007.
Sample Input
1 1 1 1
1 3 2 1
1 2 4 1
1 1 1 1
Sample Output
题解:标号不同的方案数=总方案数 - 标号相同的方案数
总的方案数我们可以用前缀和轻松搞定,标号相同的方案数怎么搞?
(一开始想用树状数组,结果发现标号种类太多RE了)
所以我们只能采用动态开点线段树,对每种标号都开一棵线段树来维护前缀和就好了
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define mod 1000000007
using namespace std;
int n,m,K,tot;
int map[800][800],f[800][800],sum[800];
struct Seg
{
int ls,rs,cnt;
}s[6001000];
void updata(int l,int r,int &x,int y,int v)
{
if(!x) x=++tot;
if(l==r)
{
s[x].cnt=(s[x].cnt+v)%mod;
return ;
}
int mid=l+r>>1;
if(y<=mid) updata(l,mid,s[x].ls,y,v);
else updata(mid+1,r,s[x].rs,y,v);
s[x].cnt=(s[s[x].ls].cnt+s[s[x].rs].cnt)%mod;
}
int query(int l,int r,int x,int y)
{
if(!x) return 0;
if(r<=y) return s[x].cnt;
int mid=l+r>>1;
if(y<=mid) return query(l,mid,s[x].ls,y);
return (query(l,mid,s[x].ls,y)+query(mid+1,r,s[x].rs,y))%mod;
}
int main()
{
scanf("%d%d%d",&n,&m,&K);
tot=K;
int i,j,t;
for(i=1;i<=n;i++) for(j=1;j<=m;j++) scanf("%d",&map[i][j]);
f[1][1]=1;
for(i=1;i<m;i++) sum[i]=1;
updata(1,m,map[1][1],1,1);
for(i=2;i<n;i++)
{
for(j=2;j<m;j++) f[i][j]=(sum[j-1]-query(1,m,map[i][j],j-1)+mod)%mod;
t=0;
for(j=2;j<m;j++)
{
t=(t+f[i][j])%mod;
sum[j]=(sum[j]+t)%mod;
updata(1,m,map[i][j],j,f[i][j]);
}
}
printf("%d",(sum[m-1]-query(1,m,map[n][m],m-1)+mod)%mod);
return 0;
}
【BZOJ3939】[Usaco2015 Feb]Cow Hopscotch 动态规划+线段树的更多相关文章
- BZOJ3939 : [Usaco2015 Feb]Cow Hopscotch
设f[i][j]表示到(i,j)的方案数,则有 $f[i][j]=\sum f[x][y](x<i,y<j,a[x][y]!=a[i][j])=\sum f[x][y](x<i,y& ...
- 【bzoj3939】[Usaco2015 Feb]Cow Hopscotch 动态开点线段树优化dp
题目描述 Just like humans enjoy playing the game of Hopscotch, Farmer John's cows have invented a varian ...
- BZOJ 3939 [Usaco2015 Feb]Cow Hopscotch ——线段树 CDQ分治
显然dp[i][j]=ps[i-1][j-1]-sigma(dp[k<i][l<j],a[i][j]=a[k][l]) 考虑对于每一种颜色都开一颗区间线段树,但是空间不够. 所以我们可以动 ...
- BZOJ_1672_[Usaco2005 Dec]Cleaning Shifts 清理牛棚_动态规划+线段树
BZOJ_1672_[Usaco2005 Dec]Cleaning Shifts 清理牛棚_动态规划+线段树 题意: 约翰的奶牛们从小娇生惯养,她们无法容忍牛棚里的任何脏东西.约翰发现,如果要使这群 ...
- 2019牛客多校第一场 I Points Division(动态规划+线段树)
2019牛客多校第一场 I Points Division(动态规划+线段树) 传送门:https://ac.nowcoder.com/acm/contest/881/I 题意: 给你n个点,每个点有 ...
- Codeforces 834D The Bakery - 动态规划 - 线段树
Some time ago Slastyona the Sweetmaid decided to open her own bakery! She bought required ingredient ...
- Vijos 1404 遭遇战 - 动态规划 - 线段树 - 最短路 - 堆
背景 你知道吗,SQ Class的人都很喜欢打CS.(不知道CS是什么的人不用参加这次比赛). 描述 今天,他们在打一张叫DUSTII的地图,万恶的恐怖分子要炸掉藏在A区的SQC论坛服务器!我们SQC ...
- BZOJ4881 线段游戏(二分图+树状数组/动态规划+线段树)
相当于将线段划分成两个集合使集合内线段不相交,并且可以发现线段相交等价于逆序对.也即要将原序列划分成两个单增序列.由dilworth定理,如果存在长度>=3的单减子序列,无解,可以先判掉. 这个 ...
- 【BZOJ2090/2089】[Poi2010]Monotonicity 2 动态规划+线段树
[BZOJ2090/2089][Poi2010]Monotonicity Description 给出N个正整数a[1..N],再给出K个关系符号(>.<或=)s[1..k].选出一个长度 ...
随机推荐
- tab标签
<ul class="nav nav-tabs" role="tablist" role="tablist" id="myT ...
- jQuery 中的编程范式
浏览器前端编程的面貌自2005年以来已经发生了深刻的变化,这并不简单的意味着出现了大量功能丰富的基础库,使得我们可以更加方便的编写业务代码,更重要的是我们看待前端技术的观念发生了重大转变,明确意识到了 ...
- 【转】【Linux】linux awk命令详解
简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再 ...
- qt 编译的文件没有生效
/******************************************************************* * qt 编译的文件没有生效 * qt交叉编译时,生成的可执行 ...
- vlc player验证交换机igmp
使用vlc media player发送多播数据,验证交换机igmp的设置是否成功. 链接 http://peakdrive.com/?p=440 http://www.dasblinkenlicht ...
- C++异常抛出与捕获及处理
一.异常 迄今为止,我们处理程序中的错误一般都是用if语句测试某个表达式,然后处理错误的特定义代码. C++异常机制使用了三个新的关键字 (SEH(结构化异常处理)) try ──标识可能出现 ...
- OpenGL介绍
OpenGL是一个开放的三维图形软件包,它独立于窗口系统和操作系统,以它为基础开发的应用程序可以十分方便地在各种平台间移植:OpenGL可以与Visual C++紧密接口,便于实现机械手的有关计算和图 ...
- is_file,is_dir,file_exists
is_file()和file_exists()效率比较,结果当文件存在时,is_file函数比file_exists函数速度快14倍,当文件不存在时,两者速度相当.同理,当文件目录存在时,is_dir ...
- 《开源框架那些事儿22》:UI框架设计实战
UI是User Interface的缩写.通常被觉得是MVC中View的部分,作用是提供跟人机交互的可视化操作界面. MVC中Model提供内容给UI进行渲染,用户通过UI框架产生响应,一般而言会由控 ...
- shell脚本中特定符合变量的含义
shell脚本中特定符合变量的含义: $# 传递到脚本的参数个数 $* 以一个单字符串显示所有向脚本传递的参数.与位置变量不同,此选项参数可超过9个 $$ 脚本运行的当前进程PID号 ...