题目链接

给一个非递减数列, n个数, m个询问, 每个询问给出区间[L, R], 求这个区间里面出现次数最多的数的次数。

非递减数列, 这是最关键的一个条件...

需要保存一个区间最左边的数, 最右边的数, 最长前缀, 最长后缀, 和这个区间里面次数最多的数的次数。

一个区间出现最多的数的次数, 应该是左区间和右区间里面取一个最大值。 如果左区间最右边的数和右区间最左边的数相同, 还需要判断这个数左右区间加起来的数量是否大于最大值。

合并的时候需要判断左区间最右边的数和右区间最左边的数是否相同, 具体看代码。

 #include<bits/stdc++.h>
using namespace std;
#define pb(x) push_back(x)
#define ll long long
#define mk(x, y) make_pair(x, y)
#define lson l, m, rt<<1
#define mem(a) memset(a, 0, sizeof(a))
#define rson m+1, r, rt<<1|1
#define mem1(a) memset(a, -1, sizeof(a))
#define mem2(a) memset(a, 0x3f, sizeof(a))
#define rep(i, a, n) for(int i = a; i<n; i++)
#define ull unsigned long long
typedef pair<int, int> pll;
const double PI = acos(-1.0);
const double eps = 1e-;
const int mod = 1e9+;
const int inf = ;
const int dir[][] = { {-, }, {, }, {, -}, {, } };
const int maxn = 1e5+;
int lnum[maxn<<], rnum[maxn<<], maxx[maxn<<], pre_max[maxn<<], suf_max[maxn<<];
void pushUp(int rt, int m) {
maxx[rt] = max(maxx[rt<<], maxx[rt<<|]);
lnum[rt] = lnum[rt<<];
rnum[rt] = rnum[rt<<|];
suf_max[rt] = suf_max[rt<<|];
if(suf_max[rt] == (m>>)&&lnum[rt<<|] == rnum[rt<<]) //如果左区间最右边的数和右区间最左边的数相等
suf_max[rt] += suf_max[rt<<]; //并且左区间的后缀长度等于这段区间的长度
pre_max[rt] = pre_max[rt<<];
if(pre_max[rt] == m-(m>>) && rnum[rt<<] == lnum[rt<<|])
pre_max[rt] += pre_max[rt<<|];
if(lnum[rt<<|] == rnum[rt<<])
maxx[rt] = max(maxx[rt], pre_max[rt<<|]+suf_max[rt<<]);
}
void build(int l, int r, int rt) {
if(l == r) {
scanf("%d", &lnum[rt]);
rnum[rt] = lnum[rt];
maxx[rt] = pre_max[rt] = suf_max[rt] = ;
return ;
}
int m = l+r>>;
build(lson);
build(rson);
pushUp(rt, r-l+);
}
int query(int L, int R, int l, int r, int rt) {
if(L<=l&&R>=r) {
return maxx[rt];
}
int m = l+r>>;
if(R<=m)
return query(L, R, lson);
if(L>m)
return query(L, R, rson);
int tmp1 = query(L, m, lson);
int tmp2 = query(m+, R, rson);
int tmp3 = ;
if(lnum[rt<<|] == rnum[rt<<])
tmp3 = min(pre_max[rt<<|], R-m)+min(suf_max[rt<<], m-L+);
return max(tmp1, max(tmp2, tmp3));
}
int main()
{
int n, m;
while(cin>>n&&n) {
cin>>m;
build(, n, );
while(m--) {
int x, y;
scanf("%d%d", &x, &y);
printf("%d\n", query(x, y, , n, ));
}
}
return ;
}

hdu 1806 Frequent values 线段树的更多相关文章

  1. HDOJ-1806 ( Frequent values ) 线段树区间合并

    http://acm.hdu.edu.cn/showproblem.php?pid=1806 线段树维护区间出现频率最高的出现次数.为了维护上者,需要维护线段前后缀的出现次数,当和其他线段在端点处的字 ...

  2. [HDU 1806] Frequent values

    Frequent values Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  3. UVA 11235 Frequent values 线段树/RMQ

    vjudge 上题目链接:UVA 11235 *******************************************************大白书上解释**************** ...

  4. POJ 3368 Frequent values 线段树与RMQ解法

    题意:给出n个数的非递减序列,进行q次查询.每次查询给出两个数a,b,求出第a个数到第b个数之间数字的最大频数. 如序列:-1 -1 1 1 1 1 2 2 3 第2个数到第5个数之间出现次数最多的是 ...

  5. POJ3368(Frequent values)--线段树

    题目在这里 3368 Accepted 7312K 1829MS C++ 6936B 题意为给你一组数据,再给定一组区间,问你这个区间内出现次数最多的元素的次数是多少. 我还记得这题是学校校赛基础的题 ...

  6. hdu 5700区间交(线段树)

    区间交 Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submiss ...

  7. Snacks HDU 5692 dfs序列+线段树

    Snacks HDU 5692 dfs序列+线段树 题意 百度科技园内有n个零食机,零食机之间通过n−1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的价值. 由于零食被频繁的消耗和补充, ...

  8. HDU 1542 Atlantis(线段树扫描线+离散化求面积的并)

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  9. HDU 4578 - Transformation - [加强版线段树]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4578 Problem Description Yuanfang is puzzled with the ...

随机推荐

  1. some knowledge t

    NSNumber static 看下面例子  gCount可以在Person 文件中使用  在main 中不行 @property()括号中可以填的属性 国际化 OC中的快捷键操作 operation ...

  2. sersync+inotify实时备份数据

    Sersync项目简介与框架 简介 Sersync项目利用inotify与rsync技术实现对服务器数据实时同步的解决方案,其中inotify用于监控sersync所在服务器上文件系统的事件变化,rs ...

  3. Application Loader下载安装和上传IOS app程序

    如果您安装了最新版的XCode开发环境.对于在4.2及以上版本,Developer/Applications/Utilities目录中已经有ApplicationLoader程序,无需执行以下单独安装 ...

  4. 【JQ成长笔记】jQuery cookie的使用

    jquery cookie挺好用的.简单实在.菜鸟都能用得上..额.文笔不好不好..咳咳.. 先来看看jq.cookie的aip 写入cookie $.cookie("this-cookie ...

  5. 在centos7下安装mysql5.7

    wget http://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpmyum localinstall -y mysql57- ...

  6. Windows下载安装jmeter

    一.下载 jmeter下载地址: http://jmeter.apache.org/download_jmeter.cgi Binaries-apache-jmeter-3.0.zip 二.安装 1. ...

  7. MongoDB 从0开始

    MongoDB https://docs.mongodb.org/manual/tutorial/install-mongodb-on-os-x/ 在Mac上安装 brew update brew i ...

  8. FAQ:Python环境变量配置

    Python安装安装成,需要配置环境变量: 默认情况下,在windows下安装python之后,系统并不会自动添加相应的环境变量.此时不能在命令行直接使用python命令. 1. 首先需要在系统中注册 ...

  9. 供应类型与计划分类一致性检查(INV)

    应用 Oracle Inventory 层 Level Function 函数名 Funcgtion Name CUXINVIMM 表单名 Form Name CUXINVIMM 说明 Descrip ...

  10. stack的应用

    STL除了给我们提供了一些容器(container)以外,还给我们提供了几个容器适配器(container adapters),stack便是其中之一 看过STL源码的人都知道,stack其实是内部封 ...