• 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 }


  • 相关阅读:
    基于redis的分布式锁实现方案
    nginx 配置文件详解
    Linux 下安装Nginx
    Nginx简介
    Spring Boot 整合 Spring Security 示例实现前后分离权限注解 + JWT 登录认证
    idea2020.1版本下载安装与激活
    Cloud Alibaba --Nacos
    spring Cloud Alibaba 简介
    Eclipse中SVN更改连接用户
    Win7(64bit)搭建SVN
  • 原文地址:https://www.cnblogs.com/zwfymqz/p/6841374.html
Copyright © 2020-2023  润新知