【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.

就像人类喜欢跳格子游戏一样,FJ的奶牛们发明了一种新的跳格子游戏。虽然这种接近一吨的笨拙的动物玩跳格子游戏几乎总是不愉快地结束,但是这并没有阻止奶牛们在每天下午参加跳格子游戏 
游戏在一个R*C的网格上进行,每个格子有一个取值在1-k之间的整数标号,奶牛开始在左上角的格子,目的是通过若干次跳跃后到达右下角的格子,当且仅当格子A和格子B满足如下条件时能从格子A跳到格子B: 
1.B格子在A格子的严格右方(B的列号严格大于A的列号) 
2.B格子在A格子的严格下方(B的行号严格大于A的行号) 
3.B格子的标号和A格子的标号不同 
请你帮助奶牛计算出从左上角的格子到右下角的格子一共有多少种不同的方案

Input

The first line contains the integers R, C, and K. The next R lines will each contain C integers, each in the range 1..K.
第一行包含两个整数R C K 
接下来的R行,每行C个整数表示格子的标号

Output

Output the number of different ways one can jump from the top-left square to the bottom-right square, mod 1000000007.

一行,代表有多少种不同的方案,由于答案很大,请输出答案对1000000007取模的结果

Sample Input

4 4 4
1 1 1 1
1 3 2 1
1 2 4 1
1 1 1 1

Sample Output

5

题解:标号不同的方案数=总方案数 - 标号相同的方案数

总的方案数我们可以用前缀和轻松搞定,标号相同的方案数怎么搞?

(一开始想用树状数组,结果发现标号种类太多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 动态规划+线段树的更多相关文章

  1. 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& ...

  2. 【bzoj3939】[Usaco2015 Feb]Cow Hopscotch 动态开点线段树优化dp

    题目描述 Just like humans enjoy playing the game of Hopscotch, Farmer John's cows have invented a varian ...

  3. 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]) 考虑对于每一种颜色都开一颗区间线段树,但是空间不够. 所以我们可以动 ...

  4. BZOJ_1672_[Usaco2005 Dec]Cleaning Shifts 清理牛棚_动态规划+线段树

    BZOJ_1672_[Usaco2005 Dec]Cleaning Shifts 清理牛棚_动态规划+线段树 题意:  约翰的奶牛们从小娇生惯养,她们无法容忍牛棚里的任何脏东西.约翰发现,如果要使这群 ...

  5. 2019牛客多校第一场 I Points Division(动态规划+线段树)

    2019牛客多校第一场 I Points Division(动态规划+线段树) 传送门:https://ac.nowcoder.com/acm/contest/881/I 题意: 给你n个点,每个点有 ...

  6. Codeforces 834D The Bakery - 动态规划 - 线段树

    Some time ago Slastyona the Sweetmaid decided to open her own bakery! She bought required ingredient ...

  7. Vijos 1404 遭遇战 - 动态规划 - 线段树 - 最短路 - 堆

    背景 你知道吗,SQ Class的人都很喜欢打CS.(不知道CS是什么的人不用参加这次比赛). 描述 今天,他们在打一张叫DUSTII的地图,万恶的恐怖分子要炸掉藏在A区的SQC论坛服务器!我们SQC ...

  8. BZOJ4881 线段游戏(二分图+树状数组/动态规划+线段树)

    相当于将线段划分成两个集合使集合内线段不相交,并且可以发现线段相交等价于逆序对.也即要将原序列划分成两个单增序列.由dilworth定理,如果存在长度>=3的单减子序列,无解,可以先判掉. 这个 ...

  9. 【BZOJ2090/2089】[Poi2010]Monotonicity 2 动态规划+线段树

    [BZOJ2090/2089][Poi2010]Monotonicity Description 给出N个正整数a[1..N],再给出K个关系符号(>.<或=)s[1..k].选出一个长度 ...

随机推荐

  1. iOS开发小技巧--富文本字典集合中的Key都是OC中的常量字符串

  2. 公司名称后缀 Inc. Co.,Ltd.

    Inc. = Incorporated Co.,Ltd."连在一起为Company Limited,就是有限公司,或者有限责任公司.“Co”后面的“.”是英文中表示词语短缩省略的符号,而“C ...

  3. CSS控制显示图片的一部分

    使用情形:防止反复请求图片资源,我们经常采用一张图片多种效果或内容显示. 假设我有纸张竖直方向的一张图片,竖直y轴方向分别是字母:A,B,C.... 现在分别要显示A.B.C 等字母,我们的CSS可以 ...

  4. Spring中 classpath* 和 classpath 前缀的区别

    // org.springframework.core.io.support.ResourcePatternResolver /** * Pseudo URL prefix for all match ...

  5. 模式识别之线性判别---naive bayes朴素贝叶斯代码实现

    http://blog.csdn.net/xceman1997/article/details/7955349 http://www.cnblogs.com/yuyang-DataAnalysis/a ...

  6. MVC演化 (转至http://www.cnblogs.com/wubaiqing/archive/2011/10/26/2225438.html)

    MVC已经成为我们最常误用的模式,人们之所以常常误用MVC,很大程度上是因为混淆了不同的MVC变体. Classic MVC Classic MVC 大概上世纪七十年代,Xerox PARC的Tryg ...

  7. 一键部署MongoDB集群Windows版

    由于周末在家手头没有虚拟机,所以在windows下单机完毕部署要求,并编写bat执行脚本. 1.创建配置文件及相关文件夹 总的启动脚本例如以下(startmc.bat): rem m1 start m ...

  8. TF42064: The build number already exists for build definition error in TFS2010

    In TFS2008, deleting a build removes it from the database itself. If you delete a build called Build ...

  9. R语言中的标准输入,输出, 错误流

    在R中,stdin() 对应标准输入流 , stdout() 对应标准输出流,stderr() 对应标准错误流 1) 从标准输入流中读取数据 在R的交互式环境中, R >a <- read ...

  10. react新手入门(序)

    之前在软件园使用的是react,当时为了做个集光推送,自己去搭过react,这次项目中继续使用react,于是又重新操作了遍,恰巧公司买了本react的书籍,这本书写的非常好,看着并不觉得拗口,很容易 ...