当前位置: 首页 > news >正文

UVA 11235 Frequent values (RMQ )

询问静态区间最值的Sparse—Table(Tarjan提出)的算法。这个算法的思想是一个dp,dp[i][j]表示i开头长度为2^j的区间内的最值,然后倍增转移。

这道题询问的是出现次数,相同的数字是连续出现的,先把连续出现的数字按段编号,记录出现的次数。

因为题目询问给的是原来的数字的下标,记录一下这个位置对应的编号。对于完整包含在询问区间里的段,可直接套用RMQ,

为了处理不完整的区间,还需要记录段在原来数组中的左右端点。

#include<bits/stdc++.h>
using namespace std;

const int maxn = 1e5+5;

int id[maxn];
int cnt[maxn],l[maxn],r[maxn];
int d[maxn][20];

void RMQ_init(int *A,int n)
{
    for(int i = 0; i < n; i++) d[i][0] = A[i];
    for(int j = 1; (1<<j)<=n; j++){
        int t = (1<<j)-1;
        for(int i = 0; i + t<= n; i++){
            d[i][j] = max(d[i][j-1],d[i+(t>>1)][j-1]);
        }
    }
}

int RMQ(int L,int R)
{
    int k = 0;
    while((1<<(k+1))<=R-L+1) k++;
    return max(d[L][k],d[R-(1<<k)+1][k]);
}

int main()
{
    //freopen("in.txt","r",stdin);
    int n,q;
    while(scanf("%d%d",&n,&q),n){
        int pre; scanf("%d",&pre);
        int id_cnt = 0;
        cnt[0] = 1; l[0] = 0; id[0] = 0;
        for(int i = 1; i < n; i++){
            int cur; scanf("%d",&cur);
            if(cur == pre){
                cnt[id_cnt]++;
            }else {
                r[id_cnt++] = i-1;
                l[id_cnt] = i;
                cnt[id_cnt] = 1;
            }
            id[i] = id_cnt;
            pre = cur;
        }
        r[id_cnt++] = n-1;
        RMQ_init(cnt,id_cnt);
        while(q--){
            int i,j; scanf("%d%d",&i,&j);
            int ans;
            if(id[--j] != id[--i]){
                ans = max(r[id[i]]-i,j-l[id[j]])+1;
                if(id[j]-id[i]>1){
                    ans = max(ans,RMQ(id[i]+1,id[j]-1));
                }
            }else {
                ans = j-i+1;
            }
            printf("%d\n",ans);
        }
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/jerryRey/p/4792378.html

相关文章:

  • [LeetCode]Balanced Binary Tree
  • 导入myeclipse项目出现的问题及解决方案
  • 多线程--多线程断点下载
  • 《代码整洁之道》第十二章:跌进
  • django 1.8 官方文档翻译:5-1-2 表单API
  • iOS--警告收录及科学快速的消除方法
  • java环境变量设置
  • jdk 安装配置
  • jsp中文显示乱码的解决办法
  • 携程App for Apple Watch探索
  • 从头开始敲代码之《从BaseApplication/Activity开始(三)》
  • 前端性能优化(十)
  • 汇编语言HelloWorld
  • n个元素的入栈顺序有多少种出栈顺序?
  • 迅维网
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • 345-反转字符串中的元音字母
  • chrome扩展demo1-小时钟
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • Laravel 菜鸟晋级之路
  • leetcode98. Validate Binary Search Tree
  • Meteor的表单提交:Form
  • orm2 中文文档 3.1 模型属性
  • php中curl和soap方式请求服务超时问题
  • Vue UI框架库开发介绍
  • 从tcpdump抓包看TCP/IP协议
  • 多线程事务回滚
  • 理解在java “”i=i++;”所发生的事情
  • 设计模式(12)迭代器模式(讲解+应用)
  • 使用 @font-face
  • 事件委托的小应用
  • 为什么要用IPython/Jupyter?
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​2020 年大前端技术趋势解读
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #define
  • #mysql 8.0 踩坑日记
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (3)选择元素——(17)练习(Exercises)
  • (六)c52学习之旅-独立按键
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (七)Knockout 创建自定义绑定
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • (转)为C# Windows服务添加安装程序
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • ***检测工具之RKHunter AIDE
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1