• P1816 忠诚


    题目描述

    老管家是一个聪明能干的人。他为财主工作了整整10年,财主为了让自已账目更加清楚。要求管家每天记k次账,由于管家聪明能干,因而管家总是让财主十分满意。但是由于一些人的挑拨,财主还是对管家产生了怀疑。于是他决定用一种特别的方法来判断管家的忠诚,他把每次的账目按1,2,3…编号,然后不定时的问管家问题,问题是这样的:在a到b号账中最少的一笔是多少?为了让管家没时间作假他总是一次问多个问题。

    输入输出格式

    输入格式:

    输入中第一行有两个数m,n表示有m(m<=100000)笔账,n表示有n个问题,n<=100000。

    第二行为m个数,分别是账目的钱数

    后面n行分别是n个问题,每行有2个数字说明开始结束的账目编号。

    输出格式:

    输出文件中为每个问题的答案。具体查看样例。

    输入输出样例

    输入样例#1:
    10 3
    1 2 3 4 5 6 7 8 9 10
    2 7
    3 9
    1 10
    输出样例#1:
    2 3 1

    注意这题在updata的时候一定要取最小值

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 using namespace std;
     6 const int MAXN=1000001;
     7 int n,m;
     8 struct node
     9 {
    10     int l,r,f,w;
    11 }tree[MAXN<<2];
    12 int read(int &x)
    13 {
    14     int flag=0;
    15     char c=getchar();x=0;
    16     if(c=='-')flag=1;
    17     while(c<'0'||c>'9')c=getchar();
    18     while(c>='0'&&c<='9')x=x*10+c-48,c=getchar();
    19     return flag==1?-x:x;
    20 }
    21 void updata(int k)
    22 {
    23     tree[k].w=min(tree[k<<1].w,tree[k<<1|1].w);
    24 }
    25 void Build_Tree(int ll,int rr,int k)
    26 {
    27     tree[k].l=ll;tree[k].r=rr;
    28     if(tree[k].l==tree[k].r)
    29     {
    30         read(tree[k].w);
    31         return ;
    32     }
    33     int m=(ll+rr)>>1;
    34     Build_Tree(ll,m,k<<1);
    35     Build_Tree(m+1,rr,k<<1|1);
    36     updata(k);
    37 }
    38 int  interval_ask(int ll,int rr,int k)
    39 {
    40     if(ll<=tree[k].l&&rr>=tree[k].r)
    41         return tree[k].w;
    42     int ans=0x7fffff;
    43     //if(tree[k].l==tree[k].r)
    44     //    return tree[k].w<ans?ans=tree[k].w:ans=ans;
    45     int m=(tree[k].l+tree[k].r)>>1;
    46     if(ll<=m)
    47         ans=min(interval_ask(ll,rr,k<<1),ans);
    48     if(rr>=m+1)
    49         ans=min(interval_ask(ll,rr,k<<1|1),ans);
    50     return ans;
    51 }
    52 int main()
    53 {
    54     read(n);read(m);
    55     Build_Tree(1,n,1);
    56     for(int i=1;i<=m;i++)
    57     {
    58         int x,y;
    59         read(x);read(y);
    60         printf("%d ",interval_ask(x,y,1));
    61     }
    62     return 0;
    63 }


  • 相关阅读:
    curl命令使用
    eclipse安装maven3
    【转】轻松搞定面试中的二叉树题目
    【转】轻松搞定面试中的链表题目
    CPP_运算符重载及友元
    CPP_template
    CPP基础
    CPP_封装_继承_多态
    CPP_类默认函数:构造函数,拷贝构造函数,赋值函数和析构函数
    CPP_const&static
  • 原文地址:https://www.cnblogs.com/zwfymqz/p/6841374.html
Copyright © 2020-2023  润新知