P3120 【USACO15FEB】牛跳房子(金)Cow Hopscotch (Gold)

就像人类喜欢跳格子游戏一样,FJ的奶牛们发明了一种新的跳格子游戏。虽然这种接近一吨的笨拙的动物玩跳格子游戏几乎总是不愉快地结束,但是这并没有阻止奶牛们在每天下午参加跳格子游戏

游戏在一个R×C的网格上进行,每个格子有一个取值在1-k之间的整数标号,奶牛开始在左上角的格子,目的是通过若干次跳跃后到达右下角的格子,当且仅当格子A和格子B满足如下条件时能从格子A跳到格子B:

1.B格子在A格子的严格右方(B的列号严格大于A的列号)

2.B格子在A格子的严格下方(B的行号严格大于A的行号)

3.B格子的标号和A格子的标号不同

请你帮助奶牛计算出从左上角的格子到右下角的格子一共有多少种不同的方案

r,c<750,k<n*m

算法1:dp+离散化+树状数组

思路:

1.先将每种颜色所在的列统计起来,然后离散化

for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
int color=a[j][i];
if(!col[color].size()){
col[color].push_back(0);
bit[color].push_back(0);
}
if(col[color].back()!=i){
col[color].push_back(i);
}
}
}
for(int i=1;i<=ccnt;i++){
int siz=col[i].size();
while(siz--){
bit[i].push_back(0);
}
if(col[i].size()){
bit[i].push_back(0);
}
}
for(int i=0;i<=m;i++){
tc.push_back(i);
tot.push_back(0);
}
tot.push_back(0);

2.然后进行dp,用树状数组维护每种颜色每列的和

update(tot,getidx(tc,1),1);
update(bit[a[1][1]],getidx(col[a[1][1]],1),1);
for(int i=2;i<=n;i++){
for(int j=m;j>=1;j--){
int color=a[i][j];
f[i][j]=query(tot,getidx(tc,j-1))-query(bit[color],getidx(col[color],j-1));//ºÏ²¢×ÓÎÊÌâ
if(f[i][j]<0){
f[i][j]+=MOD;
}
update(bit[color],getidx(col[color],j),f[i][j]);
update(tot,getidx(tc,j),f[i][j]);
}
}

映射

inline int lowbit(int x){ return x&-x; }
inline int getidx(vector<int> clm,int idx){//Ó³Éä
int L=0,R=clm.size()-1,M,ret;
while(L<=R){
M=(L+R)/2;
if(clm[M]<=idx){
ret=M;
L=M+1;
}else{
R=M-1;
}
}
return ret+1;
}
inline void update(vector<int> &sum,int idx,int add){
int siz=sum.size();
while(idx<siz){
sum[idx]=(sum[idx]+add)%MOD;
idx+=lowbit(idx);
}
}
inline int query(vector<int> &sum,int idx){
int ret=0;
while(idx){
ret=(ret+sum[idx])%MOD;
idx-=lowbit(idx);
}
return ret;
}

算法2:cdq优化,可以少一个log

#include<cstdio>
using namespace std;
const int MAXN=755,MAXC=562505,MOD=1e9+7;
int n,m,k,a[MAXN][MAXN];
int t[MAXC]/*×îºó³öÏÖµÄʱ¼ä£¬ÒÔÃâÖØ¸´ÇåÁãÀË·Ñʱ¼ä*/,timeclock;
long long f[MAXN][MAXN],s[MAXC];
void work(int l,int r){
if(l>=r){
return;
}
int mid=(l+r)/2,sum=0;
work(l,mid);
timeclock++;
for(int j=1;j<=m;j++){//°´ÁÐÑ­»·
for(int i=r;i>=mid+1;i--){//ÏȽáËãÓÒÇø¼ä
int color=a[i][j];
if(t[color]!=timeclock){
t[color]=timeclock;
s[color]=0;
}
f[i][j]=(f[i][j]+sum-s[color]+MOD)%MOD;
}
for(int i=mid;i>=l;i--){
int color=a[i][j];
if(t[color]!=timeclock){
t[color]=timeclock;
s[color]=0;
}
s[color]=(s[color]+f[i][j])%MOD;
sum=(sum+f[i][j])%MOD;
}
}
work(mid+1,r);
}
int main(){
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&a[i][j]);
}
}
f[1][1]=1;
work(1,n);
printf("%d",f[n][m]);
return 0;
}

洛谷 P3120 [USACO15FEB]牛跳房子(金)Cow Hopscotch (Gold)的更多相关文章

  1. 洛谷P3120 [USACO15FEB]牛跳房子(动态开节点线段树)

    题意 题目链接 Sol \(f[i][j]\)表示前\(i\)行\(j\)列的贡献,转移的时候枚举从哪里转移而来,复杂度\(O(n^4)\) 然后考虑每一行的贡献,动态开节点线段树维护一下每种颜色的答 ...

  2. 洛谷P3120 [USACO15FEB]Cow Hopscotch

    题目描述 Just like humans enjoy playing the game of Hopscotch, Farmer John&apos;s cows have invented ...

  3. 洛谷P3080 [USACO13MAR]牛跑The Cow Run

    P3080 [USACO13MAR]牛跑The Cow Run 题目描述 Farmer John has forgotten to repair a hole in the fence on his ...

  4. 洛谷——P2853 [USACO06DEC]牛的野餐Cow Picnic

    P2853 [USACO06DEC]牛的野餐Cow Picnic 题目描述 The cows are having a picnic! Each of Farmer John's K (1 ≤ K ≤ ...

  5. 洛谷 P2853 [USACO06DEC]牛的野餐Cow Picnic

    P2853 [USACO06DEC]牛的野餐Cow Picnic 题目描述 The cows are having a picnic! Each of Farmer John's K (1 ≤ K ≤ ...

  6. Luogu P3120 [USACO15FEB]牛跳房子(金)Cow Hopscotch (Gold)

    题目传送门 这是一道典型的记忆化搜索题. f[x][y]表示以x,y为右下角的方案数. code: #include <cstdio> #define mod 1000000007 usi ...

  7. 洛谷P2853 [USACO06DEC]牛的野餐Cow Picnic

    题目描述 The cows are having a picnic! Each of Farmer John's K (1 ≤ K ≤ 100) cows is grazing in one of N ...

  8. 洛谷 3029 [USACO11NOV]牛的阵容Cow Lineup

    https://www.luogu.org/problem/show?pid=3029 题目描述 Farmer John has hired a professional photographer t ...

  9. 洛谷 P2966 [USACO09DEC]牛收费路径Cow Toll Paths

    题目描述 Like everyone else, FJ is always thinking up ways to increase his revenue. To this end, he has ...

随机推荐

  1. DXP 快捷键

    EC 复制 EY array paste TU: update

  2. 剑指offer——27二叉树的镜像

    题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ ...

  3. [转]从客户端中检测到有潜在危险的 Request.Form 值。

    参考资料: ASP.NET 4.0中使用FreeTextBox和FCKeditor遇到安全问题警告的解决办法关于问题出现的原因说的很清楚 引言 本人在.NET 4.0+VS2010环境下调试一个ASP ...

  4. CHI统计方法度量特征词和类别之间的相关度

    其中, A:包含特征词w且属于类别c的文档频数 B:包含特征词w但不属于类别c的文档频数 C:属于类别c但不包含特征词w的文档频数 D:既不属于c也不包含特征词w的文档频数 N:文档总数 CHI统计方 ...

  5. PHP算法之Z 字形变换

    将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L C I RE T ...

  6. RocketMQ源码分析之RocketMQ事务消息实现原下篇(事务提交或回滚)

    摘要: 事务消息提交或回滚的实现原理就是根据commitlogOffset找到消息,如果是提交动作,就恢复原消息的主题与队列,再次存入commitlog文件进而转到消息消费队列,供消费者消费,然后将原 ...

  7. thinkphp 默认值输出

    我们可以给变量输出提供默认值,例如: 大理石平台厂家 {$user.nickname|default="这家伙很懒,什么也没留下"} 对系统变量依然可以支持默认值输出,例如: {$ ...

  8. csps模拟93序列,二叉搜索树,走路题解

    题面: 模拟93考得并不理想,二维偏序没看出来,然而看出来了也不会打 序列: 对a,b数列求前缀和,那么题意转化为了满足$suma[i]>=suma[j]$且$sumb[i]>=sumb[ ...

  9. 手机端判断安卓,iso,微信

    var uaContains = function (key) { return navigator.userAgent.toLowerCase().indexOf(key.toLowerCase() ...

  10. FastJson使用方法

    FastJson是阿里的一款开源框架,用来快速实现Java的序列化和反序列化. 官方地址:https://github.com/alibaba/fastjson 使用方法演示: 下载jar包,使用ID ...