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. QTP,自己主动化測试学习笔记,六月九号

    測试自己主动化实现的两个难点设计--功能分解 实现--对象的识别 測试自己主动化实现的两个难点-功能分解 清晰画出业务流程图 依据业务流程分解业务功能.能够被复用的功能也要被分解出来. 依照路径覆盖的 ...

  2. flask-Local源码流程解析

    flask中Local源码数据类型首先明确:源码中要构造的数据类型数是这样的: __storage__ = { 用线程或者协程的唯一标识为键: {stack:[ctx(session/request) ...

  3. 在MRC模式下使用SDWebImage

    在MRC模式下使用SDWebImage (1)在Target->Build Phases->Compile Sources中,给所有的SDWebImage添加-fobjc-arc (2)添 ...

  4. jquery.js和jquery.min.js的区别和springboot整合echarts.min.js

    1.区别:jquery官网提供2种jQuery的下载,一种是jquery.js另一种是jquery.min.js文件名不一定完全相同,但通常情况下:jquery.js是完整的未压缩的jQuery库,文 ...

  5. MySQL数据库之DQL(数据查询语言)

    1.MySQL之DQL查询AS CONCAT LIKE的使用 (1)select 列名1,列名2,...... from 表名 [where 条件] 查询所有字段用*,不带where条件的话,就会把表 ...

  6. Python中虚拟环境venv的基本用法

    环境windows 7 venv为python3中的默认库,无需安装. 创建新的venv方法, 在当前文件夹下执行cmd,输入如下代码 python -m venv bob bob为需要创建的文件夹名 ...

  7. W3C规范学习

    w3c:万维网联盟(World Wide Web Consortium,W3C),又称W3C理事会.W3C组织是对网络标准制定的一个非赢利组织,W3C是万维网联盟的缩写,像HTML.XHTML.CSS ...

  8. 「题解」:X国的军队

    问题 A: X国的军队 时间限制: 1 Sec  内存限制: 256 MB 题面 题面谢绝公开. 题解 简单贪心. 按照存活的士兵数量(即参加战斗的士兵数量减去阵亡的士兵数量)排序. 若存活士兵数量相 ...

  9. 2816: [ZJOI2012]网络

    传送们 把一个点拆成c个即可 浪费时间的水题... //Achen #include<algorithm> #include<iostream> #include<cst ...

  10. js 常见功能总会

    一.随着页面滚动,元素到达可视区域,显示特殊样式 <!DOCTYPE html> <html lang="en"> <head> <met ...