P3368-Frequent values【线段树】
正题
链接: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)
然后用类似方法推区间
代码
#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【线段树】相关推荐
- POJ 3368 Frequent values 线段树区间合并
题意O(-1)不用解释.. 线段树结点维护三个信息:区间内相同的数出现最多的次数maxc.区间左边第一个数出现的次数lc.区间右边第一个数出现的次数rc. 分左区间右端点和右区间左端点相同于否的情况合 ...
- hdu 1806 Frequent values 线段树
题目链接 给一个非递减数列, n个数, m个询问, 每个询问给出区间[L, R], 求这个区间里面出现次数最多的数的次数. 非递减数列, 这是最关键的一个条件... 需要保存一个区间最左边的数, 最右 ...
- 【线段树】FREQUENT - Frequent values(luogu-SP1684 / poj 3368)
FREQUENT - Frequent values luogu-SP1684 poj 3368 题目大意: 有一个单调不降序列,让你求出某些区间内的出现次数最多的数出现的次数(有多组数据,以0结尾) ...
- Frequent values【线段树】
Frequent values UVA - 11235 题目传送门 题目大意:给出一个非降序的整数数组a1,a2,a3...an,你的任务是对一系列的询问(i,j),回答ai,ai+1,ai+2... ...
- 洛谷[P3374] [P3368]树状数组(线段树解法)
最近学习了线段树,不会树状数组,用线段树舔着脸来做一下 P3374树状数组1https://www.luogu.com.cn/problem/P3374 ac代码 #include<bits/s ...
- 线段树练习——区间合并
这类题目会询问区间中满足条件的连续最长区间,所以PushUp的时候需要对左右儿子的区间进行合并(这里最难理解) hdu 3308 http://acm.hdu.edu.cn/showproblem.p ...
- 【POJ】2828 Buy Tickets(线段树+特殊的技巧/splay)
http://poj.org/problem?id=2828 一开始敲了个splay,直接模拟. tle了.. 常数太大.. 好吧,说是用线段树.. 而且思想很拽.. (貌似很久以前写过貌似的,,) ...
- 【HDU 1542】Atlantis 矩形面积并(线段树,扫描法)
[题目] Atlantis Problem Description There are several ancient Greek texts that contain descriptions of ...
- poj2823 线段树模板题 点修改(也可以用单调队列)
这道题吧 没计算时间 因为给了那么多 一算还可以 就直接写了线段树,刘汝佳那本模板 然后!poj的g++比C++慢大约500ms.......g++tle,C++就过了 Sliding Window ...
最新文章
- 前缀、中缀、后缀表达式及其相互转化的Java实现
- 两个Java项目之间的通信_两个容器之间的Docker通信与Java
- 行政区村界线_工作动态 | 龟山镇召开村级行政区域界线勘定工作暨民政业务培训会议...
- toj 4610 Biggest Number
- Linux学习总结(4)——Centos6.5使用yum安装mysql——快速上手必备
- BIM工程信息管理系统-详细设计
- SQL Server数据挖掘简介
- 丰富的else语句及简洁的with语句 - 零基础入门学习Python034
- vue2强制刷新,解决页面不会重新渲染的问题
- C++编程语言中接收用户输入参数的方法
- Codeforces 385C 线性筛素数
- 掌握STC单片机程序烧录方法只需要三步走
- 微信支付解决多商户平台收款
- Excel如何分组排序
- 阿里云ecs概念介绍
- 推荐一款备忘录便签APP简约款安卓版本
- php5.6解密软件,php解密:php5.4 zend解密核心代码分享
- ipad分屏大小怎么调整_ipad软件应用推荐——学习笔记篇
- java utf8 简繁转换 类库,java 中文繁简体转换工具 opencc4j
- Authorware自制拼图游戏
热门文章
- php分目录存放session,phpsession实现多级目录存放实现代码,phpsession_PHP教程
- 在安卓上安装java_如何在Android上安装JavaCV并使用FrameGrabber
- android手机拍摄权限,react-native 手机拍照权限
- mysql 拷贝安装_Mysql的安装和主从复制
- 在oracle中游标的操作,Oracle中的游标和函数详解
- 算法题目——被围绕的区域(dfs,bfs)
- Java当中 报错 没有有任何类型 的外层实例可访问
- [JavaWeb-JavaScript]JavaScript流程控制语句
- [C++11]常量表达式函数
- AcWing 503. 借教室