Java教程

洛谷 P1816 忠诚 题解

本文主要是介绍洛谷 P1816 忠诚 题解,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

题目描述

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

输入格式

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

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

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

输出格式

在一行中输出每个问题的答案,以一个空格分割。

AC代码

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 int n,m;
 5 int f[100100][50];
 6 int l,r;
 7 
 8 int main()
 9 {
10     scanf("%d%d",&n,&m);
11     for (int i=1;i<=n;i++)
12         scanf("%d",&f[i][0]);
13     for (int j=1;(1<<j)<=n;j++)
14         for (int i=1;i+(1<<j)-1<=n;i++)
15             f[i][j]=min(f[i][j-1],f[i+(1<<(j-1))][j-1]);
16 
17     while (m--)
18     {
19         scanf("%d%d",&l,&r);
20         int k=log2(r-l+1);
21         int sum=min(f[l][k],f[r-(1<<k)+1][k]);
22         printf("%d ",sum);
23     }
24     return 0;
25 }

 

这篇关于洛谷 P1816 忠诚 题解的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!