zoukankan      html  css  js  c++  java
  • HihoCoder1070 区间最小值(简单线段树)

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

    每组测试数据的第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

    简单RMQ问题,线段树处理,主要是为了训练结构体话,把模板打好方便以后使用。

    #include<cstdio>
    #include<cstdlib>
    #include<iostream>
    #include<cmath>
    using namespace std;
    const int maxn=10010;
    const int inf=1000000000;
    int a[maxn];
    struct Node
    {
         int L,R,Min; 
    };
    struct Tree
    {
         Node node[maxn<<2];
         void build(int now,int l,int r)
         {
              node[now].Min=inf;
              node[now].L=l;
              node[now].R=r;
              if(l==r) return ;
              int Mid=(l+r)>>1;
              build(now<<1,l,Mid);
              build(now<<1|1,Mid+1,r);
         }
         int update(int now)
         {
                node[now].Min=min(node[now<<1].Min,node[now<<1|1].Min);
         }
         void insert(int now,int pos,int val)
         {
             if(node[now].L==node[now].R) 
                  node[now].Min=val;
             else {
                  int Mid=(node[now].L+node[now].R)>>1;
                  if(pos<=Mid) insert(now<<1,pos,val);
                  else insert(now<<1|1,pos,val);
                  update(now);
             }     
         }
         int query(int now,int l,int r)
         {
               if(node[now].L>=l&&node[now].R<=r) return node[now].Min;
               int Mid=(node[now].L+node[now].R)>>1;
               if(r<=Mid) return query(now<<1,l,r);
               else if(l>Mid) return query(now<<1|1,l,r);
               else return min(query(now<<1,l,Mid),query(now<<1|1,Mid+1,r));
         }
    };
    Tree tree;
    int main()
    {
         int i,q,n,x,y,opt;
         scanf("%d",&n);
         tree.build(1,1,n);
         for(i=1;i<=n;i++) {
              scanf("%d",&a[i]);
              tree.insert(1,i,a[i]);
         }
         scanf("%d",&q);
         while(q--){
              scanf("%d%d%d",&opt,&x,&y);
              if(opt==0)  printf("%d
    ",tree.query(1,x,y));
              else  tree.insert(1,x,y);
         }
         return 0;
    }
  • 相关阅读:
    PAT (Advanced Level) Practice 1071 Speech Patterns (25分)
    PAT (Advanced Level) Practice 1070 Mooncake (25分)
    PAT (Advanced Level) Practice 1069 The Black Hole of Numbers (20分)
    PAT (Advanced Level) Practice 1074 Reversing Linked List (25分)
    PAT (Advanced Level) Practice 1073 Scientific Notation (20分)
    第一次冲刺个人总结01
    构建之法阅读笔记01
    人月神话阅读笔记01
    四则运算2
    学习进度条(软件工程概论1-8周)
  • 原文地址:https://www.cnblogs.com/hua-dong/p/7909949.html
Copyright © 2011-2022 走看看