http://acm.hdu.edu.cn/showproblem.php?pid=1806

线段树维护区间出现频率最高的出现次数。为了维护上者,需要维护线段前后缀的出现次数,当和其他线段在端点处的字符相等时,要做合并处理。

#include <iostream>
#include <cstdlib>
#include <vector>
#include <string>
#include <cmath>
#include <algorithm>
#include <map>
using namespace std;
int n, m;
const int len = ;
int num[len];
struct node
{
int l, r;
int ll, rr;
int v;
};
node tr[len << ];
void pushUp(int rt)
{
tr[rt].v = max(tr[rt << ].v, tr[rt << | ].v);
if (num[tr[rt << ].r] == num[tr[rt << | ].l])
tr[rt].v = max(tr[rt].v, tr[rt << ].rr + tr[rt << | ].ll);
tr[rt].ll = tr[rt << ].ll;
tr[rt].rr = tr[rt << | ].rr;
if (num[tr[rt].l] == num[tr[rt << | ].l])
tr[rt].ll += tr[rt << | ].ll;
if (num[tr[rt].r] == num[tr[rt << ].r])
tr[rt].rr += tr[rt << ].rr;
}
void build(int l, int r, int rt)
{
tr[rt].l = l;
tr[rt].r = r;
if (l == r)
{
tr[rt].v = ;
tr[rt].ll = tr[rt].rr = ;
return;
}
int mid = (l + r) >> ;
build(l, mid, rt << );
build(mid + , r, rt << |);
pushUp(rt);
}
int query(int l, int r, int rt)
{
if (l <= tr[rt].l&&tr[rt].r <= r)
return tr[rt].v;
int mid = (tr[rt].l + tr[rt].r) >> ;
int lr=-, rr=-;
if (l <= mid)
lr = query(l, r, rt << );
if (r > mid)
rr = query(l, r, rt << | );
int ans = max(lr, rr);
if (lr != - && rr != -&&num[mid]==num[mid+])
{
ans = max(ans, min(tr[rt << ].rr,mid-l+) + min(r-mid,tr[rt << | ].ll));
}
//if (ans == 4) cout << tr[rt].l << ' ' << tr[rt].r<<' '<<lr<<' '<<rr<< endl;
return ans;
}
int main()
{
while (scanf("%d", &n) != EOF)
{
if (n == ) break;
scanf("%d", &m);
for (int i = ; i <= n; i++)
scanf("%d", &num[i]);
build(, n, );
while (m--)
{
int l, r;
scanf("%d%d", &l , &r);
printf("%d\n", query(l, r, ));
}
}
return ;
}

HDOJ-1806 ( Frequent values ) 线段树区间合并的更多相关文章

  1. hdu 1806 Frequent values 线段树

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

  2. POJ 3667 Hotel(线段树 区间合并)

    Hotel 转载自:http://www.cnblogs.com/scau20110726/archive/2013/05/07/3065418.html [题目链接]Hotel [题目类型]线段树 ...

  3. HDU 3911 线段树区间合并、异或取反操作

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=3911 线段树区间合并的题目,解释一下代码中声明数组的作用: m1是区间内连续1的最长长度,m0是区间内连续 ...

  4. HDU 3911 Black And White(线段树区间合并+lazy操作)

    开始以为是水题,结果...... 给你一些只有两种颜色的石头,0为白色,1为黑色. 然后两个操作: 1 l r 将[ l , r ]内的颜色取反 0 l r 计算[ l , r ]内最长连续黑色石头的 ...

  5. HYSBZ 1858 线段树 区间合并

    //Accepted 14560 KB 1532 ms //线段树 区间合并 /* 0 a b 把[a, b]区间内的所有数全变成0 1 a b 把[a, b]区间内的所有数全变成1 2 a b 把[ ...

  6. poj3667 线段树 区间合并

    //Accepted 3728 KB 1079 ms //线段树 区间合并 #include <cstdio> #include <cstring> #include < ...

  7. hdu3911 线段树 区间合并

    //Accepted 3911 750MS 9872K //线段树 区间合并 #include <cstdio> #include <cstring> #include < ...

  8. 线段树(区间合并) POJ 3667 Hotel

    题目传送门 /* 题意:输入 1 a:询问是不是有连续长度为a的空房间,有的话住进最左边 输入 2 a b:将[a,a+b-1]的房间清空 线段树(区间合并):lsum[]统计从左端点起最长连续空房间 ...

  9. HDU 3308 LCIS (线段树区间合并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3308 题目很好懂,就是单点更新,然后求区间的最长上升子序列. 线段树区间合并问题,注意合并的条件是a[ ...

随机推荐

  1. topcoder srm 692 div1 -23

    1.给定一个带权有向图.选出一些边满足使得任意两点可相互到达的前提下使得选出的边的权值的最大最小差值最小. 思路:二分答案,然后枚举权值的范围判断是否可行. #include <stdio.h& ...

  2. 关于二进制——lowbit运算

    lowbit(n)意思即为找出n在二进制表示下最后一位1即其后面的0所组成的数值,别的东西算法书上有,这里提出一个重要的公式 lowbit(n)=n&(~n+1)=n&(-n),这个有 ...

  3. Apache下的ArrayUtils工具类总结

    ArrayUtils中的方法: 1.add():将给定的数据添加到指定的数组中,返回一个新的数组. 2.addAll():合并两个数组. 3.contains():检查该数据在该数组中是否存在,返回一 ...

  4. PyCharm史上最强攻略

    Ctrl + D 复制选定的区域或行 Ctrl + Y 删除选定的行 Ctrl + Alt + L 代码格式化 Ctrl + Alt + O 优化导入(去掉用不到的包导入) Ctrl + 鼠标 简介/ ...

  5. centos 编译lantrn

    github上的安装指导: Custom fork of Go is currently required. We'll eventually switch to Go 1.7 which suppo ...

  6. (zhuan) Recurrent Neural Network

    Recurrent Neural Network 2016年07月01日  Deep learning  Deep learning 字数:24235   this blog from: http:/ ...

  7. postgreSql——时区问题

    timestamptz.timestamp SELECT ts AT TIME ZONE 'UTC' FROM ( VALUES (timestamptz '2012-03-05 17:00:00+0 ...

  8. Linux下清空或删除大文件内容的2种方法

    在Linux终端下处理文件时,有时候我们想要直接清空文件的内容时但又不用使用任何Linux命令行编辑器,去打开这些文件.那如何才能达到这个目的呢? 1.通过重定向到NULL来清空文件内容 清空或者让一 ...

  9. JTopo使用心得

    因为工作关系,最近用到了拓扑图,找了一溜工具后,发现了这个--JTopo,纯国产而且免费 当然了如果你英文水平足够好的话.也可以看看这些英文的做拓扑图的工具,以下网站出自知乎回答:开源HTML5 绘图 ...

  10. Python.错误解决:scrapy 没有crawl 命令

    确保2点: 1.把爬虫.py复制到spiders文件夹里 如执行scrapy crawl demo ,spiders里面就要有demo.py文件 2.在项目文件夹内执行命令 在scrapy.cfg所在 ...