常州day1p3

给定一个 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=1001,NN=8000001;
const int mod=1000000007;
int n,m,a[N][N],k,root[NN],lch[NN],rch[NN],cnt=0;
int f[N][N],s[N][N],w[NN];
il int read(){
    re int hs=0;re char c=getchar();
    while(!isdigit(c)) c=getchar();
    while(isdigit(c)){
        hs=(hs<<3)+(hs<<1)+c-‘0‘;
        c=getchar();
    }
    return hs;
}
il void add(re int &i,re int l,re int r,re int p,re int v){
    if(i==0) i=(++cnt);
    w[i]=(w[i]+v)%mod;
    if(l==r) return;
    re int mid=(l+r)/2;
    if(p<=mid) add(lch[i],l,mid,p,v);
    else add(rch[i],mid+1,r,p,v);
}
il int sum(re int i,re int l,re int r,re int p,re int q){
    if(!i) return 0;
    if(l==p&&r==q) return w[i];
    re int mid=(l+r)/2;
    if(q<=mid) return sum(lch[i],l,mid,p,q);
    if(mid<p) return sum(rch[i],mid+1,r,p,q);
    return (sum(lch[i],l,mid,p,mid)+sum(rch[i],mid+1,r,mid+1,q))%mod;
}
int main(){
    freopen("hopscotch.in","r",stdin);
    freopen("hopscotch.out","w",stdout);
    n=read();m=read();k=read();
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++)
            a[i][j]=read();
    }
    f[1][1]=1;add(root[a[1][1]],1,m,1,f[1][1]);
    for(int i=1;i<=m;i++) s[1][i]=1;
    for(int i=1;i<=n;i++) s[i][1]=1;
    for(int i=2;i<=n;i++){
        for(int j=2;j<=m;j++){
            f[i][j]=(s[i-1][j-1]-sum(root[a[i][j]],1,m,1,j-1)+mod)%mod;
            s[i][j]=(((s[i-1][j]+s[i][j-1])%mod+f[i][j])%mod-s[i-1][j-1]+mod)%mod;
            add(root[a[i-1][j]],1,m,j,f[i-1][j]);
        }
    }
    cout<<f[n][m]%mod;
    return 0;
}
时间: 2024-10-10 18:04:52

常州day1p3的相关文章

块池是属于单个命名空间的一组块。

块池( Block Pool)     块池是属于单个命名空间的一组块.     每一个datanode为所有的block pool存储块.     Datanode是一个物理概念,而block pool是一个重新将block划分的逻辑概念.     同一个datanode中可以存着属于多个block pool的多个块.     Block pool允许一个命名空间在不通知其他命名空间的情况下为一个新的block创建Block ID.     一个Namenode失效不会影响其下的datanod

常州培训 day6

第一题: 题目大意: 给出一个N*N的矩阵,矩阵元素均为0或1.定义矩阵权值为sum(F[i][j]*F[j][i]); 给出K个操作: 询问矩阵的权值mod 2. 将矩阵的某一行元素取反(0变成1,1变成0). 将矩阵的某一列元素取反. N<=1000,K<=10^5 解题过程: 一开始看到K的范围有点大,肯定不能模拟,想到前几天N皇后那题大神讲了可以用60位压成一个long long优化,于是就傻乎乎的把每一行每一列都60位压缩.然后各种麻烦的操作,写到最后发现写不下去了,顿时心情糟透了,

常州培训 day3 解题报告

第一题: 给出数轴正半轴上N个点的坐标和其权值,给出初始体力值M,人一开始在位置0,体力值会随着走过路程的增加而增加,走多少个单位的路消耗多少体力值.到每个点可以打掉,消耗的体力值就是其权值.求 最多能打掉多少点. N<=10000,其他<=10^18; 解题过程: 1.一开始就直接想到是贪心,首先人是不可能往左走的,否则不会最优.枚举最后停在哪个点,减去到这个点需要的体力,然后把这个点之前的所有点(包括这个店)的权值排个序,从小到大一个一个打,打到体力没有为止.复杂度分析:枚举N次,每次快拍

常州一中B.1

差不多有一个星期左右没有刷题啦>< 就随便抓了一套水了一遍 T1,T3,T4纯模拟,我就不吐槽啦 T2还有点意思,略带数学思想 这种题目以后不用慌呀,自己拿笔好好算算,总会找到规律的呀╮(╯▽╰)╭ 之后要开始刷题啦 暑假作业三天之内写完了= =好像有点快? 之后就是预习啦,五三刷起来~\(≧▽≦)/~ 当然还有oi呀..... 退役的最后一些日子里 常州一中B.1,布布扣,bubuko.com

常州紫竹云微信分销商城—裂变式渠道分销功能开发

[常州紫竹云]http://www.czweixin001.com表示微商线上渠道拓展异常困难,结合企业整合线下和开拓线上渠道的需求,常州紫竹云微信分销商城系统裂变式渠道分销可以快速获得最广泛的微分销网络,解决微商城客流量少.推广成本高的难题.来看看他们的微信分销系统是如何解决这些问题的? 一.快速裂变功能开发--朋友变渠道 常州紫竹云微信分销商城系统裂变式渠道分销,是基于互联网社交圈(微信.微博等)的二级分销商城.它是网络经济时代企业营销模式的一种创新.微分销伴随着微信营销的火热而兴起.在大数

常州Day4题解

1. 高精度 这题略水,字符串可过,还不加压位等,操作只有BitShift和add/sub,不过编程复杂度有些高.(输出都是二进制我能说些什么...) 2. N皇后问题 (警告! 不是平时你见到的N皇后问题...是一道Hash的模拟题,N皇后的位置都给你了,就是统计) 二级标题很详细了,搜索那些解N皇后问题的千万莫戳进来. 3. Sam数 一道比较有意思的题. 题意是,给定一个k,求所有k位数中所有相邻两位数差都小于等于2的数.输出$\mod{10^9+7}$ 说的不够明白.来个例子: $213

常州培训 day2 解题报告

第一题: 题目大意: 给出一个M面的骰子,投N次,求最大期望值. 最大期望值的定义: 比如M=2,N=2, 那么 2次可以是 1,1,最大值为1: 1,2最大值为2: 2,1最大值为2: 2,2 最大值为2: 最大期望值就是  (1+2+2+2)/4=1.75 也就是把所有情况的最大值加起来,除以方案数.M,N<=5000 解题过程:1.这题只能说自己数学水平不够,只能找找规律骗点分,竟然混了个40分.小的数据直接模拟,拿40分. 2.正解: 考虑最大值为1的情况,sum=1*(1^N-0^N)

常州培训 day5 解题报告

第一题:(贪心) 题目大意:给出N*M的矩形,要用正方形将它铺满(正方形之间不能重叠),相邻的正方形颜色不能相同,颜色用ABCD表示.要求从上到下从左到右字典序最小. N,M<=100 解题过程: 1.首先感觉是能放就尽可能使正方形边长大,但是很明显有反例(见图A) 2.然后想到从上到下从左到右,依次检查,如果还没被铺上,那么就先铺上1*1的X,然后检查它右边能填什么,如果他右边能填的比它大(Y),那么就把1*1的改成尽可能大,如果他右边的比它小,那么它只要放1*1的X,然后右边放尽可能大的Y.

常州一律师在法院门前遭刀砍 行凶者疑早有预谋

常州一律师在法院门前遭刀砍 行凶者疑早有预谋在江苏常州武进区法院门口不远处,刚下班的常州律师王伟锋被一名戴头盔的男子持刀追砍,其右臂被连砍数刀,伤见骨头. 随后,行凶男子坐上在等候在一旁的另一男子驾驶的摩托车逃离现场. 此事发生在7月23日傍晚6点20分左右.受伤的常州律师王伟锋向澎湃新闻(www.thepaper.cn)提供了一段监控画面,再现了上述一幕. “在法院门口砍人,且当时正是下班高峰期.这个事件很恶劣.”江苏臻儒律师事务所王伟锋律师对澎湃新闻说,当天下午,他已向常州新城派出所报案,行