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 ...
随机推荐
- 用mac自带的safari浏览器下载excel文件后面自带了.exe后缀
将 Content-Type 设为 application/vnd.ms-excel
- [Javascript] Lodash: Refactoring Simple For Loops (_.find, _.findLast, _.filter)
This lesson shows how to refactor your old loops into using a simpler and more powerful lodash-style ...
- UDP包的最大大小是多少?
每个udp包的最大大小是多少? 65507 约等于 64K 为什么最大是65507? 因为udp包头有2个byte用于记录包体长度. 2个byte可表示最大值为: 2^16-1=64K ...
- [Form Builder]APP_ITEM_PROPERTY.SET_PROPERTY 用法
ORACLE 推荐使用此种方法来控制ITEM属性,虽然实质也是调用set_item_instance_property和set_item_property ALTERABLE app_item_pro ...
- Dom操作--全选反选
我们经常会在网站上遇到一些多选的情况,下面我就来说说使用Dom写全选反选的思路. 全选思路:首先,我们来分析一下知道,当我们点击"全选"复选框的时候,所有的复选框应该都被选中,那我 ...
- 转载---SQL Server XML基础学习<1>之--FOR XML PATH
--> 测试数据:#tbIF OBJECT_ID('TEMPDB.DBO.#tb') IS NOT NULL DROP TABLE #tbGO CREATE TABLE #tb ...
- EasyUI中combotree允许多选的时候onSelect事件会重复触发onCheck事件
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgEAAADkCAIAAACOkmAuAAAgAElEQVR4nO2dW2wc15nnO0EQBJsdzA
- oracle级联删除 触发器
CREATE TABLE STUDENT( --创建学生表 ID NUMBER(10) PRIMARY KEY, --主键ID SNAME VARCHAR2(20), CLASSNAME V ...
- O-C-11-利用类方法做一个简单的计算器
#import <Foundation/Foundation.h> @interface calculator : NSObject //@property double numb ...
- 你喜欢使用eclipse+tomcat编程吗?!
在eclipse中配置tomcat简直是一场灾难! 开源软件确实给开发者极大的自由,但,同时也带来额外的麻烦. eclipse+tomcat只是其中之一.我有幸碰到了N次,在N+1次时,不得不提笔撰文 ...