zoukankan      html  css  js  c++  java
  • 【Tyvj1038】忠诚 线段树

    题目描述

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

    输入

    输入中第一行有两个数m,n表示有m(m< =100000)笔账,n表示有n个问题,n< =100000。 第二行为m个数,分别是账目的钱数 后面n行分别是n个问题,每行有2个数字说明开始结束的账目编号。

    输出

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

    样例输入

    10 3 1 2 3 4 5 6 7 8 9 10 2 7 3 9 1 10

    样例输出

    2 3 1

    代码

     1 #include <cstdio>
     2 #include <cmath>
     3 #include <cstring>
     4 #include <ctime>
     5 #include <iostream>
     6 #include <algorithm>
     7 #include <set>
     8 #include <vector>
     9 #include <queue>
    10 #include <map>
    11 #include <stack>
    12 #define inf 1000000007
    13 #define mod 1000000007
    14 using namespace std;
    15 typedef __int64 ll;
    16 inline ll read()
    17 {
    18     ll x=0,f=1;
    19     char ch=getchar();
    20     while(ch<'0'||ch>'9')
    21     {
    22         if(ch=='-')f=-1;
    23         ch=getchar();
    24     }
    25     while(ch>='0'&&ch<='9')
    26     {
    27         x=x*10+ch-'0';
    28         ch=getchar();
    29     }
    30     return x*f;
    31 }
    32 //*******************************************************************
    33 int n,q;
    34 int a[100100];
    35 struct ss
    36 {
    37     int l,r,mn;
    38 }tr[400001];
    39 void build(int k,int s,int t)
    40 {
    41     tr[k].l=s;
    42     tr[k].r=t;
    43     if(s==t){tr[k].mn=a[s];return;}
    44     int mid=(s+t)>>1;
    45     build(k<<1,s,mid);
    46     build(k<<1|1,mid+1,t);
    47     tr[k].mn=min(tr[k<<1].mn,tr[k<<1|1].mn);
    48 }
    49 int ask(int k,int s,int t)
    50 {
    51     int L=tr[k].l;
    52     int R=tr[k].r;
    53     if(s==L&&R==t) return tr[k].mn;
    54     int mid=(L+R)>>1;
    55     if(t<=mid)return ask(k<<1,s,t);
    56     if(s>mid) return ask(k<<1|1,s,t);
    57     return  min(ask(k<<1,s,mid),ask(k<<1|1,mid+1,t));
    58 }
    59 int main()
    60 {
    61     scanf("%d%d",&n,&q);
    62     for(int i=1;i<=n;i++)
    63     {
    64         scanf("%d",&a[i]);
    65     }
    66     build(1,1,n);
    67     for(int i=1;i<=q;i++)
    68     {
    69         int x,y;
    70         scanf("%d%d",&x,&y);
    71         printf("%d ",ask(1,x,y));
    72 
    73     }
    74     return 0;
    75 }
    View Code
  • 相关阅读:
    004-linux常用命令-文件搜索命令
    004-linux常用命令-权限管理命令
    004-linux常用命令-文件处理命令
    003-linux使用注意事项
    002-linux 基本网络配置
    002-keras简单应用
    001-keras简介
    006-深度学习与NLP简单应用
    论文笔记:(TOG2019)DGCNN : Dynamic Graph CNN for Learning on Point Clouds
    论文笔记:(2019CVPR)PointConv: Deep Convolutional Networks on 3D Point Clouds
  • 原文地址:https://www.cnblogs.com/zxhl/p/4672070.html
Copyright © 2011-2022 走看看