codeforces479E
Riding in a Lift
Imagine that you are in a building that has exactly n floors. You can move between the floors in a lift. Let's number the floors from bottom to top with integers from 1 to n. Now you're on the floor number a. You are very bored, so you want to take the lift. Floor number b has a secret lab, the entry is forbidden. However, you already are in the mood and decide to make k consecutive trips in the lift.
Let us suppose that at the moment you are on the floor number x (initially, you were on floor a). For another trip between floors you choose some floor with number y (y ≠ x) and the lift travels to this floor. As you cannot visit floor b with the secret lab, you decided that the distance from the current floor x to the chosen ymust be strictly less than the distance from the current floor x to floor b with the secret lab. Formally, it means that the following inequation must fulfill: |x - y| < |x - b|. After the lift successfully transports you to floor y, you write down number y in your notepad.
Your task is to find the number of distinct number sequences that you could have written in the notebook as the result of k trips in the lift. As the sought number of trips can be rather large, find the remainder after dividing the number by 1000000007 (109 + 7).
Input
The first line of the input contains four space-separated integers n, a, b, k (2 ≤ n ≤ 5000, 1 ≤ k ≤ 5000, 1 ≤ a, b ≤ n, a ≠ b).
Output
Print a single integer — the remainder after dividing the sought number of sequences by 1000000007 (109 + 7).
Examples
5 2 4 1
2
5 2 4 2
2
5 3 4 1
0
Note
Two sequences p1, p2, ..., pk and q1, q2, ..., qk are distinct, if there is such integer j (1 ≤ j ≤ k), that pj ≠ qj.
Notes to the samples:
- In the first sample after the first trip you are either on floor 1, or on floor 3, because |1 - 2| < |2 - 4| and |3 - 2| < |2 - 4|.
- In the second sample there are two possible sequences: (1, 2); (1, 3). You cannot choose floor 3 for the first trip because in this case no floor can be the floor for the second trip.
- In the third sample there are no sought sequences, because you cannot choose the floor for the first trip.
sol:非常水的dp,直接转移是n3的,但是智障选手比方说我写了数据结构优化(树状数组),可以做到n2logn,但是还是TLE了,然后想了一会发现自己脑抽了,直接差分就是n2了
然后悲伤的T了两发

#include <bits/stdc++.h>
using namespace std;
typedef int ll;
inline int read()
{
int s=;
bool f=;
char ch=' ';
while(!isdigit(ch))
{
f|=(ch=='-'); ch=getchar();
}
while(isdigit(ch))
{
s=(s<<)+(s<<)+(ch^); ch=getchar();
}
return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(int x)
{
if(x<)
{
putchar('-'); x=-x;
}
if(x<)
{
putchar(x+''); return;
}
write(x/);
putchar((x%)+'');
return;
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const int N=,Mod=;
int n,a,b,m;
int dp[N][N];
inline void Ad(int &x,int y)
{
x+=y;
x-=(x>=Mod)?Mod:;
x+=(x<)?Mod:;
}
struct BIT
{
int S[N];
#define lowbit(x) ((x)&(-x))
inline void Init()
{
memset(S,,sizeof S);
}
inline void Ins(int x,int Val)
{
for(;x<=n;x+=lowbit(x))
{
Ad(S[x],Val);
}
}
inline void Updata(int l,int r,int Val)
{
Ins(l,Val); Ins(r+,-*Val);
}
inline int Que(int x)
{
int Sum=;
for(;x>;x-=lowbit(x))
{
Ad(Sum,S[x]);
}
return Sum;
}
}T;
int S[N];
int main()
{
int i,j,k;
R(n); R(a); R(b); R(m);
dp[a][]=;
for(i=;i<m;i++)
{
// T.Init();
for(j=;j<=n;j++) if(dp[j][i])
{
int oo=abs(j-b)-;
// if(max(1,j-oo)<=j-1) T.Updata(max(1,j-oo),j-1,dp[j][i]);
// if(j+1<=min(n,j+oo)) T.Updata(j+1,min(n,j+oo),dp[j][i]);
if(max(,j-oo)<=j-)
{
Ad(dp[max(,j-oo)][i+],dp[j][i]); Ad(dp[j-+][i+],-*dp[j][i]);
}
if(j+<=min(n,j+oo))
{
Ad(dp[j+][i+],dp[j][i]); Ad(dp[min(n,j+oo)+][i+],-*dp[j][i]);
}
}
for(j=;j<=n;j++) Ad(dp[j][i+],dp[j-][i+]);
// for(j=1;j<=n;j++) dp[j][i+1]=T.Que(j);
}
int ans=;
for(i=;i<=n;i++) Ad(ans,dp[i][m]);
Wl(ans);
return ;
}
/*
Input
5 2 4 1
Output
2 Input
5 2 4 2
Output
2 Input
5 3 4 1
Output
0 input
2222 1206 1425 2222
output
402572650 Input
5000 2500 1 5000
Output
898026985
*/
codeforces479E的更多相关文章
随机推荐
- 用JS编写一个函数,返回数组中重复出现过的元素
			用JS编写一个函数,返回数组中重复出现过的元素,见下面的代码: , , , , , , , ]; var getRepeat = function (arr) { var obj = {}; , le ... 
- react 源码之setState
			今天看了react源码,仅以记录. 1:monorepo (react 的代码管理方式) 与multirepo 相对. monorepo是单代码仓库, 是把所有相关项目都集中在一个代码仓库中,每个mo ... 
- cookie特殊字符在游览器被转义
			环境:vue2.x axios 1.如果只是前端自己用,那么可以用 encodeURIComponent(string) 存 ,用decodeURIComponent(string)取. 2.遇到一种 ... 
- 2019-01-28 [日常]Beyond的歌里最多是"唏嘘"吗? - Python分词+词频
			看了一个Beyond的纪录片, 提到这个. 觉得心有不甘, 于是搜集了24首歌词, 用Python做了简单分词和词频统计. 源码(包括歌词)在: program-in-chinese/study 统计 ... 
- 卷烟厂生产管理系统基于ASP.NET
			VS.Net 2003开发的一个非常老的生产信息管理系统运行10多年依旧稳定,这几天来南昌做维保工作,看到了曾经开发的信息系统.该系统在我眼里老到几点,可却依然在厂里大面积使用,抛开技术上的落后,从新 ... 
- nginx多server配置记录
			直接在配置文件(/etc/nginx/nginx.conf)中添加如下代码: server { listen 8080; server_name 192.168.100.174:8080; root ... 
- SQLServer之创建分布式事务
			分布式事务创建注意事项 指定一个由 Transact-SQL 分布式事务处理协调器 (MS DTC) 管理的 Microsoft 分布式事务的起点. 执行 BEGIN DISTRIBUTED TRAN ... 
- Redis操作string
			Redis简介: ''' redis: 缓存,例如两个个程序A,B之间要进行数据共享,A可以把数据存在redis(内存里),其他程序都可以访问redis里的数据, 这样通过中间商redis就实现了两个 ... 
- ORACLE跨数据库查询的方法
			原文地址:http://blog.csdn.net/huzhenwei/article/details/2533869 本文简述了通过创建database link实现Oracle跨数据库查询的方法 ... 
- kafka-rest:A Comprehensive, Open Source REST Proxy for Kafka
			Ewen Cheslack-Postava March 25, 2015 时间有点久,但讲的还是很清楚的 As part of Confluent Platform 1.0 released ab ... 
