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]表示要满足到现在为止的条件时该子树的 ...
随机推荐
- OGG-01008 Extract displays Discarding bad record (discard recs=1) when using filter or where clause
因为在extract參数文件里使用了where语句,而where后面的的条件列又不是主键,没有为update.delete操作记录日志,因此会报1008错误. Applies to: Oracle G ...
- HDU1163 Eddy's digital Roots【九剩余定理】
Eddy's digital Roots Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Oth ...
- Swift基础--使用TableViewController自己定义列表
首先建立一个swift项目,把storyboard的内容删掉,加入一个Navigation Controller.然后设置storyboard相应界面的class,在Navigation Contro ...
- [改变自己wordpress.2]至wordpress再加上简单的debug sql调试.
或者说,同事. 需要帮助她打印出来sql 调试输出到页面sql 在这里,我们使用插件或一个的方式来启动配置文件wordpress的debug 在插件文件夹 wordpress/wp-content/p ...
- setInterval定时和ajax请求
fnSetMarkPoint = function (param) { $.ajax({ success: function (returnValue) { window.setInterval(&q ...
- LNMP 免安装包
LNMP(Linux-Nginx-Mysql-PHP)可爱的黄金搭档,不过配置并不轻易,而我平常用于测试环境又经常用到,所以打包了这么一个免安装的LNMP包,内置常用库和模块,以及基本的优化设置,这样 ...
- jquery处理页面元素
处理父级页面中的元素 $(parent.document).find('#hidSendPerson').val(val);$(parent.document).find('#btnGo').clic ...
- 查看.a架构文件
苹果公司现在要求所有新提交的评论app,我们必须支持64位架构.而我们的在线项目编制,操作员做了一堆SDK在需要访问,我们发现,在这个过程中,有些SDK的.a文件进入后,链接错误,如提示 Undefi ...
- vuejs 相关资料
官网 http://vuejs.org/ 中文网站 http://cn.vuejs.org/ Vue.js——60分钟快速入门 http://www.cnblogs.com/keepfool/p/56 ...
- TCP连接建立过程中为什么需要“三次握手”(转)
传输控制协议(Transmission Control Protocol, TCP)是一种面向连接的.可靠的.基于字节流的运输层(Transport layer)通信协议.是专门为了在不可靠的互联网络 ...