3505. 【NOIP2013模拟11.4A组】积木(brick)

(File IO): input:brick.in output:brick.out
Time Limits: 1000 ms Memory Limits: 262144 KB

Description

小A正在搭积木。有N个位置可以让小A使用,初始高度都为0。小A每次搭积木的时候,都会选定一个拥有相同高度的区间[A..B],然后将位置[A+1..B-1]上的所有积木的高度加一。不幸的是,小A把积木搭好之后没多久,小A调皮的弟弟就将其中若干个位置上的积木弄倒了。小A想知道他原来的积木是如何摆放的,所以他求助于你,请你告诉他原来有多少种可能的摆法。

Input

第一行为一个正整数N,表示小A有N个位置。

第二行有N个由空格分隔的整数Hi,表示第i个位置的积木高度。-1表示这个位置上的积木已经被弄倒了。

Output

唯一的一行,输出包括可能的摆法mod 1,000,000,007的结果。

Sample Input

输入1:

3

-1 2 -1

输入2:

-1 -1 -1

输入3:

6

-1 -1 -1 2 -1 -1

Sample Output

输出1:

0

输出2:

2

输出3:

3

Data Constraint

对于50%的数据 1<=N<=1000 -1<=Hi<=1000

对于80%的数据 1<=N<=10000

对于100%的数据 1<=N<=20000 -1<=Hi<=10000

题解

这道题……

水法:Θ(n2) dp\Theta(n^2)\ dp
正解:Θ(nlog(109+7)) dp\Theta(nlog(10^9+7))\ dp

先来说说水法
每块积木高度,必定是前一块积木的高度+1/-1/0(不变)
那么方程就是f[i][j]=f[i−1][j−1]+f[i−1][j]+f[i−1][j+1]f[i][j]=f[i-1][j-1]+f[i-1][j]+f[i-1][j+1]
当然,直接这么打会MLE,因为N∗(N∗2+1)N*(N*2+1)早就爆了,那就开个滚动数组

如果评测机开了O2O2,这么做就行了
如果没开,会被卡常,就把数组改成long longlong\ long,然后每10次运算modmod一次

再来说说正解
由于每次只会变化1,所以最终在两个确定高度之间会形成一个阶梯状的图形
将其看成一个整体,统计一下方案数,乘起来就可以了

那么怎么算方案数呢?

题目可以转化为这幅图,a和b代表两个确定高度,求:
从a开始,每次可以向右上/右/右下走,不能越过紫线,求到b点的方案数

怎么做?排列组合啊
再转换一下

0/1/-1代表与前一列的高度差,只要所有加起来等于a、b点高度差即可
知道0/1/-1这三个任意一个的个数之后,另外两个也就知道了
所以枚举一下,用排列组合统计一下就可以了

代码

水解
time:853ms

#include<cstdio>
#include<cstring>
#define N 20001
#define M 1000000007long a[N];
long long f[2][2*N+1];int main()
{   long n,i,j,h,now;bool t;freopen("brick.in","r",stdin);freopen("brick.out","w",stdout);scanf("%ld",&n);a[0]=-1;for(i=1;i<=n;i++){scanf("%ld",&a[i]);}now=0;h=-1;for(i=1;i<=n;i++){if(i<=n/2+1)h++;else h--;memset(f[now],0,sizeof(f[now]));if(i==1){if(a[i]<=0)f[now][0]=1;else break;}else if(a[i]==-1){for(j=h;j>=0;j--)f[now][j]=(f[now^1][j+1]+f[now^1][j]+f[now^1][j-1])%M;}else{f[now][a[i]]=(f[now^1][a[i]+1]+f[now^1][a[i]]+f[now^1][a[i]-1])%M;}now^=1;}printf("%ld\n",f[now^1][0]);return 0;
}

正解
time:8ms
code by:ypx大佬

#include <bits/stdc++.h>#define N 20005
#define MOD 1000000007typedef long long ll;int read()
{int x = 0, f = 1;char ch = getchar();while (ch < '0' || ch > '9') {if (ch == '-') f = -1; ch = getchar();}while (ch >= '0' && ch <= '9') {x = x * 10 + ch - '0'; ch = getchar();}return x * f;
}ll pow(int x,int y)
{ll res = 1;while (y){if (y & 1)res = (ll)res * x % MOD;x = (ll)x * x % MOD;y >>= 1;}return res;
}int jc[N + 5], ny[N + 5];void pre()
{jc[0] = 1;for (int i = 1; i <= N; i++){jc[i] = (ll)jc[i - 1] * i % MOD;}for (int i = 0; i <= N; i++){ny[i] = pow(jc[i], MOD - 2);}
}ll C(int n,int m)
{if (m > n)return 0;return ll(jc[n]) * ny[m] % MOD * ny[n - m] % MOD;
}int h[N + 5];
int f[N + 5];int main()
{freopen("brick.in","r",stdin);freopen("brick.out","w",stdout);int n = read();for (int i = 1; i <= n; i++)h[i] = read();if (h[1] > 0 || h[n] > 0){printf("0\n");return 0;}pre();h[1] = 0, h[n] = 0;f[1] = 1;for (int i = 2, j = 1; i <= n; i++)if (h[i] >= 0){int H = abs(h[i] - h[j]);for (int k = 0; k <= i - j - H; k++){int l = (i - j - k);if ((l + H) % 2 == 0)f[i] += ll((C(l,(l + H) >> 1) - C(l, (l + h[i] + h[j] + 2) >> 1) + MOD) % MOD) * C(i - j, k) % MOD, f[i] %= MOD;}f[i] = (ll(f[i]) * (f[j])) % MOD;j = i;}printf("%d\n",f[n]);
}

JZOJ 3505. 【NOIP2013模拟11.4A组】积木(brick)相关推荐

  1. JZOJ 3518. 【NOIP2013模拟11.6A组】进化序列(evolve)

    3518. [NOIP2013模拟11.6A组]进化序列(evolve) (File IO): input:evolve.in output:evolve.out Time Limits: 1000 ...

  2. jzoj. 3518. 【NOIP2013模拟11.6A组】进化序列(evolve)

    Description Abathur采集了一系列Primal Zerg 的基因样本,这些基因构成了一个完整的进化链.为了方便,我们用A0,A1-An-1 这n 个正整数描述它们. 一个基因Ax 可以 ...

  3. [jzoj 3518] 【NOIP2013模拟11.6A组】进化序列(evolve){二进制}

    题目 Description Abathur采集了一系列Primal Zerg 的基因样本,这些基因构成了一个完整的进化链.为了方便,我们用A0,A1-An-1 这n 个正整数描述它们. 一个基因Ax ...

  4. jzoj2702. 探险jzoj3917. 【NOIP2014模拟11.2A组】福慧双修

    Description 探险家小T好高兴!X国要举办一次溶洞探险比赛,获奖者将得到丰厚奖品哦!小T虽然对奖品不感兴趣,但是这个大振名声的机会当然不能错过! 比赛即将开始,工作人员说明了这次比赛的规则: ...

  5. JZOJ 5956. 【NOIP2018模拟11.7A组】easy LCA

    Description Input Output 输出一行一个整数,表示所求的所有连续子段的权值和. Sample Input 6 1 2 2 6 6 3 3 4 6 5 1 2 3 4 5 6 Sa ...

  6. JZOJ 5952. 【NOIP2018模拟11.5A组】凯旋而归

    Description Input 第一行一个整数 n,表示数的个数. 第二行n个整数,第i个整数为ai . Output n行一个整数表示答案,第i行表示序列第i个前缀的帅气值. Sample In ...

  7. JZOJ 3912. 【NOIP2014模拟11.2B组】超氧化钾

    Are you ready? 题目: 题意: 分析: 代码: 题目: 传送门 题意: 给定你xxx.yyy,求按照题目给出的z=xz=xz=x modmodmod 1+x1+x1+x modmodmo ...

  8. 3917 【NOIP2014模拟11.2A组】福慧双修 (Standard IO)题解

    目录 目录 原题 Description Input Output Sample Input Sample Output Data Constraint 题解 40分 100分 模型转换 做法 I I ...

  9. JZOJ-senior-5953. 【NOIP2018模拟11.5A组】生死之境

    Time Limits: 2000 ms Memory Limits: 524288 KB Detailed Limits Description 幽幽子正在练习符卡[反魂蝶八分咲] 冥界可以抽象成一 ...

  10. 【NOIP2014模拟11.2B组】超氧化钾

    非常sb的一道题~比赛切掉的我~ Description 作为一个化学小考只有77分的同学,小W感觉很有压力,所以他决定搞化学.今天他开始研究超氧化钾,这是一种很神奇的离子化合物,在高温下空间结构是立 ...

最新文章

  1. Java虚拟机中获得Runtime实例的方法是什么?
  2. C++ 接口 函数导出_Python玩转Excel:实现函数自动填充、数据排序
  3. 信息与计算机科学好学吗,计算机科学与技术好学吗?
  4. 数说真相|46公里内,Uber更划算
  5. 计算机网络访问控制列表,南昌大学计算机网络实验-访问控制列表ACL
  6. powerdesigner-建立数据库模型及全局脚本
  7. linux安装ld编译器,科学网—手动安装特定版本的gcc编译器 - 亓欣波的博文
  8. mysql check table_mysql check table
  9. php中的oop,在现有PHP中加入OOP
  10. MySQL复制应用中继日志解析
  11. python源码大全-python代码大全
  12. VSTO word操作
  13. adb无线连接Android手机
  14. 百度图像识别明星或动物
  15. 边缘和核心交换——应用层CS、P2P、混合模式
  16. 排球分组循环交叉编排_请问一下排球是怎么样编排的啊
  17. 如何快速搭建个人博客网站(详解)
  18. 影响企业未来的十大管理理念
  19. 转帖:谁动了它们的基因?
  20. 平面几何--角平分线长定理

热门文章

  1. win7休眠设置在哪里_win7怎么开启休眠模式
  2. IT项目管理之第5章 项目时间管理习题之选择题汇总
  3. 安全站点导航(感谢backlion整理)
  4. Powershell攻击指南1——PowerSploit
  5. 虚拟机安装CentOS6.5报错:Hardware Unsupported detected问题的解决
  6. 2021WSB-day2-4: Raffaele教授演示利用OpenCV和Python实现一个指纹识别系统 (含代码) part6
  7. html dom onblur,html DOM Event对象onblur事件
  8. Ch8 电路噪声学习笔记(一)baker 《CMOS Circuit Design, Layout, and Simulation》
  9. VMware Workstation虚拟机无法共享主机网络解决方法
  10. 空转工具推荐 | 10款空间转录组去卷积工具的综合比较