POJ 3368 区间数字出现最多次数
2014-03-28 14:31
351 查看
因为序列是不减的,所以应该是 233333 这样的序列,我们可以从下面二分的序列得到我们想要的序列,所以可以用线段树来做,普通的区间合并。
分类是 RMQ。。一会再写的 RMQ 版本的。。
分类是 RMQ。。一会再写的 RMQ 版本的。。
#include <stdio.h> #include <iostream> #include <queue> #include <algorithm> #include <map> #include <vector> #include <cmath> #include <string.h> #include <stdlib.h> #include <time.h> #include <fstream> #include <set> #include <stack> #include <list> using namespace std; #define READ freopen("acm.in","r",stdin) #define WRITE freopen("acm.out","w",stdout) #define ll long long #define ull unsigned long long #define uint unsigned int #define PII pair<int,int> #define PDD pair<double,double> #define fst first #define sec second #define MS(x,d) memset(x,d,sizeof(x)) #define INF 0x3f3f3f3f #define ALL(x) x.begin(),x.end() #define PB push_back #define MOD 99991 #define MAX 111111 struct node { int l,fl; int r,fr; int m,fm; }data[MAX<<2]; int num[MAX]; void PushUp(node &l,node &r,node &ans) { ans.l=l.l; ans.fl=l.l==r.l?l.fl+r.fl:l.fl; ans.r=r.r; ans.fr=r.r==l.r?l.fr+r.fr:r.fr; ans.m=l.fm>r.fm?l.m:r.m; ans.fm=max(l.fm,r.fm); if(l.r==r.l) { int tf=l.fr+r.fl; if(tf>ans.fm) ans.fm=tf,ans.m=l.r; } } void build(int l,int r,int rt) { if(l==r) { data[rt]=(node){num[l],1,num[l],1,num[l],1}; return ; } int m=(l+r)>>1; build(l,m,rt<<1); build(m+1,r,rt<<1|1); PushUp(data[rt<<1],data[rt<<1|1],data[rt]); } node query(int L,int R,int l,int r,int rt) { if(r<L||R<l) { node a; return a; } //printf("L %d R %d l %d r %d\n",L,R,l,r); if(L<=l&&r<=R) return data[rt]; int m=(l+r)>>1; node v1=query(L,R,l,m,rt<<1); node v2=query(L,R,m+1,r,rt<<1|1); if(m<L) return v2; if(R<=m) return v1; node v3; PushUp(v1,v2,v3); return v3; } int main() { //READ; int n,q; while(scanf("%d",&n)&&n) { if(!n) return 0; scanf("%d",&q); for(int i=1;i<=n;i++) scanf("%d",&num[i]); build(1,n,1); for(int i=1;i<=q;i++) { int l,r; scanf("%d%d",&l,&r); node ans=query(l,r,1,n,1); //cout<<ans.m<<endl; printf("%d\n",ans.fm); } } return 0; }
相关文章推荐
- POJ 3368 Frequent values(RMQ 区间出现频率最多数字次数)
- POJ 3368 Frequent values(RMQ 求区间出现最多次数的数字的次数)
- POJ 3368 Frequent values(RMQ 求区间出现最多次数的数字的次数)
- poj 3368 统计区间出现次数最多数个数 RMQ
- poj 3368 RMQ(查询给定区间内频率最多的数字数量)
- 【POJ 3368】【RMQ 或者 线段树】Frequent values【求出区间内连续出现次数最多的数的次数。】
- (Realx 数论1.28)POJ 2282 The Counting Problem(区间统计数字:统计a、b之间各个数字(0~9)出现的次数)
- 统计区间[a,b]各个数字出现的个数:poj 2282 The Counting Problem poj 3286
- POJ 3368 线段树,给定区间求连续不降序列的在该区间内出现最多的数
- 区间离散化+线段树区间求最值poj 3368 Frequent values
- 计算数值区间内某个数字出现的次数
- POJ 3368—— Frequent values(频繁出现的数值UVA11235) RMQ
- 十进制整数区间[1, N]中数字1出现的个数
- noip2010 数字统计 (统计某一数字区间中,2出现的次数)
- 计算数值区间内某个数字出现的次数
- poj 3368 Frequent values(区间合并)
- 求一个区间[a,b]中数字1出现的次数
- 计算在区间 1 到 n 的所有整数中,数字 x(0 ≤ x ≤ 9)共出现了多少次?
- 计算数值区间内某个数字出现的次数(使用函数)
- POJ 3368 Frequent values(RMQ/线段树区间合并)