BZOJ 3939 [Usaco2015 Feb] Cow Hopscotch
来源:互联网 发布:制作头像的软件 编辑:程序博客网 时间:2024/06/04 17:54
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
HINT
Source
Gold
线段树+DP~
很容易给出DP方程:f[i][j]=sum{f[k][z]},其中k<i && z<j && a[i][j]!=a[k][z],但也很容易看出这个O(n^4)算法是T的。所以我们简化DP方法。
我们发现上面的方程实际上等价于f[i][j]=num[i-1][j-1]-cal(i-1,j-1),其中num[i][j]为右下角是(i,j)的前缀和,cal(i,j)为右下角是(i,j)的与f[i+1][j+1]同种颜色的点的个数,前缀和sum[i][j]很好求,所以主要就是求cal(i,j)。
我们用线段树维护这个值。以m为基准记录。把颜色直接作为线段树的标号,多出来的标号直接在k后面累加,这样,我们就可以很方便的单点修改。每次计算出同一个i的f[i][j]的值,然后把这些值加入到线段树中用于修改对应的颜色的数量,再更新前缀和即可。
注意最后求得f[n][m]是与n行和m列无关的,所以DP的时候不用考虑n行和m列~
mod的时候一定要多取模!减的时候一定要先加上一个mod!
#include<cstdio>#define modd 1000000007int n,m,a[751][751],c[6000001][2],num[751],val[6000001],cnt,f[751][751];int read(){int totnum=0;char ch=getchar();while(ch<'0' || ch>'9') ch=getchar();while(ch>='0' && ch<='9') {totnum=(totnum<<1)+(totnum<<3)+ch-'0';ch=getchar();}return totnum;}void add(int l,int r,int &x,int k,int v){if(!x) x=++cnt;if(l==r){val[x]=(val[x]+v)%modd;return;}int mid=l+r>>1;if(k<=mid) add(l,mid,c[x][0],k,v);else add(mid+1,r,c[x][1],k,v);val[x]=(val[c[x][0]]+val[c[x][1]])%modd;}int cal(int l,int r,int x,int y){if(!x) return 0;if(r<=y) return val[x];int mid=l+r>>1;if(y<=mid) return cal(l,mid,c[x][0],y);return (cal(l,mid,c[x][0],y)+cal(mid+1,r,c[x][1],y))%modd;}int main(){n=read();m=read();cnt=read();for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) a[i][j]=read();for(int i=1;i<n;i++) num[i]=1;f[1][1]=1;add(1,m,a[1][1],1,1);for(int i=2;i<n;i++){for(int j=2;j<m;j++) f[i][j]=(num[j-1]-cal(1,m,a[i][j],j-1)+modd)%modd;int x=0;for(int j=2;j<m;j++){x=(x+f[i][j])%modd;num[j]=(num[j]+x)%modd;add(1,m,a[i][j],j,f[i][j]);}}printf("%d\n",(num[m-1]-cal(1,m,a[n][m],m-1)+modd)%modd);return 0;}
- BZOJ 3939 [Usaco2015 Feb] Cow Hopscotch
- BZOJ 3939 [Usaco2015 Feb]Cow Hopscotch 线段树
- bzoj 3939: [Usaco2015 Feb]Cow Hopscotch (CDQ分治+DP)
- BZOJ3939 [Usaco2015 Feb]Cow Hopscotch
- BZOJ3939: [Usaco2015 Feb]Cow Hopscotch
- [BZOJ3939][Usaco2015 Feb]Cow Hopscotch(cdq分治)
- BZOJ 3943 [Usaco2015 Feb]SuperBull
- BZOJ 3940 [Usaco2015 Feb]Censoring
- BZOJ 3942 [Usaco2015 Feb] Censoring
- BZOJ 3940 [Usaco2015 Feb] Censoring
- bzoj 3943: [Usaco2015 Feb]SuperBull
- bzoj3939 【USACO 2015 FEB GOLD 】cow hopscotch
- BZOJ 3942 Usaco2015 Feb Censoring KMP算法
- BZOJ 3943 Usaco2015 Feb SuperBull Prim
- BZOJ 3940 Usaco2015 Feb Censoring AC自动机
- BZOJ 3943 Usaco2015 Feb SuperBull Prim
- bzoj 3942: [Usaco2015 Feb]Censoring (kmp)
- 【BZOJ 3942】 [Usaco2015 Feb]Censoring kmp
- 漫谈前端之路
- Busboy 上传文件到指定目录,并重命名,node.js
- 混淆
- node.js学习(十一、mysql存储实例)
- 程序员每天充电5分钟:shell脚本之使用别名
- BZOJ 3939 [Usaco2015 Feb] Cow Hopscotch
- 也谈谈Unity的transform使用
- Android基础——Fragment读书笔记
- SVN(一) window服务器搭建
- 割裂的前端工程师--- 2017年前端生态窥探
- Java Tomcat SSL 服务端/客户端双向认证のApache HttpClient(二)
- Python 机器学习基础(二)——Numpy
- 第十一章-文件和流——python基础教程(第二版)笔记
- 欢迎使用CSDN-markdown编辑器