正题

链接:http://poj.org/problem?id=3368


大意

给出一个不下降序列,求一个区域内最多相同的数的出现次数。


解题思路

线段树
用left表示左边的连续个数,right表示右边的连续个数,maxs表示最长的连续个数,然后比较。

如果左边的所有数都等于右边最左的数则:
tree[k].left=tree[k∗2].right+tree[k∗2+1].lefttree[k].left=tree[k∗2].right+tree[k∗2+1].lefttree[k].left=tree[k*2].right+tree[k*2+1].left

如果右边的所有数都等于左边最右的数则:
tree[k].right=tree[k∗2].right+tree[k∗2+1].lefttree[k].right=tree[k∗2].right+tree[k∗2+1].lefttree[k].right=tree[k*2].right+tree[k*2+1].left

如果左边最右边的数等于右边最左边的数则最优解在中间:

tree[k].maxs=max(tree[k∗2].maxs,tree[k∗2+1].maxs,tree[k∗2].right+tree[k∗2+1].left)tree[k].maxs=max(tree[k∗2].maxs,tree[k∗2+1].maxs,tree[k∗2].right+tree[k∗2+1].left)

tree[k].maxs=max(tree[k*2].maxs,tree[k*2+1].maxs,tree[k*2].right+tree[k*2+1].left)

然后用类似方法推区间


代码

#include<cstdio>
#include<iostream>
using namespace std;
struct treenode{int l,r,maxs,left,right;
}tree[400001];
int n,m,x,y,num[100001];
char c;
void build(int k,int a,int b)//建树
{tree[k].l=a;tree[k].r=b;if (a==b) {tree[k].left=1;tree[k].right=1;tree[k].maxs=1;return;}int wz=(a+b)/2;build(k*2,a,wz);build(k*2+1,wz+1,b);if (tree[k*2].left==wz-a+1&&num[wz]==num[wz+1]) tree[k].left=tree[k*2].right+tree[k*2+1].left;elsetree[k].left=tree[k*2].left;if (tree[k*2+1].right==b-wz&&num[wz]==num[wz+1]) tree[k].right=tree[k*2].right+tree[k*2+1].left;elsetree[k].right=tree[k*2+1].right;if (num[wz]==num[wz+1]) tree[k].maxs=max(max(tree[k*2].maxs,tree[k*2+1].maxs),tree[k*2].right+tree[k*2+1].left);elsetree[k].maxs=max(tree[k*2].maxs,tree[k*2+1].maxs);
//统计
}
int find(int k,int a,int b)
{if (tree[k].l>b||tree[k].r<a||tree[k].r<tree[k].l) return 0;if (tree[k].r<=b && tree[k].l>=a) return tree[k].maxs;int wz=(tree[k].r+tree[k].l)/2,m=1,m1=1,m2=1;if (num[wz]==num[wz+1])m=min(wz-a+1,tree[k*2].right)+min(b-wz,tree[k*2+1].left);//中间最优解if (a<=wz)m1=find(k*2,a,b);//左边最优解if (b>wz)m2=find(k*2+1,a,b);//右边最优解m=max(m,max(m1,m2));//全部的最优解return m;
}
int main()
{while(scanf("%d",&n)){if (n==0) break;scanf("%d",&m);for (int i=1;i<=n;i++)scanf("%d",&num[i]);memset(tree,0,sizeof(tree));build(1,1,n);for (int i=1;i<=m;i++){scanf("%d%d",&x,&y);printf("%d\n",find(1,x,y));}}
}

P3368-Frequent values【线段树】相关推荐

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

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

  2. hdu 1806 Frequent values 线段树

    题目链接 给一个非递减数列, n个数, m个询问, 每个询问给出区间[L, R], 求这个区间里面出现次数最多的数的次数. 非递减数列, 这是最关键的一个条件... 需要保存一个区间最左边的数, 最右 ...

  3. 【线段树】FREQUENT - Frequent values(luogu-SP1684 / poj 3368)

    FREQUENT - Frequent values luogu-SP1684 poj 3368 题目大意: 有一个单调不降序列,让你求出某些区间内的出现次数最多的数出现的次数(有多组数据,以0结尾) ...

  4. Frequent values【线段树】

    Frequent values UVA - 11235 题目传送门 题目大意:给出一个非降序的整数数组a1,a2,a3...an,你的任务是对一系列的询问(i,j),回答ai,ai+1,ai+2... ...

  5. 洛谷[P3374] [P3368]树状数组(线段树解法)

    最近学习了线段树,不会树状数组,用线段树舔着脸来做一下 P3374树状数组1https://www.luogu.com.cn/problem/P3374 ac代码 #include<bits/s ...

  6. 线段树练习——区间合并

    这类题目会询问区间中满足条件的连续最长区间,所以PushUp的时候需要对左右儿子的区间进行合并(这里最难理解) hdu 3308 http://acm.hdu.edu.cn/showproblem.p ...

  7. 【POJ】2828 Buy Tickets(线段树+特殊的技巧/splay)

    http://poj.org/problem?id=2828 一开始敲了个splay,直接模拟. tle了.. 常数太大.. 好吧,说是用线段树.. 而且思想很拽.. (貌似很久以前写过貌似的,,) ...

  8. 【HDU 1542】Atlantis 矩形面积并(线段树,扫描法)

    [题目] Atlantis Problem Description There are several ancient Greek texts that contain descriptions of ...

  9. poj2823 线段树模板题 点修改(也可以用单调队列)

    这道题吧 没计算时间 因为给了那么多 一算还可以 就直接写了线段树,刘汝佳那本模板 然后!poj的g++比C++慢大约500ms.......g++tle,C++就过了 Sliding Window ...

最新文章

  1. 前缀、中缀、后缀表达式及其相互转化的Java实现
  2. 两个Java项目之间的通信_两个容器之间的Docker通信与Java
  3. 行政区村界线_工作动态 | 龟山镇召开村级行政区域界线勘定工作暨民政业务培训会议...
  4. toj 4610 Biggest Number
  5. Linux学习总结(4)——Centos6.5使用yum安装mysql——快速上手必备
  6. BIM工程信息管理系统-详细设计
  7. SQL Server数据挖掘简介
  8. 丰富的else语句及简洁的with语句 - 零基础入门学习Python034
  9. vue2强制刷新,解决页面不会重新渲染的问题
  10. C++编程语言中接收用户输入参数的方法
  11. Codeforces 385C 线性筛素数
  12. 掌握STC单片机程序烧录方法只需要三步走
  13. 微信支付解决多商户平台收款
  14. Excel如何分组排序
  15. 阿里云ecs概念介绍
  16. 推荐一款备忘录便签APP简约款安卓版本
  17. php5.6解密软件,php解密:php5.4 zend解密核心代码分享
  18. ipad分屏大小怎么调整_ipad软件应用推荐——学习笔记篇
  19. java utf8 简繁转换 类库,java 中文繁简体转换工具 opencc4j
  20. Authorware自制拼图游戏

热门文章

  1. php分目录存放session,phpsession实现多级目录存放实现代码,phpsession_PHP教程
  2. 在安卓上安装java_如何在Android上安装JavaCV并使用FrameGrabber
  3. android手机拍摄权限,react-native 手机拍照权限
  4. mysql 拷贝安装_Mysql的安装和主从复制
  5. 在oracle中游标的操作,Oracle中的游标和函数详解
  6. 算法题目——被围绕的区域(dfs,bfs)
  7. Java当中 报错 没有有任何类型 的外层实例可访问
  8. [JavaWeb-JavaScript]JavaScript流程控制语句
  9. [C++11]常量表达式函数
  10. AcWing 503. 借教室