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. Git 学习(三)Git 创建版本库

    获取 Git 仓库 什么是 Git 仓库呢,仓库又名版本库,我们可以把他理解为一个文件夹.这个文件夹里的所有东西都需要被 Git 给管理起来,对立面每个文件的修改.编辑.删除都将被 Git 记录,以便 ...

  2. 解决:Map的area属性标签鼠标Hover可以给area加背景

    css的area标签是不支持hover的,只有a标签才支持.li标签在IE浏览器下才支持,所以采用jquery的mouseenter和mouseleave事件完成.首先讲jQuery对应的事件:1.m ...

  3. 2018今日头条湖北省赛【H】

    [题目链接]https://www.nowcoder.com/acm/contest/104/G 现场赛的H题,emmm...C++选手表示很伤心.高精度压四位板子WA四发. 题意很简单就是给你n个数 ...

  4. leetcode 题型 数据结构 解法 分类总结

    第2章 线性表 2.1 数组 2.1.1 Remove Duplicates from Sorted Array 2.1.2 Remove Duplicates from Sorted Array I ...

  5. 2018-12-25-C#-7.2-通过-in-和-readonly-struct-减少方法值复制提高性能

    title author date CreateTime categories C# 7.2 通过 in 和 readonly struct 减少方法值复制提高性能 lindexi 2018-12-2 ...

  6. OpenCV-Python Tutorials目录

    版本 3.4.6 1 Introduction to OpenCV OpenCV介绍Learn how to setup OpenCV-Python on your computer! 2 Gui F ...

  7. JS对象 返回/设置时间方法 get/setTime() 返回/设置时间,单位毫秒数 一小时为:60*60*1000

    返回/设置时间方法 get/setTime() 返回/设置时间,单位毫秒数,计算从 1970 年 1 月 1 日零时到日期对象所指的日期的毫秒数. 如果将目前日期对象的时间推迟1小时,代码如下: &l ...

  8. PHP算法之猜数字

    小A 和 小B 在玩猜数字.小B 每次从 1, 2, 3 中随机选择一个,小A 每次也从 1, 2, 3 中选择一个猜.他们一共进行三次这个游戏,请返回 小A 猜对了几次? 输入的guess数组为 小 ...

  9. sikuli+eclipse对于安卓app自动化测试的应用(第一次写博客,有些语言还不太专业,望海涵)

    Sikuli是什么? 下面是来自于官网的介绍:Sikuli is a visual technology to automate and test graphical user interfaces ...

  10. arc098D Xor Sum 2

    题意:给你一个数列,问有多少对(l,r)满足A[l]+A[l+1]+...+A[r]=A[l]^A[l+1]^...^A[r]? 标程: #include<bits/stdc++.h> u ...