POJ 3368 Frequent values RMQ 训练指南 好题
#include<cstdio>
#include<cstring> const int maxn=1e5+;
const int inf=0x3f3f3f3f; inline int max(int x,int y)
{
return x>y?x:y;
} int a[maxn];
int left[maxn];
int right[maxn];
int num[maxn];
int dp[maxn][]; void init()
{
memset(a,,sizeof a);
memset(left,-,sizeof left);
memset(right,-,sizeof right);
} void init_rmq(int n)
{
for(int i=;i<=n;i++)
dp[i][]=a[i];
for(int j=;(<<j)<=n;j++)
{
for(int i=;i+(<<j)-<=n;i++)
{
dp[i][j]=max(dp[i][j-],dp[i+(<<(j-))][j-]);
}
}
} int query(int l,int r)
{
if(l>r)
return ;
int k=;
while((<<(k+))<=r-l+)
k++;
return max(dp[l][k],dp[r-(<<k)+][k]);
} void solve(int n,int q)
{
init_rmq(n);
for(int i=;i<q;i++)
{
int L,R;
scanf("%d%d",&L,&R);
if(num[L]==num[R])
{
printf("%d\n",R-L+);
continue;
}
int ans=max(right[num[L]]-L+,R-left[num[R]]+);
ans=max(ans,query(num[L]+,num[R]-));
printf("%d\n",ans);
}
return ;
} int main()
{
int cnt;
while(scanf("%d",&cnt))
{
if(!cnt)
break;
int q;
scanf("%d",&q);
init();
int pre=-inf;
int n=;
for(int i=;i<=cnt;i++)
{
int u;
scanf("%d",&u);
if(u!=pre)
{
right[n]=i-;
a[++n]=;
left[n]=i;
}
else
a[n]++;
num[i]=n;
pre=u;
}
right[n]=cnt; solve(n,q);
}
return ;
}
POJ 3368 Frequent values RMQ 训练指南 好题的更多相关文章
- poj 3368 Frequent values(RMQ)
/************************************************************ 题目: Frequent values(poj 3368) 链接: http ...
- POJ 3368 Frequent values RMQ ST算法/线段树
Frequent values Time Limit: 2000MS Memory Lim ...
- POJ 3368 Frequent values(RMQ 求区间出现最多次数的数字的次数)
题目链接:http://poj.org/problem? id=3368 Description You are given a sequence of n integers a1 , a2 , .. ...
- POJ 3368 Frequent values 【ST表RMQ 维护区间频率最大值】
传送门:http://poj.org/problem?id=3368 Frequent values Time Limit: 2000MS Memory Limit: 65536K Total S ...
- POJ 3368 Frequent values (基础RMQ)
Frequent values Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 14742 Accepted: 5354 ...
- poj 3368 Frequent values(段树)
Frequent values Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 13516 Accepted: 4971 ...
- poj 3368 Frequent values(RMQ)
题目:http://poj.org/problem?id=3368 题意:给定n个数,顺序为非下降,询问某个区间内的数出现最多的数的 出现次数.. 大白书上的 例题..算是RMQ变形了, 对 原数组重 ...
- (简单) POJ 3368 Frequent values,RMQ。
Description You are given a sequence of n integers a1 , a2 , ... , an in non-decreasing order. In ad ...
- [RMQ] [线段树] POJ 3368 Frequent Values
一句话,多次查询区间的众数的次数 注意多组数据!!!! RMQ方法: 预处理 i 及其之前相同的数的个数 再倒着预处理出 i 到不是与 a[i] 相等的位置之前的一个位置, 查询时分成相同的一段和不同 ...
随机推荐
- Android——网格布局仿计算器
代码如下: <?xml version="1.0" encoding="utf-8"?> <GridLayout xmlns:android= ...
- Visual Studio 2012 update3 安装后的问题及解决
安装之后可能遇到的问题: 安装完时,打开Help Viewer时,出现了一个错误提示:”a content file required by the help viewer is missing or ...
- Linux驱动设计—— 中断与时钟@request_irq参数详解
request_irq函数定义 /*include <linux/interrupt.h>*/ int request_irq(unsigned int irq, irq_handler_ ...
- 黑马程序员——JAVA基础之Map集合
------- android培训.java培训.期待与您交流! ---------- Map集合: 该集合存储键值对.一对一对往里存.而且要保证键的唯一性. 和Set很像,其实Set底层就是使用了M ...
- MFC如何添加自定义控件
project->add to project->components and controls在Registered ActiveX Controls下找到你注册的自定义控件就可以了 ...
- 套接字I/O模型-WSAAsyncSelect
利用这个异步I/O模型,应用程序可在一个套接字上接收以Windows消息为基础的网络事件通知.WSAAsyncSelect和WSAEventSelect提供读写数据能力的异步通知,但它们不提供异步数据 ...
- Linux 用户态和内核态
1.特权级特权级用来管理和控制程序执行.如Intel x86架构的CPU,有0~3四个特权级,0级最高,3级最低.硬件在执行每条指令时都会检查指令具有的特权级.硬件提供了特权级使用机制,对操作系统来说 ...
- NOLOCK、HOLDLOCK、UPDLOCK、TABLOCK、TABLOCKX
NOLOCK(不加锁) 此选项被选中时,SQL Server 在读取或修改数据时不加任何锁. 在这种情况下,用户有可能读取到未完成事务(Uncommited Transaction)或回滚(Roll ...
- MongoDB管理与开发精要 书摘
摘自:<MongoDB管理与开发精要> 性能优化 创建索引 限定返回结果条数 只查询使用到的字段,而不查询所有字段 采用capped collection 采用Server ...
- linux包之dmidecode
http://www.dmtf.org/standards/smbios Dmidecode 这款软件允许你在 Linux 系统下获取有关硬件方面的信息.Dmidecode 遵循 SMBIOS/DMI ...