codeforces 278Div1 B题
虚拟参赛的时候没想到是线段树,看到很多人都过了,也蛮着急的。
首先用二分+线段树的方法更新DP[i]:它表示以A[i]为结尾可以最前到哪个位置;
再用线段树计算ans[i]:它表示当前i个A元素可以最少分成多少个pieces,ans[i]=1+min(ans[j]),dp[i]-1<=j<=i-L。
over.
#define N 100000+5 int a[N],dp[N],Ans[N];
struct segment {
int l,r;
int Min,Max,ans;
} seg[*N]; struct diff {
int Max,Min;
diff(int x=,int n=):Max(x),Min(n) {}
}; void build(int p,int l,int r)
{
seg[p].l=l, seg[p].r=r, seg[p].ans=-;;
if (l==r) {
seg[p].Min = seg[p].Max = a[l];
return;
}
build(p<<,l,(l+r)>>);
build((p<<)+,((l+r)>>)+,r); seg[p].Min = min(seg[p<<].Min, seg[(p<<)+].Min),
seg[p].Max = max(seg[p<<].Max, seg[(p<<)+].Max);
} diff query1(int p,int l,int r)
{
if (l<=seg[p].l && seg[p].r<=r) {
return diff(seg[p].Max,seg[p].Min);
} diff t1,t2;
bool f1=false, f2=false;
if (seg[p<<].r>=l)
f1=true, t1=query1(p<<,l,r);
if (seg[(p<<)+].l<=r)
f2=true, t2=query1((p<<)+,l,r); if (f1) {
if (f2)
return diff(max(t1.Max,t2.Max), min(t1.Min,t2.Min));
else
return t1;
}
else
if (f2)
return t2;
return diff(,);
} int query2(int p,int l,int r)
{
if (l<=seg[p].l && seg[p].r<=r) {
return seg[p].ans;
} int t1=-,t2=-;
if (seg[p<<].r>=l)
t1=query2(p<<,l,r);
if (seg[(p<<)+].l<=r)
t2=query2((p<<)+,l,r); if (t1==-) {
return t2;
}
else {
if (t2==-)
return t1;
else return min(t1,t2);
} } void add(int p,int i,int newans)
{
if (seg[p].l==seg[p].r) {
seg[p].ans=newans;
return;
} if (i<=seg[p<<].r)
add(p<<,i,newans);
else
add((p<<)+,i,newans); if (seg[p<<].ans==-) {
seg[p].ans = seg[(p<<)+].ans;
}
else {
if (seg[(p<<)+].ans==-)
seg[p].ans=seg[p<<].ans;
else
seg[p].ans=min(seg[p<<].ans,seg[(p<<)+].ans);
}
} int main()
{
//freopen("b.txt","r",stdin); int n,s,l;
cin>>n>>s>>l;
for (int i=;i<=n;i++) scanf("%d",&a[i]);
build(,,n);
for (int i=;i<=n;i++) {
int L=,R=i-;
dp[i]=i;
while (L<=R) {
int mid = (L+R)>>;
diff tmp = query1(,mid,i);
if (tmp.Max-tmp.Min<=s) {
R=mid-;
dp[i]=mid;
}
else {
L=mid+;
}
}
} for (int i=;i<=n;i++) {
if (i<l) {
Ans[i]=-;
continue;
}
int tmp=-;
if (i-l> && dp[i]-<=i-l)
tmp=query2(,max(,dp[i]-),i-l);
if (dp[i]==) tmp=; if (tmp==-)
Ans[i]=-;
else
Ans[i]=tmp+, add(,i,Ans[i]);
}
cout<<Ans[n]<<endl; return ;
}
codeforces 278Div1 B题的更多相关文章
- Codeforces VP/补题小记 (持续填坑)
Codeforces VP/补题小记 1149 C. Tree Generator 给你一棵树的括号序列,每次交换两个括号,维护每次交换之后的直径. 考虑括号序列维护树的路径信息和,是将左括号看做 ...
- CodeForces - 427B (模拟题)
Prison Transfer Time Limit: 1000MS Memory Limit: 262144KB 64bit IO Format: %I64d & %I64u Sub ...
- codeforces #261 C题 Pashmak and Buses(瞎搞)
题目地址:http://codeforces.com/contest/459/problem/C C. Pashmak and Buses time limit per test 1 second m ...
- Codeforces & Atcoder神仙题做题记录
鉴于Codeforces和atcoder上有很多神题,即使发呆了一整节数学课也是肝不出来,所以就记录一下. AGC033B LRUD Game 只要横坐标或者纵坐标超出范围就可以,所以我们只用看其中一 ...
- B - Save the problem! CodeForces - 867B 构造题
B - Save the problem! CodeForces - 867B 这个题目还是很简单的,很明显是一个构造题,但是早训的时候脑子有点糊涂,想到了用1 2 来构造, 但是去算这个数的时候算错 ...
- Codeforces 424A (思维题)
Squats Time Limit: 1000MS Memory Limit: 262144KB 64bit IO Format: %I64d & %I64u Submit Statu ...
- CodeForces - 404B(模拟题)
Marathon Time Limit: 1000MS Memory Limit: 262144KB 64bit IO Format: %I64d & %I64u Submit Sta ...
- CodeForces - 404A(模拟题)
Valera and X Time Limit: 1000MS Memory Limit: 262144KB 64bit IO Format: %I64d & %I64u Submit ...
- Codeforces 390A( 模拟题)
Inna and Alarm Clock Time Limit: 1000MS Memory Limit: 262144KB 64bit IO Format: %I64d & %I64 ...
随机推荐
- mongdb使用场景
你期望一个更高的写负载 默认情况下,对比事务安全,MongoDB更关注高的插入速度.如果你需要加载大量低价值的业务数据,那么MongoDB将很适合你的用例.但是必须避免在要求高事务安全的情景下使用Mo ...
- cocos2dx lua学习笔记 <一> quick 3.5定义本身C++类是必然lua
请尊重原创 转载有名源:http://blog.csdn.net/wushao126/article/details/46660375 首先去官网下载最新的quick.配置好环境.创建一个luapro ...
- Java NIO与IO的差别和比較
导读 J2SE1.4以上版本号中公布了全新的I/O类库.本文将通过一些实例来简介NIO库提供的一些新特性:非堵塞I/O,字符转换,缓冲以及通道. 一. 介绍NIO NIO包(java.nio.*)引入 ...
- FAQ系列 | 解读EXPLAIN执行计划中的key_len
http://imysql.com/2015/10/20/mysql-faq-key-len-in-explain.shtml
- stack例子
栈使用在括号匹配中的例子 程序如下: #include<stack> #include<iostream> using namespace std; int main() { ...
- How to save/read file on different platforms
You can use standard c functions, such as fopen, fwrite, to save and read file on different platform ...
- 深入理解计算机系统第二版习题解答CSAPP 2.9
基于三元色R(红)G(绿)B(蓝)关闭(0)和打开(1),能够创建8种不同的颜色,如下: R G B 颜色 R G B 颜色 0 0 0 黑色 1 0 0 红色 0 0 1 蓝色 1 0 1 红紫色 ...
- C#中out和ref使用
1.out必须在方法中为其赋值,在调用的时候必须在变量的前面加上out关键字,侧重输出. 2.ref修饰方法的参数,在调用的时候必须在变量的前面加上ref关键字,可以修改其值也可以不修改,侧重修改. ...
- MVC小系列(十一)【Html.BeginForm与Ajax.BeginForm】
Html.BeginForm与Ajax.BeginForm都是mvc的表单元素,前者是普通的表单提交,而后者是支持异步的表单提交,直接用mvc自带的Ajax.BeginForm就可以很容易完成一个异步 ...
- tomcat启动
http://jingyan.baidu.com/article/c33e3f48a42352ea15cbb5d4.html