zoukankan      html  css  js  c++  java
  • 1042-区间最值

    描述

    给定一个长度不超过10000的整数序列,对这个序列有不超过500000个询问,每次询问给定区间的最小值。

    输入

    第一行一个整数N(N<=10000)
    第二行N个整数
    第三行一个整数Q
    以下共Q行,每行两个整数i,j用空格隔开,询问第i号元素到第第j号元素之间的最小值

    输出

    每个询问输出一行,包含一个整数,为询问区间的最小值

    样例输入

    5
    1 2 3 4 5
    2
    1 5
    3 4

    样例输入

    1
    3

      1 #include"stdafx.h"
      2 #include<iostream>
      3 using namespace std;
      4 
      5 #define N 10001
      6 #define MAX 50001
      7 
      8 int min(int a,int b)
      9 {
     10     return a<b?(a):(b);
     11 }
     12 
     13 struct Node
     14 {
     15     int left;
     16     int right;
     17     int key;
     18     Node* leftchild;
     19     Node* rightchild;
     20 };
     21 
     22 struct Node* BuildTree(int a,int b)
     23 {
     24     struct Node *root=new struct Node;
     25     root->left=a;
     26     root->right=b;
     27     if(a==b)
     28     {   
     29         root->key=0x7FFFFFFF;
     30         root->leftchild=NULL;
     31         root->rightchild=NULL;
     32     }
     33     else
     34     {
     35         int middle=(a+b)>>1;
     36         root->leftchild=BuildTree(a,middle);
     37         root->rightchild=BuildTree(middle+1,b);
     38     }
     39     return root;
     40 }
     41 
     42 void Insert(struct Node* root,int a,int b,int data)
     43 {
     44     int middle=(root->left+root->right)>>1;
     45     if(a<=root->left&&b>=root->right)
     46     {
     47         root->key=data;
     48         return;
     49     }
     50     if(a<=middle&&root->leftchild)
     51     {
     52         Insert(root->leftchild,a,b,data);
     53     }
     54     if(b>middle&&root->rightchild)
     55     {
     56         Insert(root->rightchild,a,b,data);
     57     }
     58     root->key=min(root->leftchild->key,root->rightchild->key);
     59 }
     60 
     61 int Search(struct Node* root,int a,int b)
     62 {
     63     int middle=(root->left+root->right)>>1;
     64     int temp;
     65     int key1=0x7FFFFFFF;
     66     int key2=0x7FFFFFFF;
     67     if(a<=root->left&&b>=root->right)
     68     {
     69         return root->key;
     70     }
     71     if(a<=middle)
     72     {
     73         temp=Search(root->leftchild,a,b);
     74         if(key1>temp)
     75             key1=temp;
     76     }
     77     if(b>middle)
     78     {
     79         temp=Search(root->rightchild,a,b);
     80         if(key2>temp)
     81             key2=temp;
     82     }
     83     return min(key1,key2);
     84 }
     85 
     86 int main()
     87 {
     88     int temp=0x7FFFFFFF;
     89     int n,q,i,j;
     90     cin>>n;
     91     struct Node* tree;
     92     tree=BuildTree(0,n-1);
     93     for(i=0;i<n;i++)
     94     {
     95         int temp;
     96         cin>>temp;
     97         Insert(tree,i,i,temp);
     98     }
     99     cin>>q;
    100     while(q--)
    101     {
    102         cin>>i>>j;
    103         cout<<Search(tree,i-1,j-1)<<endl;
    104     }
    105     return 0;
    106 }
  • 相关阅读:
    20175226 2018-2019-2 《Java程序设计》第二周学习总结
    存储管理-页面置换算法(页面淘汰算法)
    存储管理-存储组织
    进程管理-死锁问题
    操作系统-进程管理
    操作系统:进程管理、存储管理、文件管理、作业管理、设备管理
    第十一章 集合框架
    匿名内部类
    第10章 java常用类
    第8章 反射
  • 原文地址:https://www.cnblogs.com/Rosanna/p/3341261.html
Copyright © 2011-2022 走看看