虚拟参赛的时候没想到是线段树,看到很多人都过了,也蛮着急的。

首先用二分+线段树的方法更新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题的更多相关文章

  1. Codeforces VP/补题小记 (持续填坑)

    Codeforces VP/补题小记 1149 C. Tree Generator 给你一棵树的括号序列,每次交换两个括号,维护每次交换之后的直径. ​ 考虑括号序列维护树的路径信息和,是将左括号看做 ...

  2. CodeForces - 427B (模拟题)

    Prison Transfer Time Limit: 1000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64u Sub ...

  3. codeforces #261 C题 Pashmak and Buses(瞎搞)

    题目地址:http://codeforces.com/contest/459/problem/C C. Pashmak and Buses time limit per test 1 second m ...

  4. Codeforces & Atcoder神仙题做题记录

    鉴于Codeforces和atcoder上有很多神题,即使发呆了一整节数学课也是肝不出来,所以就记录一下. AGC033B LRUD Game 只要横坐标或者纵坐标超出范围就可以,所以我们只用看其中一 ...

  5. B - Save the problem! CodeForces - 867B 构造题

    B - Save the problem! CodeForces - 867B 这个题目还是很简单的,很明显是一个构造题,但是早训的时候脑子有点糊涂,想到了用1 2 来构造, 但是去算这个数的时候算错 ...

  6. Codeforces 424A (思维题)

    Squats Time Limit: 1000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64u Submit Statu ...

  7. CodeForces - 404B(模拟题)

    Marathon Time Limit: 1000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64u Submit Sta ...

  8. CodeForces - 404A(模拟题)

    Valera and X Time Limit: 1000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64u Submit ...

  9. Codeforces 390A( 模拟题)

    Inna and Alarm Clock Time Limit: 1000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64 ...

随机推荐

  1. mybatis完美的实战教程

    文件夹(? )[-] (读者注:事实上这个应该叫做非常基础的入门一下下,假设你看过Hibernate了那这个就非常的简单) 文章来源:http://blog.csdn.net/techbirds_ba ...

  2. java08 Set

    Set: 无序不可重复,重复则覆盖,判断是不是重复也是通过equals方法判断的.HashSet和TreeSet,HashSet底层是HashMap. public static void main( ...

  3. mysqld with valgrind

    使用编译脚本编译MariaDB 现在进入源代码目录并执行符合你的配置的编译脚本,比如: cd $maria-source-dir # ex: ~/repos/maria/trunk BUILD/com ...

  4. Java IO学习笔记

    Java流的分类,一般可按以下方式分: 按方向分,分为输入流,输出流. 按类型分,分为字节流和字符流. 2.1字节流是通过字节来读取数据 2.2字符流是通过字符来读取数据 按操作方式分,分为节点流和过 ...

  5. Android 自定义View修炼-实现自定义圆形、圆角和椭圆ImageView(使用Xfermode图形渲染方法)

    一:简介: 在上一篇<Android实现圆形.圆角和椭圆自定义图片View(使用BitmapShader图形渲染方法)>博文中,采用BitmapShader方法实现自定义的圆形.圆角等自定 ...

  6. tomcat中设置多项目共享jar;类包

    随着服务器上的tomcat部署的项目越来越多,最近在部署一个新的项目的时候出现内存溢出的错误 Exception in thread "main" java.lang.OutOfM ...

  7. export命令和import命令 详解

    export命令 模块功能主要由两个命令构成:export和import. export命令用于用户自定义模块,规定对外接口: import命令用于输入其他模块提供的功能,同时创造命名空间(names ...

  8. UITabBarController 初学

    纯代码编写UITabBarController, 不多说,直接见代码 RViewController1 *vc1 = [[RViewController1 alloc]init]; UINavigat ...

  9. ios 阻止GDB依附

    GDB,IDE是大多数hackers的首选,阻止GDB依附到应用的常规办法是: . #import <sys/ptrace.h> . . int main(int argc, charch ...

  10. Java Web应用启动间隔执行的程序

    Reference:<Java定时器timer.schedule在Web中间隔执行任务和定时><[Java]Timer和TimerTask详解> 做了一个Demo,完成如下的功 ...