题意O(-1)不用解释。。

线段树结点维护三个信息:区间内相同的数出现最多的次数maxc、区间左边第一个数出现的次数lc、区间右边第一个数出现的次数rc。

分左区间右端点和右区间左端点相同于否的情况合并区间,注意lc或rc为区间长度的情况。

 //#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<sstream>
#include<cmath>
#include<climits>
#include<string>
#include<map>
#include<queue>
#include<vector>
#include<stack>
#include<set>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
#define pb(a) push_back(a)
#define INF 0x1f1f1f1f
#define lson idx<<1,l,mid
#define rson idx<<1|1,mid+1,r
#define PI  3.1415926535898
template<class T> T min(const T& a,const T& b,const T& c){return min(min(a,b),min(a,c));}
template<class T> T max(const T& a,const T& b,const T& c){return max(max(a,b),max(a,c));}
void debug()
{
#ifdef ONLINE_JUDGE
#elsefreopen("d:\\in.txt","r",stdin);freopen("d:\\out1.txt","w",stdout);
#endif
}
char getch()
{char ch;while((ch=getchar())!=EOF){if(ch!=' '&&ch!='\n')return ch;}return EOF;
}
const int maxn=100100;
struct node
{int lc,rc,maxc;node (int a,int b,int c):lc(a),rc(b),maxc(c){}node(){}
}tree[maxn<<2];
int da[maxn];
int PushUp(node &q,node &q1,node &q2,int l,int r)
{int mid=(r+l)>>1;if(da[mid]!=da[mid+1]){q.maxc=max(q1.maxc,q2.maxc);q.lc=q1.lc;q.rc=q2.rc;}else{q.maxc=max(q1.maxc,q2.maxc,q1.rc+q2.lc);q.lc=q1.lc==mid-l+1?q1.lc+q2.lc:q1.lc;q.rc=q2.rc==r-mid?q2.rc+q1.rc:q2.rc;}return 0;
}
int build(int idx,int l,int r)
{if(l==r){tree[idx]=node(1,1,1);return 0;}int mid=(r+l)>>1;build(lson);build(rson);PushUp(tree[idx],tree[idx<<1],tree[idx<<1|1],l,r);return 0;
}node quary(int idx,int l,int r,int tl,int tr)
{if(tl<=l&&tr>=r)return tree[idx];int mid=(r+l)>>1;node q1,q2;node q;if(mid>=tl&&mid<tr){q1=quary(lson,tl,tr);q2=quary(rson,tl,tr);PushUp(q,q1,q2,l,r);}else{if(tl<=mid)q=quary(lson,tl,tr);if(tr>mid)q=quary(rson,tl,tr);}return q;
}
int main()
{int n,q;while(scanf("%d",&n)!=EOF&&n){scanf("%d",&q);for(int i=1;i<=n;i++)scanf("%d",&da[i]);da[0]=INT_MIN;da[n+1]=INT_MAX;build(1,1,n);for(int i=1;i<=q;i++){int a,b;scanf("%d%d",&a,&b);node x=quary(1,1,n,a,b);printf("%d\n",x.maxc);}}return 0;
}

View Code

  

  

转载于:https://www.cnblogs.com/BMan/p/3257042.html

POJ 3368 Frequent values 线段树区间合并相关推荐

  1. poj-3667(线段树区间合并)

    题目链接:传送门 参考文章:传送门 思路:线段树区间合并问题,每次查询到满足线段树的区间最左值,然后更新线段树. #include<iostream> #include<cstdio ...

  2. 树链剖分——线段树区间合并bzoj染色

    线段树区间合并就挺麻烦了,再套个树链就更加鬼畜,不过除了代码量大就没什么其他的了.. 一些细节:线段树每个结点用结构体保存,pushup等合并函数改成返回一个结构体,这样好写一些 struct Seg ...

  3. SPOJ GSS3-Can you answer these queries III-分治+线段树区间合并

    Can you answer these queries III SPOJ - GSS3 这道题和洛谷的小白逛公园一样的题目. 传送门: 洛谷 P4513 小白逛公园-区间最大子段和-分治+线段树区间 ...

  4. Tunnel Warfare(HDU1540+线段树+区间合并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1540 题目: 题意:总共有n个村庄,有q次操作,每次操作分为摧毁一座村庄,修复一座村庄,和查询与询问的 ...

  5. CodeForces - 1539F Strange Array(线段树区间合并)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列,规定位置 iii 的贡献是:设 x=a[i]x=a[i]x=a[i],选择一个包含 iii 的区间 [l,r][l,r][l,r],将其中 ...

  6. 牛客 - 求函数(线段树+区间合并/线段树+矩阵维护)

    题目链接:点击查看 题目大意:现在有 n 个函数,每个函数都是诸如 f( x ) = k * x + b 的形式,只是每个函数的 k 和 b 都是相互独立的,现在给出两个操作: 1 pos k b:将 ...

  7. 2021牛客暑期多校训练营7 xay loves monotonicity 线段树区间合并

    传送门 文章目录 题意: 思路: 题意: 题面挺绕口的,还是看原题比较好. 大概的意思就是让你从给定的区间中选择一个以左端点为起点的一个上升子序列,让后将这些下标存下来,在bbb中将这些位置拿出来后, ...

  8. HDU3308 线段树区间合并

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3308 ,简单的线段树区间合并. 线段树的区间合并:一般是要求求最长连续区间,在PushUp()函数中实 ...

  9. HDU1540(线段树区间合并)

    很经典的一道题,线段树区间合并非常好的一道入门题,每个节点保存区间连续1的最大左串长度,最大右串长度,以及区间最大长度(常规的三种信息维护),更新操作时注意push_up函数,针对不同的问题,push ...

最新文章

  1. gantt markdown
  2. 回溯算法【0-1背包问题】
  3. IOS开发学习记录第2天之熟悉Xcode常用快捷键
  4. 函数的不同的调用方式 函数也是对象 数组的函数调用 apply和call方法的使用
  5. QAdmin轻量级后台HTML模板 1.5
  6. libevent源码深度剖析四
  7. 我的世界服务器名称被占用,为什么我的世界服务器说此用户名已被注册我都换了很多用户了都没用 爱问知识人...
  8. Java 异常丢失及finally子句
  9. js系列教程6-BOM操作全解
  10. 如何查看python的工作目录_Python3基础 os listdir curdir查看当前工作目录的所有文件的名字...
  11. vfp保存为html,建立,生成,运行VFP菜单
  12. 计算机控制实验室装置,自控/计控原理实验箱
  13. GPRS远程开关 2 AIR202模块
  14. 基因组共线性分析~mauve(图文教程)
  15. 一个简单的静态网页制作(html+css)
  16. Bootstrap 导航元素( tab导航)标签页
  17. socket编程(在线自动聊天工具) --Python3
  18. 27计算机表演赛命题,(历史2)27届计算机表演赛命题搜索赛答案
  19. 关于ESM Flag问题
  20. 图像分割实战之基于Hough变换提取图像中的直线

热门文章

  1. 电子科大计算机组成原理ppt,电子科技大学,计算机组成原理3计算机组成原理-3-5-组合逻辑控制方式.ppt...
  2. ikvm Java中异常_使用IKVMC将Java转换为.NET库 – 警告IKVMC0108:...
  3. Java数据结构 利用双栈实现链表操作
  4. 【 MATLAB 】sort ( Sort array elements )
  5. javascript的输入与输出
  6. SQL Server自定义字符串分割函数——Split
  7. 综合技术--maven的基本使用
  8. Angular中ngCookies模块介绍
  9. hdu 4190(二分)
  10. 如何使用Worktile进行敏捷项目开发管理