zoukankan      html  css  js  c++  java
  • hiho一下18周 RMQ问题再临

    RMQ问题再临

    时间限制:10000ms
    单点时限:1000ms
    内存限制:256MB

    描述

    终于,小Hi和小Ho踏上了回国的旅程。在飞机上,望着采购来的特产——小Hi陷入了沉思:还记得在上上周他们去超市的时候,前前后后挑了那么多的东西,都幸运的没有任何其他人(售货员/其他顾客)来打搅他们的采购过程。但是如果发生了这样的事情,他们的采购又会变得如何呢?

    于是小Hi便向小Ho提出了这个问题:假设整个货架上从左到右摆放了N种商品,并且依次标号为1到N,每次小Hi都给出一段区间[L, R],小Ho要做的是选出标号在这个区间内的所有商品重量最轻的一种,并且告诉小Hi这个商品的重量。但是在这个过程中,可能会因为其他人的各种行为,对某些位置上的商品的重量产生改变(如更换了其他种类的商品),面对这样一个问题,小Ho又该如何解决呢?

    提示:平衡乃和谐之理

    输入

    每个测试点(输入文件)有且仅有一组测试数据。

    每组测试数据的第1行为一个整数N,意义如前文所述。

    每组测试数据的第2行为N个整数,分别描述每种商品的重量,其中第i个整数表示标号为i的商品的重量weight_i。

    每组测试数据的第3行为一个整数Q,表示小Hi总共询问的次数与商品的重量被更改的次数之和。

    每组测试数据的第N+4~N+Q+3行,每行分别描述一次操作,每行的开头均为一个属于0或1的数字,分别表示该行描述一个询问和描述一次商品的重量的更改两种情况。对于第N+i+3行,如果该行描述一个询问,则接下来为两个整数Li, Ri,表示小Hi询问的一个区间[Li, Ri];如果该行描述一次商品的重量的更改,则接下来为两个整数Pi,Wi,表示位置编号为Pi的商品的重量变更为Wi

    对于100%的数据,满足N<=10^4,Q<=10^4, 1<=Li<=Ri<=N,1<=Pi<=N, 0<weight_i, Wi<=10^4。

    输出

    对于每组测试数据,对于每个小Hi的询问,按照在输入中出现的顺序,各输出一行,表示查询的结果:标号在区间[Li, Ri]中的所有商品中重量最轻的商品的重量。

    样例输入
    10
    618 5122 1923 8934 2518 6024 5406 1020 8291 2647 
    6
    0 3 6
    1 2 2009
    0 2 2
    0 2 10
    1 1 5284
    0 2 5
    样例输出
    1923
    2009
    1020
    1923

    【分析】线段树模板
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    #include <string>
    #include <map>
    #include <stack>
    #include <queue>
    #include <vector>
    #define inf 2e9
    #define met(a,b) memset(a,b,sizeof a)
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    typedef long long ll;
    using namespace std;
    const int N = 1e6+5;
    const int M = 4e5+5;
    int dp[N][21];
    int n,sum[N],m;
    int Tree[N];
    void pushup(int pos){
        Tree[pos]=min(Tree[pos<<1],Tree[pos<<1|1]);
    }
    void build(int l,int r,int pos){
        if(l==r){
            scanf("%d",&Tree[pos]);
            return;
        }
        int mid=(l+r)>>1;
        build(l,mid,pos<<1);
        build(mid+1,r,pos<<1|1);
        pushup(pos);
    }
    void update(int p,int w,int l,int r,int pos){
        if(l==p&&r==p){
            Tree[pos]=w;
            return;
        }
        int mid=(l+r)>>1;
        if(p<=mid) update(p,w,l,mid,pos<<1);
        else update(p,w,mid+1,r,pos<<1|1);
        pushup(pos);
    }
    int query(int L,int R,int l,int r,int pos){
        if(L<=l&&r<=R)return Tree[pos];
        int mid=(l+r)>>1;
        int ans=inf;
        if(L<=mid) ans=min(ans,query(L,R,l,mid,pos<<1));
        if(R>mid) ans=min(ans,query(L,R,mid+1,r,pos<<1|1));
        return ans;
    }
    int main()
    {
        scanf("%d",&n);
        build(1,n,1);
        scanf("%d",&m);
        int sign,l,r;
        while(m--){
            scanf("%d%d%d",&sign,&l,&r);
            if(sign==1) update(l,r,1,n,1);
            else printf("%d
    ",query(l,r,1,n,1));
        }
        return 0;
    }
  • 相关阅读:
    初识python 2.x与3.x 区别
    装饰器
    函数的进阶
    Spring Boot启动问题:Cannot determine embedded database driver class for database type NONE
    22.Spring Cloud Config安全保护
    23.Spring Cloud Bus 无法更新问题(踩坑) Spring cloud config server Could not fetch remote for master remote
    24.Spring Cloud之Spring Cloud Config及Spring Cloud Bus
    Spring Boot整合Spring Data Elasticsearch 踩坑
    项目中Spring Security 整合Spring Session实现记住我功能
    32.再谈SpringBoot文件上传
  • 原文地址:https://www.cnblogs.com/jianrenfang/p/6133616.html
Copyright © 2011-2022 走看看