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. 基于第三方开源库的OPC服务器开发指南(2)——LightOPC的编译及部署

    前文已经说过,OPC基于微软的DCOM技术,所以开发OPC服务器我们要做的事情就是开发一个基于DCOM的EXE文件.一个代理/存根文件,然后就是写一个OPC客户端测试一下我们的服务器了.对于第一项工作 ...

  2. arm-linux-copydump 的使用

    生成可以执行的 2 进制代码 [arm@localhost gcc]#arm­linux­copydump ­O binary hello hello.bin

  3. bzoj 3579: 破冰派对

    题意: 给你一个图,问你有多少个方案把他分成连个新的图.使得一个图是一个团,另外一个是独立集 一些闲话: 以前做过一次这个题..当时听说爆搜可以过,就无脑莽过去了.. 也没有思考为什么爆搜能过,或者有 ...

  4. 【leetcode题目整理】数组中找子集

    368. Largest Divisible Subset 题意:找到所有元素都不同的数组中满足以下规则的最大子集,规则为:子集中的任意两个元素a和b,满足a%b=0或者b%a=0. 解答:利用动态规 ...

  5. Algo: maxSubArray vs. maxProduct

    这两个问题类似,都可利用动态规划思想求解. 一.最大连续子序列和 https://leetcode.com/problems/maximum-subarray/description/ https:/ ...

  6. vue3环境搭建以及创建简单项目。

    1.环境准备,以下都是我的版本.自己在官网上面下载需要的版本. 尝试了Python3.7.3在创建vue3项目时出现问题. node.js10.16.0, python2.7.16, yarn1.16 ...

  7. Mobox企业网盘回收站文件清空与恢复的管控

    1. Mobox系统提供了 个人网盘的回收站 2. Mobox系统提供了 针对公司及部门文档柜的回收站 Mobox系统对个人网盘的回收站可以做这样的限制 1)  可以通过安装程序 ,不出现 回收站 2 ...

  8. mysql双主热备

    先搭建mysql主从模式,主从请参考mysql 主从笔记 然后在在配置文件里添加如下配置 1 log_slave_updates= #双主热备的关键参数.默认情况下从节点从主节点中同步过来的修改事件是 ...

  9. ~/.bashrc的常用alias设置,30 个方便的 Bash shell 别名

    centos6.5/centos7系统中,alias定义在/etc/bashrc,分别写在/etc/profile.d/*.sh中,可以在此目录添加my.sh,或者~/.bashrc,或者~/.bas ...

  10. python安装requests第三方模块

    2018-08-28 22:04:51 1 .下载到桌面后解压,放到python的目录下 ------------------------------------------------------- ...