D. Increase Sequence
time limit per test

1 second

memory limit per test

256 megabytes

input

standard input

output

standard output

Peter has a sequence of integers a1, a2, ..., an. Peter wants all numbers in the sequence to equal h. He can perform the operation of "adding one on the segment [l, r]": add one to all elements of the sequence with indices from l to r (inclusive). At that, Peter never chooses any element as the beginning of the segment twice. Similarly, Peter never chooses any element as the end of the segment twice. In other words, for any two segments [l1, r1] and [l2, r2], where Peter added one, the following inequalities hold: l1 ≠ l2 and r1 ≠ r2.

How many distinct ways are there to make all numbers in the sequence equal h? Print this number of ways modulo 1000000007 (109 + 7). Two ways are considered distinct if one of them has a segment that isn't in the other way.

Input

The first line contains two integers n, h (1 ≤ n, h ≤ 2000). The next line contains n integers a1, a2, ..., an (0 ≤ ai ≤ 2000).

Output

Print a single integer — the answer to the problem modulo 1000000007 (109 + 7).

Sample test(s)
input
3 2
1 1 1
output
4
input
5 1
1 1 1 1 1
output
1
input
4 3
3 2 1 1
output
0

题意:给出一个序列,可以对其进行以下操作,取一段长度,从l到r,将其中的数全部加一。操作的次数不限,但对于两个操作,要求l1!=l2 && r1!=r2。求共有几种操作集合,使得整个序列的值最后都等于h。

思路:想了好久还是想不出来,最后看的题解。反着来做,先将所有a[i]=h-a[i]。当然,为了后面方便计算,我们将边界条件a[0]=0,a[n+1]=0。由于操作中的限制(l1!=l2 && r1!=r2),所以我们很容易得出有解的情况是当且仅当-1<=a[i]-a[i-1]<=1。我们用变量cnt记录当前有多少个左端点l没有和右端点r配对。下面分类讨论:

1,a[i]-a[i-1]==1,此时i点上必定有一个左端点,所以cnt++,i-1点上没有右端点,所以不对ans进行操作。

2,a[i]==a[i-1],此时有两种情况,要嘛i点没有左端点,i-1点没有右端点,要嘛i点有左端点,i-1点有右端点。此时,第一种情况是cnt=0,第二种情况时,cnt++,ans×=cnt,cnt--。所以两种情况都可以用ans×=(cnt+1)来表示。

3,a[i]-a[i-1]=-1,此时i点没有左端点,i-1点必定有右端点,此时ans×=cnt,cnt--;

细节:因为我们统计右端点的情况是统计前一个的,所以循环的时候必须做到n+1位。

下面是代码

/*
* Author: Joshua
* Created Time: 2014年09月19日 星期五 20时36分35秒
* File Name: d.cpp
*/
#include<cstdio>
#include<iostream>
using namespace std;
#define maxn 2002
typedef long long LL;
int a[maxn],b[maxn],n,h; void solve()
{
int x;
for (int i=1;i<=n;++i)
{
scanf("%d",&x);
a[i]=h-x;
}
a[0]=0;a[n+1]=0;
for (int i=1;i<=n+1;++i)
{
b[i]=a[i]-a[i-1];
if (b[i]>1 || b[i]<-1)
{
printf("0\n");
return;
}
}
LL ans=1;
int mod = int (1e9+7),cnt=0;
for (int i=1;i<=n+1;++i)
{
if (b[i]==1)
{
cnt++;
continue;
}
if (b[i]==0) ans*=(cnt+1);
else ans*=(cnt--);
ans %=mod;
}
cout<<ans<<endl;
} int main()
{
while (scanf("%d%d",&n,&h)>0)
solve();
return 0;
}

 改进:我们知道,当a[i]-a[i-1]==1的时候,cnt++,当a[i]-a[i-1]==-1的时候,cnt--,那么我们是不是就可以用a[i]来表示cnt呢,答案是可以。这样可以进一步降低时间复杂度,代码也更短,下面是改进后的代码。

/*
* Author: Joshua
* Created Time: 2014年09月19日 星期五 20时36分35秒
* File Name: d.cpp
*/
#include<cstdio>
#include<iostream>
using namespace std;
#define maxn 2002
typedef long long LL;
int a[maxn],b[maxn],n,h; void solve()
{
int x;
for (int i=1;i<=n;++i)
{
scanf("%d",&x);
a[i]=h-x;
}
a[0]=0;a[n+1]=0;
for (int i=1;i<=n+1;++i)
{
b[i]=a[i]-a[i-1];
if (b[i]>1 || b[i]<-1)
{
printf("0\n");
return;
}
}
LL ans=1;
int mod = int (1e9+7);
for (int i=1;i<=n+1;++i)
{
if (b[i]==1) continue;
if (b[i]==0) ans*=a[i]+1;
else ans*=a[i-1];
ans %=mod;
}
cout<<ans<<endl;
} int main()
{
while (scanf("%d%d",&n,&h)>0)
solve();
return 0;
}

  

codeforces 466d Increase Sequence的更多相关文章

  1. Codeforces 601B. Lipshitz Sequence(单调栈)

    Codeforces 601B. Lipshitz Sequence 题意:,q个询问,每次询问给出l,r,求a数组[l,r]中所有子区间的L值的和. 思路:首先要观察到,斜率最大值只会出现在相邻两点 ...

  2. 【codeforces 466D】Increase Sequence

    [题目链接]:http://codeforces.com/problemset/problem/466/D [题意] 给你n个数字; 让你选择若干个区间; 且这些区间[li,ri]; 左端点不能一样; ...

  3. Codeforces 626A Robot Sequence(模拟)

    A. Robot Sequence time limit per test:2 seconds memory limit per test:256 megabytes input:standard i ...

  4. Curious Array Codeforces - 407C(高阶差分(?)) || sequence

    https://codeforces.com/problemset/problem/407/C (自用,勿看) 手模一下找一找规律,可以发现,对于一个修改(l,r,k),相当于在[l,r]内各位分别加 ...

  5. codeforces 622A Infinite Sequence

    A. Infinite Sequence time limit per test 1 second memory limit per test 256 megabytes input standard ...

  6. Codeforces 626A Robot Sequence

    A. Robot Sequence time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

  7. CodeForces 623E Transforming Sequence 动态规划 倍增 多项式 FFT 组合数学

    原文链接http://www.cnblogs.com/zhouzhendong/p/8848990.html 题目传送门 - CodeForces 623E 题意 给定$n,k$. 让你构造序列$a( ...

  8. CodeForces 601B Lipshitz Sequence

    Lipshitz Sequence 题解: 可以通过观察得到,对于任意一个区间来说, 只有相邻的2个点的差值才会是区间的最大值. 具体观察方法,可以用数学分析, 我是通过画图得到的. 那么基于上面的观 ...

  9. CF思维联系–CodeForces -224C - Bracket Sequence

    ACM思维题训练集合 A bracket sequence is a string, containing only characters "(", ")", ...

随机推荐

  1. 【转载】CANoe 入门 Step by step系列(二)CAPL编程

    来源:http://www.cnblogs.com/dongdonghuihui/archive/2012/09/26/2704619.html CAPL就是Communication Applica ...

  2. 【.net 深呼吸】自己动手来写应用程序设置类

    在开始装逼之前,老周先说明一件事.有人说老周写的东西太简单了,能不能写点复杂点.这问题就来了,要写什么东西才叫“复杂”?最重要的是,写得太复杂了,一方面很多朋友看不懂,另一方面,连老周自己也不知道怎么 ...

  3. Spring NamedParameterJdbcTemplate命名参数查询条件封装, NamedParameterJdbcTemplate查询封装

    Spring NamedParameterJdbcTemplate命名参数查询条件封装, NamedParameterJdbcTemplate查询封装 >>>>>> ...

  4. 关于Class.forName(className).newInstance()介绍

    Class.forName(xxx.xx.xx) 返回的是一个类 首先你要明白在java里面任何class都要装载在虚拟机上才能运行.这句话就是装载类用的(和new 不一样,要分清楚). 至于什么时候 ...

  5. RobotFramwork安装报错name 'execfile' is not defined

    安装RobotFramwork的时候,提示了这个?是什么原因呢? 本机装的是python3.6: 经官方回复得知识因为python的版本不兼容该模块的安装. 官方认定版本是2.7,所以这里推荐大家玩p ...

  6. phpstudy:80端口被占用解决方案总结

    一开始因为要安装新的软件,同时也由于一直电脑很卡,所以直接重装系统,从WIN8变成WIN10,然后不知道为什么,phpstudy里面80端口被占用了!被占用了!现在找到了两种方法解决! 第一种 该端口 ...

  7. 基于FPGA的VGA显示静态图片

    终于熬到暑假了,记过三四周的突击带考试,终于为我的大二画上了一个完整的句号,接下来终于可以静心去做自己想做的事情了,前一阵子报了一个线上培训班,学学Sobel边缘检测,之前一直在学习图像处理,但是因为 ...

  8. Python爬虫初学(一)—— 爬取段子

    最近开始学Python的爬虫,是在这个博客跟着学习的,该博主用的是Python 2.7版本,而我使用的是3.5版本,很多不兼容的地方,不过没关系,自己改改就好了. 我们想针对网站的内容进行筛选,只获取 ...

  9. 怎么把系统装进u盘(ultraiso)

    ​首先要下载一个叫ultraiso的软件.可以在百度中搜索此软件下载.下载后安装,安装后打开软件,如图所示.        ​点击左上角的文件选项,在弹出的菜单中,点击打开选项,打开一个你要装进U盘的 ...

  10. solr6.5 的安装与配置

    运行环境: JDK:    1.8.0_131 Tomcat: 9.0.0.M21 Solr:      6.5.1 注:1.建议打开两个连接linux的窗口,一个负责 solr压缩目录,另外一个负责 ...