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 ...
随机推荐
- Ajax跨域访问解决办法
方法1. jsonp实现ajax跨域访问示例 jsp代码: <body> <input type="button" onclick="testJsonp ...
- MapReduce程序依赖的jar包
难得想写个mapreduce程序.发现已经不记得须要加入那些jar包了,网上找了一会也没发现准确的答案.幸好对hadoop体系结构略知一二.迅速试出了写mapreduce程序须要的五个jar包. 不多 ...
- C/C++ 笔试、面试题目大汇总 转
C/C++ 笔试.面试题目大汇总 这些东西有点烦,有点无聊.如果要去C++面试就看看吧.几年前网上搜索的.刚才看到,就整理一下,里面有些被我改了,感觉之前说的不对或不完善. 1.求下面函数的返回值( ...
- 查看Linux操作系统版本
1.查看内核版本命令: [root@server1 Desktop]# cat /proc/version Linux version 2.6.32-358.el6.x86_64 (mockbui ...
- [AngularJS系列(4)] 那伤不起的provider们啊~ (Provider, Value, Constant, Service, Factory, Decorator)(转)
用AngularJS做项目,但凡用过什么service啊,factory啊,provider啊,开始的时候晕没晕?!晕没晕?!感觉干的事儿都差不多啊,到底用哪个啊?!别告诉我你们几个就是为了跟我炫耀兄 ...
- javascript 命名空间,学习
一. (function(){ var _NS=function(){ } _NS.prototype.alert=function(){ console.log('test'); } window. ...
- ASP.NET通用权限验证组件实现
沙发(SF)通用权限验证组件 开篇 本篇介绍通用权限验证的实现代码思路,总共分为导入参数.解析XML.根据XML配置进行处理.返回结果. 代码架构图 1. 类介绍 1.SFWebPermissio ...
- Intersection of Two Linked Lists(java)
eg: a1 → a2 ↘ c1 → c2 → c3 或者直接a1 → b1 ↗ b1 → b2 → b3求公共链表c1. 常规的指针分裂法,复制法,偏移法. public class Solutio ...
- Oracle11g客户端安装及plsql配置
1,项目使用的是oracle11g数据库,安装个客户端访问服务器. 到oracle官方下载: http://www.oracle.com/technology/global/cn/software/t ...
- listbox修改字体大小
listBox1.Font = new Font(this.Font.FontFamily, 14);