Codeforces Round #271 (Div. 2) E题 Pillars(线段树维护DP)
题目地址:http://codeforces.com/contest/474/problem/E
第一次遇到这样的用线段树来维护DP的题目。ASC中也遇到过,当时也非常自然的想到了线段树维护DP,可是那题有简单方法,于是就没写。这次最终写出来了。。
这题的DP思想跟求最长上升子序列的思想是一样的。仅仅只是这里的找前面最大值时会超时,所以能够用线段树来维护这个最大值,然后因为还要输出路径,所以要用线段树再来维护一个每一个数在序列中所在的位置信息。
手残了好多地方,最终调试出来了。。。
代码例如以下:
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <queue>
#include <map>
#include <set>
#include <algorithm> using namespace std;
#define LL __int64
#define lson l, mid, rt<<1
#define rson mid+1, r, rt<<1|1
const int INF=0x3f3f3f3f;
const int MAXN=100000;
int maxv[MAXN<<2], cnt, pre[MAXN+10], f[MAXN+10], q_maxp, maxp[MAXN<<2], q_maxv;
LL a[MAXN+10], c[MAXN+10], d[MAXN+10];
void PushUp(int rt)
{
maxv[rt]=max(maxv[rt<<1],maxv[rt<<1|1]);
if(maxv[rt<<1]>=maxv[rt<<1|1])
maxp[rt]=maxp[rt<<1];
else
maxp[rt]=maxp[rt<<1|1];
}
void update(int p, int x, int i, int l, int r, int rt)
{
if(l==r)
{
maxv[rt]=x;
maxp[rt]=i;
return ;
}
int mid=l+r>>1;
if(p<=mid) update(p,x,i,lson);
else update(p,x,i,rson);
PushUp(rt);
}
void query(int ll, int rr, int l, int r, int rt)
{
if(ll<=l&&rr>=r)
{
if(q_maxv<maxv[rt])
{
q_maxv=maxv[rt];
q_maxp=maxp[rt];
}
return ;
}
int mid=l+r>>1, ans=0;
if(ll<=mid) query(ll,rr,lson);
if(rr>mid) query(ll,rr,rson);
}
int bin_seach(LL x)
{
int low=0, high=cnt-1, mid;
while(low<=high)
{
mid=low+high>>1;
if(d[mid]==x) return mid;
else if(d[mid]>x) high=mid-1;
else low=mid+1;
}
}
int l_seach(LL x)
{
int low=0, high=cnt-1, mid, ans=-1;
while(low<=high)
{
mid=low+high>>1;
if(d[mid]<=x)
{
ans=mid;
low=mid+1;
}
else high=mid-1;
}
return ans;
}
int r_seach(LL x)
{
int low=0, high=cnt-1, mid, ans=-1;
while(low<=high)
{
mid=low+high>>1;
if(d[mid]>=x)
{
ans=mid;
high=mid-1;
}
else low=mid+1;
}
return ans;
}
void print(int x)
{
if(x==-1) return ;
print(pre[x]);
printf("%d ",x+1);
}
int main()
{
int n, dd, i, x, ans, y, z, max1=-1, pos, tot;
scanf("%d%d",&n,&dd);
for(i=0; i<n; i++)
{
scanf("%I64d",&a[i]);
c[i]=a[i];
}
sort(c,c+n);
d[0]=c[0];
cnt=1;
for(i=1; i<n; i++)
{
if(c[i]!=c[i-1])
{
d[cnt++]=c[i];
}
}
/*for(i=0;i<cnt;i++)
{
printf("%d ",c[i]);
}
puts("");*/
memset(maxv,0,sizeof(maxv));
memset(pre,-1,sizeof(pre));
for(i=0; i<n; i++)
{
x=bin_seach(a[i]);
y=l_seach(a[i]-dd);
z=r_seach(a[i]+dd);
//printf("%d %d %d\n",x,y,z);
q_maxp=-1;
q_maxv=-1;
if(y!=-1)
query(0,y,0,cnt-1,1);
if(z!=-1)
query(z,cnt-1,0,cnt-1,1);
update(x,q_maxv+1,i,0,cnt-1,1);
pre[i]=q_maxp;
if(q_maxv==0)
pre[i]=-1;
if(max1<q_maxv+1)
{
max1=q_maxv+1;
pos=i;
}
}
printf("%d\n",max1);
print(pos);
return 0;
}
Codeforces Round #271 (Div. 2) E题 Pillars(线段树维护DP)的更多相关文章
- Codeforces Round #271 (Div. 2) F. Ant colony 线段树
F. Ant colony time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- Codeforces Round #305 (Div. 2) D题 (线段树+RMQ)
D. Mike and Feet time limit per test 1 second memory limit per test 256 megabytes input standard inp ...
- Codeforces Round #426 (Div. 2) D. The Bakery 线段树优化DP
D. The Bakery Some time ago Slastyona the Sweetmaid decided to open her own bakery! She bought req ...
- Codeforces Round #271 (Div. 2) F题 Ant colony(线段树)
题目地址:http://codeforces.com/contest/474/problem/F 由题意可知,最后能够留下来的一定是区间最小gcd. 那就转化成了该区间内与区间最小gcd数相等的个数. ...
- Codeforces Round #603 (Div. 2) E. Editor(线段树)
链接: https://codeforces.com/contest/1263/problem/E 题意: The development of a text editor is a hard pro ...
- Codeforces Round #222 (Div. 1) D. Developing Game 线段树有效区间合并
D. Developing Game Pavel is going to make a game of his dream. However, he knows that he can't mak ...
- Codeforces Round #244 (Div. 2) B. Prison Transfer 线段树rmq
B. Prison Transfer Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset/pro ...
- Codeforces Round #546 (Div. 2) E 推公式 + 线段树
https://codeforces.com/contest/1136/problem/E 题意 给你一个有n个数字的a数组,一个有n-1个数字的k数组,两种操作: 1.将a[i]+x,假如a[i]+ ...
- Codeforces Round #275 Div.1 B Interesting Array --线段树
题意: 构造一个序列,满足m个形如:[l,r,c] 的条件. [l,r,c]表示[l,r]中的元素按位与(&)的和为c. 解法: 线段树维护,sum[rt]表示要满足到现在为止的条件时该子树的 ...
随机推荐
- 【翻译】Why JavaScript Is and Will Continue to Be the First Choice of Programmers
花费2半小时,那么最终会被翻译.假设有问题,请提出,毕竟,自己的6不超过级别. 附加链接 Why JavaScript Is and Will Continue to Be the First Cho ...
- C++使用函数模板
函数模板: 函数模板是蓝图或处方功能,编译器使用其发电功能系列中的新成员. 第一次使用时,新的功能是创建.从功能模板生成的函数的实例称为模板或模板的实例.函数模板的开始是keywordtemplate ...
- Oracle学习(十四):管理用户安全性
--用户(user) SQL> --创建一个名为 grace password是password 的用户,新用户没有不论什么权限 SQL> create user grace identi ...
- java基础---->Zip压缩的使用(转)
java中提供了对压缩格式的数据流的读写.它们封装到现成的IO 类中,以提供压缩功能.下面我们开始java中压缩文件的使用. 目录导航: 关于压缩的简要说明 GZIP压缩文件的使用 ZIP压缩文件的使 ...
- 阶乘因式分解(一)(南阳oj56)
阶乘因式分解(一) 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描写叙述 给定两个数m,n,当中m是一个素数. 将n(0<=n<=10000)的阶乘分解质因数, ...
- 泛泰A870L/K/S第三版官方4.4.2原来的系统卡刷机包 (愿自己主动ROOT)
采用suky大神ota具,来自官方的拍摄OTA包裹,未做任何改动, 使用官方recovery,还是我的头发中国TWRP 2.7.1.1 for A870 (己主动ROOT. 自己主动ROOT完后就自己 ...
- iOS 8 新特性
这篇文章会介绍iOS8开发相关的主要特性. App 插件 通过支持插件,iOS8让我们可以系统指定的区域进行扩展,也就是为用户的特定需求提供自定义的方法.例如:可以通过App插件帮助用户分享他们的内容 ...
- WPF技术触屏上的应用系列(四): 3D效果图片播放器(图片立体轮放、图片立体轮播、图片倒影立体滚动)效果实现
原文:WPF技术触屏上的应用系列(四): 3D效果图片播放器(图片立体轮放.图片立体轮播.图片倒影立体滚动)效果实现 去年某客户单位要做个大屏触屏应用,要对档案资源进行展示之用.客户端是Window7 ...
- window.history.back()的改进方法window.history.go()
今天在做项目时,測试人员提出了一条bug,起初没当回事,在改动过程中才意识到其重要性,故记录下来. 依照需求,系统应该实现例如以下的功能:有三个关联的页面a.aspx(简称a),b.aspx(简称b) ...
- 用友财务总帐(GL)模BI数据ETL分析
业务需求,如下面的: 现在用友总帐一家公司BI分析案例. /* Sql Server2012使用作业设置定时任务,为了保证有一天运行时间 */ /* 意temp1表里一定要保证要有记录,否则以temp ...