给定一个 n 行 m 列的方格,每个格子里有一个正整数 a,1 ≤ a ≤ k,k ≤ n∗m 假设你当前时刻站在 (i,j) 这个格子里,你想要移动到 (x,y),那必须满足以下三个条件 1:i < x 2:j < y 3:第 i 行第 j 列格子里的数不等于第 x 行第 y 列格子里的数 求从 (1,1) 移动到 (n,m) 的不同的方案数

对于 100% 的数据,n,m ≤ 750

容易想到f[i][j]=sigma(f[k][l]|a[k][l]!=a[i][j])

我们可以容易的统计和颜色无关的情况然后去掉颜色相同的就可以了。

于是我们对每一种颜色建立一颗权值线段树

动态开点

时间复杂度O(n^2logn)

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<queue>
#include<set>
#include<map>
#include<vector>
#define re register
#define il inline
using namespace std;
const int N=,NN=;
const int mod=;
int n,m,a[N][N],k,root[NN],lch[NN],rch[NN],cnt=;
int f[N][N],s[N][N],w[NN];
il int read(){
re int hs=;re char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)){
hs=(hs<<)+(hs<<)+c-'';
c=getchar();
}
return hs;
}
il void add(re int &i,re int l,re int r,re int p,re int v){
if(i==) i=(++cnt);
w[i]=(w[i]+v)%mod;
if(l==r) return;
re int mid=(l+r)/;
if(p<=mid) add(lch[i],l,mid,p,v);
else add(rch[i],mid+,r,p,v);
}
il int sum(re int i,re int l,re int r,re int p,re int q){
if(!i) return ;
if(l==p&&r==q) return w[i];
re int mid=(l+r)/;
if(q<=mid) return sum(lch[i],l,mid,p,q);
if(mid<p) return sum(rch[i],mid+,r,p,q);
return (sum(lch[i],l,mid,p,mid)+sum(rch[i],mid+,r,mid+,q))%mod;
}
int main(){
freopen("hopscotch.in","r",stdin);
freopen("hopscotch.out","w",stdout);
n=read();m=read();k=read();
for(int i=;i<=n;i++){
for(int j=;j<=m;j++)
a[i][j]=read();
}
f[][]=;add(root[a[][]],,m,,f[][]);
for(int i=;i<=m;i++) s[][i]=;
for(int i=;i<=n;i++) s[i][]=;
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
f[i][j]=(s[i-][j-]-sum(root[a[i][j]],,m,,j-)+mod)%mod;
s[i][j]=(((s[i-][j]+s[i][j-])%mod+f[i][j])%mod-s[i-][j-]+mod)%mod;
add(root[a[i-][j]],,m,j,f[i-][j]);
}
}
cout<<f[n][m]%mod;
return ;
}

常州day1p3的更多相关文章

  1. [日常训练]常州集训day8

    T1 Description 给定一个长度为$n$的正整数序列$a$.可以将序列分成若干段,定义第$i$段的权值$x_i$为这一段中所有数的最大值,特殊地,$x_0=0$.求$\sum_{i=1}^{ ...

  2. [日常训练]常州集训day7

    T1 Description 给定一个序列,初始为空.依次将$1-n$插入序列,其中$i$插到当前第$a_i$个数的右边($a_i=0$表示插到序列最左边).求最终序列. Input 第一行一个整数$ ...

  3. [日常训练]常州集训day5

    T1 Description 小$W$和小$M$一起玩拼图游戏啦~ 小$M$给小$M$一张$N$个点的图,有$M$条可选无向边,每条边有一个甜蜜值,小$W$要选$K$条边,使得任意两点间最多有一条路径 ...

  4. [日常训练]常州集训day3

    T1 Description 有$K$个石子,石子只能放在$N$条水平线与$M$条竖直线构成的网格的交点上. 求用$K$个石子最多能找到多少四边平行于坐标轴的长方形,它的四个角上都恰好放着一枚石子. ...

  5. [日常训练]常州集训day2

    T1 Description 给定$N$个点,问这$N$个点能构成的三角形个数. Input 第一行一个整数$N$,代表点数. 接下来$N$行,每行两个非负整数$X,Y$,表示一个点的坐标. Outp ...

  6. 常州Day4题解

    1. 高精度 这题略水,字符串可过,还不加压位等,操作只有BitShift和add/sub,不过编程复杂度有些高.(输出都是二进制我能说些什么...) 2. N皇后问题 (警告! 不是平时你见到的N皇 ...

  7. 常州培训 day5 解题报告

    第一题:(贪心) 题目大意:给出N*M的矩形,要用正方形将它铺满(正方形之间不能重叠),相邻的正方形颜色不能相同,颜色用ABCD表示.要求从上到下从左到右字典序最小. N,M<=100 解题过程 ...

  8. 常州培训 day7 解题报告

    最后一天..有些感慨,这七天被虐的感动万分 第一题: 题目大意: 求出 n*i(i=1,2,3....n) mod p的逆元  n<p<=3000000 ,p是质数. 之前写过了,懒得再写 ...

  9. 常州培训 day6 解题报告

    第一题: 题目大意: 给出一个N*N的矩阵,矩阵元素均为0或1.定义矩阵权值为sum(F[i][j]*F[j][i]); 给出K个操作: 询问矩阵的权值mod 2. 将矩阵的某一行元素取反(0变成1, ...

随机推荐

  1. NPOI读取Excel到集合对象

    之前做过的项目中有个需要读取Excel文件内容的需求,因此使用NPOI实现,写下以下代码,这个只是一个代码段,还有很多地方需要优化,希望能对大家有所帮助 public static IList< ...

  2. python全栈开发- 前⽅⾼能-迭代器

    python_day_12 今日主要内容 1, 函数名的应用,第一类对象 函数名可以像变量一样进行使用 1.赋值 2.作为list元素 3.作为参数 4.作为返回值 2, 闭包 内部函数访问外部函数的 ...

  3. robotframework 脚本编写规范

    测试集.脚本 测试脚本的名字不要超过20个字符,文件类型应该为txt  名字必需易读且有意义(看名知意)  记住测试集的名字是自动根据文件.目录的名字创建的.后缀名会被截去,下划线会转换为空格,如果名 ...

  4. 从源码角度彻底理解ReentrantLock(重入锁)

    目录 1.前言 2.AbstractQueuedSynchronizer介绍 2.1 AQS是构建同步组件的基础 2.2 AQS的内部结构(ReentrantLock的语境下) 3 非公平模式加锁流程 ...

  5. String、StringBuffer、StringBuilder有什么区别

    区别 先说说String和StringBuffer/StringBuilder: String是标准的不可变类,是一个字符串常量池,并且声明的对象在方法中是唯一存在的. StringBuffer/St ...

  6. 十几行代码带你用Python批量实现txt转xls,方便快捷

    前天看到后台有一兄弟发消息说目前自己有很多txt 文件,领导要转成xls文件,问用python怎么实现,我在后台简单回复了下,其实完成这个需求方法有很多,因为具体的txt格式不清楚,当然如果是有明确分 ...

  7. 2017年度网络安全服务企业TOP50

    何谓“大安全”? 近几年来,网络安全和信息安全领域不时出现引发社会各界关注的事件. 2014年,政府采购计划对WIN8说“不”,同年,中央网络安全和信息化领导小组成立,将网络安全上升到了国家战略高度, ...

  8. 划分树---hdu4417---区间查找(不)大于h的个数

    http://acm.hdu.edu.cn/showproblem.php?pid=4417 Super Mario Time Limit: 2000/1000 MS (Java/Others)    ...

  9. VK Cup 2015 - Round 2 (unofficial online mirror, Div. 1 only) B. Work Group 树形dp

    题目链接: http://codeforces.com/problemset/problem/533/B B. Work Group time limit per test2 secondsmemor ...

  10. lintcode-107-单词切分

    107-单词切分 给出一个字符串s和一个词典,判断字符串s是否可以被空格切分成一个或多个出现在字典中的单词. 样例 给出 s = "lintcode" dict = [" ...