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 ;
}

最新文章

  1. Salesforce学习笔记(一)
  2. Linux收集
  3. Everything
  4. Headfirst设计模式的C++实现——适配器(Adapter)
  5. ubuntu 配置JDK环境变量
  6. POJ 2762 Going from u to v or from v to u? (Tarjan) - from lanshui_Yang
  7. Merge Into 用法
  8. 【python】python的正则表达式 re
  9. python中__name__=='__main__'的作用
  10. 基于Jenkins+Git+Gradle的Android持续集成
  11. 多线程编程 NSOperation
  12. java 如何使的float保留2位或者多位小数 (转载)
  13. Python编写的Linux邮件发送工具
  14. 安装percona-toolkit工具时遇到的问题
  15. 【由浅入深理解java集合】(三)——集合 List
  16. 通过DataTable获得表的主键
  17. BATJ面试必会之 Spring 篇(一)
  18. Unity3D可以查看YAML格式的场景文件,采用Notepad++
  19. 【PHP】组合条件搜索SQL
  20. C# File类常用方法

热门文章

  1. makefile基本操作
  2. 【Spring Security】五、自定义过滤器
  3. hihoCoder week6 01背包
  4. Linux---centos 配置网络
  5. Tomcat服务器环境变量配置及在Eclipse中启动和配置
  6. AngularJS 笔记2
  7. C#中引用第三方ocx控件引发的问题以及解决办法
  8. JAVA读取CSV文件到MySQL数据库中
  9. Centos7:查看某个端口被哪个进程占用
  10. python 获取进程数据