hdu 4521 线段树改点求点的应用
小明系列问题——小明序列
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 1264 Accepted Submission(s): 344
提起小明序列,他给出的定义是这样的: ①首先定义S为一个有序序列,S={ A1 , A2 , A3 , ... , An },n为元素个数 ; ②然后定义Sub为S中取出的一个子序列,Sub={ Ai1 , Ai2 , Ai3 , ... , Aim },m为元素个数 ; ③其中Sub满足 Ai1 < Ai2 < Ai3 < ... < Aij-1 < Aij < Aij+1 < ... < Aim ; ④同时Sub满足对于任意相连的两个Aij-1与Aij都有 ij - ij-1 > d (1 < j <= m, d为给定的整数); ⑤显然满足这样的Sub子序列会有许许多多,而在取出的这些子序列Sub中,元素个数最多的称为“小明序列”(即m最大的一个Sub子序列)。 例如:序列S={2,1,3,4} ,其中d=1; 可得“小明序列”的m=2。即Sub={2,3}或者{2,4}或者{1,4}都是“小明序列”。
当小明发明了“小明序列”那一刻,情绪非常激动,以至于头脑凌乱,于是他想请你来帮他算算在给定的S序列以及整数d的情况下,“小明序列”中的元素需要多少个呢?
1 2
5 1
3 4 5 1 2
5 2
3 4 5 1 2
2
1
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn=;
#define L(x) 2*x
#define R(x) 2*x+1
struct node
{
int l,r,mx;
int mid(){return (l+r)>>;}
}tree[*maxn];
struct NODE
{
int val,id;
}pp[maxn];
bool cmp(NODE a,NODE b)
{
if(a.val==b.val)return a.id>b.id;
return a.val<b.val;
}
void pushup(int p)
{
tree[p].mx=max(tree[L(p)].mx,tree[R(p)].mx);
}
void build(int p,int l,int r)
{
tree[p].l=l;
tree[p].r=r;
tree[p].mx=;
if(l==r)return;
int m=tree[p].mid();
build(L(p),l,m);
build(R(p),m+,r);
pushup(p);
}
void update(int p,int pos,int val)
{
if(tree[p].l==tree[p].r)
{
tree[p].mx=max(tree[p].mx,val);
return;
}
int m=tree[p].mid();
if(pos<=m)update(L(p),pos,val);
else update(R(p),pos,val);
pushup(p);
}
int query(int p,int l,int r)
{
if(l>r)return ;
if(tree[p].l>=l&&tree[p].r<=r)return tree[p].mx;
int m=tree[p].mid();
int ans=-;
if(l<=m)ans=max(ans,query(L(p),l,r));
if(r>m)ans=max(ans,query(R(p),l,r));
return ans;
}
int main()
{
int i,j,k,m,n,d;
while(~scanf("%d%d",&n,&d))
{
for(i=;i<=n;i++)scanf("%d",&pp[i].val),pp[i].id=i;
sort(pp+,pp+n+,cmp);
// for(i=1;i<=n;i++)cout<<pp[i].val<<" ";cout<<endl;
build(,,n);
int ans=;
for(i=;i<=n;i++)
{
j=pp[i].id;
k=query(,,j-d-);
ans=max(ans,k+);
update(,j,k+);
}
printf("%d\n",ans);
}
return ;
}
hdu 4521 线段树改点求点的应用的更多相关文章
- 覆盖的面积 HDU - 1255 线段树+扫描线+离散化 求特定交叉面积
#include<cstdio> #include<map> #include<algorithm> using namespace std; ; struct N ...
- HDU 1754 I Hate It 线段树单点更新求最大值
题目链接 线段树入门题,线段树单点更新求最大值问题. #include <iostream> #include <cstdio> #include <cmath> ...
- hdu 1754 线段树(Max+单点修改)
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- hdu 5877 线段树(2016 ACM/ICPC Asia Regional Dalian Online)
Weak Pair Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ...
- hdu 3397 线段树双标记
Sequence operation Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- hdu 4533 线段树(问题转化+)
威威猫系列故事——晒被子 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Tot ...
- hdu 2871 线段树(各种操作)
Memory Control Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- hdu 4052 线段树扫描线、奇特处理
Adding New Machine Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- hdu 1542 线段树扫描(面积)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
随机推荐
- 【斗地主技巧】斗地主算法逻辑中的天之道<转>
******************************************************************** 作者比较喜欢玩斗地主,所以经常搜集一些网友斗地主的心得,下面这 ...
- CDH 1、CDH简介
1.Apache Hadoop 不足之处 • 版本管理混乱 • 部署过程繁琐.升级过程复杂 • 兼容性差 • 安全性低 2.Hadoop 发行版 • Apache Hadoop • Cloudera’ ...
- Python re模块 正则表达式
1 简介 就其本质而言,正则表达式(或 RE)是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现.正则表达式模式被编译成一系列的字节码,然后由用 C ...
- Android学习总结——SQLite
SQLiteDatabase类: 一.使用sql语句操作数据库 SQLiteDatabase db = openOrCreateDatabase("database.db", MO ...
- 查看Linux操作系统版本
1.查看内核版本命令: [root@server1 Desktop]# cat /proc/version Linux version 2.6.32-358.el6.x86_64 (mockbui ...
- JVM 垃圾回收机制( 一) 回收对象的判定
关于JVM 的垃圾回收机制,我们一般都没过多深入,因为JAVA 和 C++ 的一个很大区别就是,JAVA 帮我们做了垃圾回收,而不用像C++ 那么样手动进行回收,当然任何自动的东西都存在一定弊端,比如 ...
- 二、Mp3帧分析(标签帧)
Mp3文件由帧组成,帧分成标签帧和数据帧,本文就Mp3文件的帧进行分析. 一.标签帧 MP3帧头中除了存储一些象private.copyright.original的简单音乐说明信息以外,没有考虑存放 ...
- Makefiles 介绍
http://www-personal.umich.edu/~ppannuto/writings/makefiles.html Makefiles Makefiles (or, the GNU aut ...
- UVA 140 Bandwidth
题意: 给出一个n个节点的图G,和一个节点的排列,定义节点i的带宽为i和相邻节点在排列中的最远距离,而所有带宽的最大值就是图的带宽,求让图的带宽最小的排列. 分析: 列出所有可能的排列,记录当前找到的 ...
- linux网络编程:select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET(转)
从别人的博客中转载过来了这一篇文章,经过重新编辑排版之后展现于此,做一个知识点保存与学习. select函数用于在非阻塞中,当一个套接字或一组套接字有信号时通知你,系统提供select函数来实现多路复 ...