题目链接

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

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

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

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

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

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define pb(x) push_back(x)
 4 #define ll long long
 5 #define mk(x, y) make_pair(x, y)
 6 #define lson l, m, rt<<1
 7 #define mem(a) memset(a, 0, sizeof(a))
 8 #define rson m+1, r, rt<<1|1
 9 #define mem1(a) memset(a, -1, sizeof(a))
10 #define mem2(a) memset(a, 0x3f, sizeof(a))
11 #define rep(i, a, n) for(int i = a; i<n; i++)
12 #define ull unsigned long long
13 typedef pair<int, int> pll;
14 const double PI = acos(-1.0);
15 const double eps = 1e-8;
16 const int mod = 1e9+7;
17 const int inf = 1061109567;
18 const int dir[][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} };
19 const int maxn = 1e5+5;
20 int lnum[maxn<<2], rnum[maxn<<2], maxx[maxn<<2], pre_max[maxn<<2], suf_max[maxn<<2];
21 void pushUp(int rt, int m) {
22     maxx[rt] = max(maxx[rt<<1], maxx[rt<<1|1]);
23     lnum[rt] = lnum[rt<<1];
24     rnum[rt] = rnum[rt<<1|1];
25     suf_max[rt] = suf_max[rt<<1|1];
26     if(suf_max[rt] == (m>>1)&&lnum[rt<<1|1] == rnum[rt<<1])         //如果左区间最右边的数和右区间最左边的数相等
27         suf_max[rt] += suf_max[rt<<1];                              //并且左区间的后缀长度等于这段区间的长度
28     pre_max[rt] = pre_max[rt<<1];
29     if(pre_max[rt] == m-(m>>1) && rnum[rt<<1] == lnum[rt<<1|1])
30         pre_max[rt] += pre_max[rt<<1|1];
31     if(lnum[rt<<1|1] == rnum[rt<<1])
32         maxx[rt] = max(maxx[rt], pre_max[rt<<1|1]+suf_max[rt<<1]);
33 }
34 void build(int l, int r, int rt) {
35     if(l == r) {
36         scanf("%d", &lnum[rt]);
37         rnum[rt] = lnum[rt];
38         maxx[rt] = pre_max[rt] = suf_max[rt] = 1;
39         return ;
40     }
41     int m = l+r>>1;
42     build(lson);
43     build(rson);
44     pushUp(rt, r-l+1);
45 }
46 int query(int L, int R, int l, int r, int rt) {
47     if(L<=l&&R>=r) {
48         return maxx[rt];
49     }
50     int m = l+r>>1;
51     if(R<=m)
52         return query(L, R, lson);
53     if(L>m)
54         return query(L, R, rson);
55     int tmp1 = query(L, m, lson);
56     int tmp2 = query(m+1, R, rson);
57     int tmp3 = 0;
58     if(lnum[rt<<1|1] == rnum[rt<<1])
59         tmp3 = min(pre_max[rt<<1|1], R-m)+min(suf_max[rt<<1], m-L+1);
60     return max(tmp1, max(tmp2, tmp3));
61 }
62 int main()
63 {
64     int n, m;
65     while(cin>>n&&n) {
66         cin>>m;
67         build(1, n, 1);
68         while(m--) {
69             int x, y;
70             scanf("%d%d", &x, &y);
71             printf("%d\n", query(x, y, 1, n, 1));
72         }
73     }
74     return 0;
75 }

转载于:https://www.cnblogs.com/yohaha/p/5067773.html

hdu 1806 Frequent values 线段树相关推荐

  1. POJ 3368 Frequent values 线段树区间合并

    题意O(-1)不用解释.. 线段树结点维护三个信息:区间内相同的数出现最多的次数maxc.区间左边第一个数出现的次数lc.区间右边第一个数出现的次数rc. 分左区间右端点和右区间左端点相同于否的情况合 ...

  2. hdu 3397 Sequence operation(线段树,lazy,区间合并)

    hdu 3397 Sequence operation 线段树lazy和区间合并结合的一个题,相当于几个题集中到一起嘛,分开想就好了 0,1,2操作都要lazy,2的异或操作找到每一只含1或只含0的区 ...

  3. 2016 Multi-University Training Contest 10 [HDU 5861] Road (线段树:区间覆盖+单点最大小)...

    HDU 5861 题意 在n个村庄之间存在n-1段路,令某段路开放一天需要交纳wi的费用,但是每段路只能开放一次,一旦关闭将不再开放.现在给你接下来m天内的计划,在第i天,需要对村庄ai到村庄bi的道 ...

  4. hdu 2871 Memory Control(线段树)

    题目链接:hdu 2871 Memory Control 题目大意:模拟一个内存分配机制. Reset:重置,释放全部空间 New x:申请内存为x的空间,输出左地址 Free x:释放地址x所在的内 ...

  5. HDU 4031 Attack(线段树/树状数组区间更新单点查询+暴力)

    Attack Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others) Total Sub ...

  6. HDU 4262 Juggler (模拟+线段树优化)

    转载请注明出处,谢谢http://blog.csdn.net/acm_cxlove/article/details/7854526       by---cxlove http://acm.hdu.e ...

  7. HDU 5669 Road(线段树建树)(分层图最短路)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5669 [分析]线段树建树+分层图最短路 #include <cstdio> #includ ...

  8. HDU - I Hate It(线段树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754 Time Limit: 9000/3000 MS (Java/Others) Memory Li ...

  9. HDU - 3333 Turing Tree 线段树区间不同值和+详解+思想

    传送门 首先第一次做这种求不同元素和的线段树题,猜想是个裸题.但是题目中有一句话显然给题目降低了很大的难度,就是 想想其实它就是在暗示你这道题你要结合多次询问来处理,也就是所谓的离线,而不是一次一次的 ...

最新文章

  1. BLAST引物或靶点特异性
  2. C#中的var和dynamic
  3. mysql特殊编码_Mysql 字符编码
  4. 工作83:wacch的使用
  5. 排队五小时才能吃上一口的Popeyes,要借阿里云数据中台10年内开足1500家门店
  6. 计算机三四级网络技术,全国计算机等级考试四级网络技术论述题真题3
  7. [2013.9.10]vb.net坑爹的数组
  8. P2P网贷第三方托管模式存在5大缺陷,护法是最大的赢家
  9. Netflow的配置方法
  10. C语言入门-绝对值(abs)
  11. WLAN从入门到精通-1
  12. 网络信息安全 一场没有硝烟的战争
  13. 程序员被PUA的一天有多可怕......35 岁,真的是职场荣枯线吗?
  14. python手势识别控制幻灯片翻页系统_基于Emgu CV 的手势识别实现PPT的控制放映
  15. 条形码录入测试软件,条码管理:商品条码录入
  16. 前端学习笔记 - px,em,rem,%,vw,vh,vm
  17. Java学习路线图,内附完整Java自学视频教程+工具经验
  18. 后级功放机与单声道功放机的功能有哪些区别?
  19. 基于STM32设计智能家居控制系统(OneNet)_2022
  20. 天使玩偶(CDQ分治+最小曼哈顿距离)

热门文章

  1. c++堆栈溢出怎么解决_Windows Kernel Exploit 内核漏洞学习(2)-内核栈溢出
  2. 团队协作之文档管理-ShowDoc本地化安装使用
  3. android api文档中文版_什么骚操作,用Android能写后台服务?
  4. Qt工作笔记-UDP多线程数据处理及发送(简单实例)
  5. Java工作笔记-Map的基本用法
  6. 按英语体育计算机创建透视表,数据透视表和数据透视图概述
  7. python求输入数字的平方、如果平方运算后小于50则退出_Python练习题(三)
  8. 数字图像处理:图像平均/加法_OPT小讲堂 ∣ SciSmart图像增强之二值化
  9. C语言判断某个字符串中 是否存在子字符串
  10. u盘启动pxe安装linux,U盘启动安装centos5.5+centos6.3+PXE网络安装CentOS