洛谷 P3120 [USACO15FEB]牛跳房子(金)Cow Hopscotch (Gold)
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)的更多相关文章
- 洛谷P3120 [USACO15FEB]牛跳房子(动态开节点线段树)
题意 题目链接 Sol \(f[i][j]\)表示前\(i\)行\(j\)列的贡献,转移的时候枚举从哪里转移而来,复杂度\(O(n^4)\) 然后考虑每一行的贡献,动态开节点线段树维护一下每种颜色的答 ...
- 洛谷P3120 [USACO15FEB]Cow Hopscotch
题目描述 Just like humans enjoy playing the game of Hopscotch, Farmer John's cows have invented ...
- 洛谷P3080 [USACO13MAR]牛跑The Cow Run
P3080 [USACO13MAR]牛跑The Cow Run 题目描述 Farmer John has forgotten to repair a hole in the fence on his ...
- 洛谷——P2853 [USACO06DEC]牛的野餐Cow Picnic
P2853 [USACO06DEC]牛的野餐Cow Picnic 题目描述 The cows are having a picnic! Each of Farmer John's K (1 ≤ K ≤ ...
- 洛谷 P2853 [USACO06DEC]牛的野餐Cow Picnic
P2853 [USACO06DEC]牛的野餐Cow Picnic 题目描述 The cows are having a picnic! Each of Farmer John's K (1 ≤ K ≤ ...
- Luogu P3120 [USACO15FEB]牛跳房子(金)Cow Hopscotch (Gold)
题目传送门 这是一道典型的记忆化搜索题. f[x][y]表示以x,y为右下角的方案数. code: #include <cstdio> #define mod 1000000007 usi ...
- 洛谷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 ...
- 洛谷 3029 [USACO11NOV]牛的阵容Cow Lineup
https://www.luogu.org/problem/show?pid=3029 题目描述 Farmer John has hired a professional photographer t ...
- 洛谷 P2966 [USACO09DEC]牛收费路径Cow Toll Paths
题目描述 Like everyone else, FJ is always thinking up ways to increase his revenue. To this end, he has ...
随机推荐
- Codeforces 1176A Divide it!
题目链接:http://codeforces.com/problemset/problem/1176/A 思路:贪心,对第二个操作进行俩次等于将n变成n/3,第三个操作同理,我们将n不断除以2,再除以 ...
- 【POJ】2240 Arbitrage
题目链接:http://poj.org/problem?id=2240 题意:n种国家的货币,m个换算汇率.问你能不能赚钱. eg:1美元换0.5英镑,1英镑换10法郎,1法郎换0.21美元,这样1美 ...
- 使用kubeadm安装kubernetes 1.15
1.主机准备篇 使用vmware Workstation 10创建一台虚拟机,配置为2C/2G/50G,操作系统为CentOS Linux release 7.6.1810 (Core). IP地址为 ...
- MySQL数据库之DCL(数据控制语言)
1.MySQL之DCL设置root指定的ip访问 进入mysql:mysql -uroot -p或者mysql -uroot -h127.0.0.1 -p(host默认为127.0.0.1) mysq ...
- VGDB提示
由于之前地址的版本在未安装.Net 4.0的电脑上安装会出现插件使用装载失败的问题,已更新,新地址为:http://pan.baidu.com/s/1xdnuD,此版本需要.Net 2.0.
- linux 服务器安装php5.6
查看原有的php版本:php -v 如果已经装了低版本的php,为了避免冲突,查看: yum list installed | grep php 删除:自行百度吧.可能不能一次性全部删除,只能一个一个 ...
- sleep()与wait()的区别
①sleep()实现线程阻塞的方法,我们称之为“线程睡眠”,方式是超时等待,怎么理解?就是sleep()通过传入“睡眠时间”作为方法的参数,时间一到就从“睡眠”中“醒来”: ②wait()方法实现线程 ...
- pdfkit
官方文档 0.准备 需要引入两个包,首先要npm install pdfkit安装pdfkit包 const PDF = require('pdfkit'); const fs = require(' ...
- 新知道一个 端对端加密 Signal protocol
看 socketio Sponsors 列表中的小蓝鸟,发现网站中有使用 x-jquery-tmpl [翻译]WhatsApp 加密概述(技术白皮书) 知道一个叫 Signal 协议 的端对端加密 端 ...
- 计算几何——直线交点poj1269
求直线交点还是要推一个公式的.. 见博客https://blog.csdn.net/u013050857/article/details/40923789 还要学一下向量的定点比分法 另外poj精度好 ...