[RMQ] [线段树] POJ 3368 Frequent Values
一句话,多次查询区间的众数的次数
注意多组数据!!!!
RMQ方法:
预处理 i 及其之前相同的数的个数
再倒着预处理出 i 到不是与 a[i] 相等的位置之前的一个位置, 查询时分成相同的一段和不同的一段 (RMQ)
但是要注意 to[i] 大于查询范围的情况, 以及RMQ时 x < y 的情况!!
AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<string>
#include<iomanip>
#include<ctime>
#include<climits>
#include<cctype>
#include<algorithm>
#ifdef WIN32
#define AUTO "%I64d"
#else
#define AUTO "%lld"
#endif
using namespace std;
const int INF=0x3f3f3f3f;
const int maxn=;
const int maxd=;
int n,q;
int a[maxn];
int sum[maxn];
int to[maxn];
inline bool init()
{
if(!~scanf("%d%d",&n,&q) || !n) return false;
for(int i=;i<=n;i++) scanf("%d",a+i);
sum[]=;
for(int i=;i<=n;i++)
if(a[i-]^a[i]) sum[i]=;
else sum[i]=sum[i-]+;
to[n]=n;
for(int i=n-;i;i--)
to[i] = a[i]^a[i+]? i : to[i+];
return true;
}
int dp[maxn][maxd];
void ST()
{
for(int i=;i<=n;i++) dp[i][] = sum[i];
int k=;
while( (<<k+) <= n ) k++;
for(int j=;j<=k;j++)
for(int i=;i+(<<j)-<=n;i++)
dp[i][j] = max( dp[i][j-] , dp[i+(<<j-)][j-] ); // j-1 moved !!!
}
inline int RMQ(int x,int y)
{
if (x>y) return -INF; // INF here to make the case extinct!!
int k=;
while( (<<k+) <= (y-x+) ) k++;
return max(dp[x][k] , dp[y-(<<k)+][k]);
}
int main()
{
freopen("fre.in","r",stdin);
freopen("fre.out","w",stdout);
while(init())
{
ST();
for(int i=;i<=q;i++)
{
int x,y;
scanf("%d%d",&x,&y);
printf("%d\n",max(sum[min(to[x],y)]-sum[x]+ , RMQ(to[x]+,y)));
}
}
return ;
}
线段树方法:
不急,懒得写了。。
[RMQ] [线段树] POJ 3368 Frequent Values的更多相关文章
- POJ 3368 Frequent values RMQ ST算法/线段树
Frequent values Time Limit: 2000MS Memory Lim ...
- 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解法
题意:给出n个数的非递减序列,进行q次查询.每次查询给出两个数a,b,求出第a个数到第b个数之间数字的最大频数. 如序列:-1 -1 1 1 1 1 2 2 3 第2个数到第5个数之间出现次数最多的是 ...
- poj 3368 Frequent values(RMQ)
/************************************************************ 题目: Frequent values(poj 3368) 链接: http ...
- 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 -Sparse-Table
Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 16537 Accepted: 5981 Description You ...
- Poj 3368 Frequent values
/* 线段树区间合并 维护几个信息 到时候乱搞一下就好了 开始T了 有一种情况可以不用递归 直接算出来 */ #include<iostream> #include<cstdio&g ...
- POJ 3368 Frequent values(线段树区间合并)
[题目链接] http://poj.org/problem?id=3368 [题目大意] 有一个有序序列,要求区间查询出现次数最多的数 [题解] 维护每个区间左端点和右端点,以及左右的长度,还有区间的 ...
随机推荐
- 学习和理解C#的委托
去年自学C#用的教程是入门级的<学通C#的24堂课>,教材里面也没有提到委托和事件,工作中也没怎么用到.后来一次在网上看了一些大牛的博客,读完之后感觉懵懵懂懂,似懂非懂,过了两三天之后,却 ...
- PHP+MySQL开发技术详解—学习笔记
1. PHP is Hypertext Preproocessor. 2. Hello World: <?php Echo ‘Hello World!’; ?> 3. ...
- python会什么比c慢
众所周知,python执行速度比c慢.原因为何? 先来看下面这张图: python的传统运行执行模式:录入的源代码转换为字节码,之后字节码在python虚拟机中运行.代码自动被编译,之后再解释成机器码 ...
- BBSXP最新漏洞 简单注入检測 万能password
BBSXP最新漏洞 漏洞日期:2005年7月1日受害版本号:眼下全部BBSXP漏洞利用:查前台password注入语句:blog.asp?id=1%20union%20select%201,1,use ...
- XMLHTTP使用具体解释
XMLHTTP对象是Microsoft的MSXML开发包中带的一个用HTTP,XML协议訪问web资源的对象. 从MSXML3.0開始出现. 它在AJAX技术中主要用来从其它网络资源获取信息,然后由j ...
- JFinal使用笔记1-部署demo项目到本地tomcat
http://my.oschina.net/u/173975/blog/110261 尝试用JFinal开发个开源的社团管理系统,把开发过程中遇到的问题和解决办法记下来,以供参考. 部署jfinal_ ...
- MongoDB(四)——管理架构
前面介绍MongoDB基础,在这里,我们推荐两个网站,我们可以看看,评论是相当具体:http://www.w3cschool.cc/mongodb/mongodb-tutorial.html.http ...
- 用 jQuery Masonry 插件创建瀑布流式的页面(转)
瀑布流式的页面,最早我是在国外的一个叫 Pinterest 的网站上看到,这个网站爆发,后来国内的很多网站也使用了这种瀑布流方式来展示页面(我不太喜欢瀑布流这个名字). 我们可以使用 jQuery 的 ...
- (转)Dependency Walker使用说明
在Windows世界中,有无数块活动的大陆,它们都有一个共同的名字——动态链接库.现在就让我们走进这些神奇的活动大陆,找出它们隐藏已久的秘密吧! 初窥门径:Windows的基石 随便打开一个系统目录, ...
- mysql 源码调试方法
http://blog.itpub.net/29254281/viewspace-1847415/ 其中吕海波老师分享的内容是 <调试Oracle二三例:调试技术在日常运维中的应用>其中 ...