士兵杀敌(三)

时间限制:2000 ms  |  内存限制:65535 KB
难度:5
描述

南将军统率着N个士兵,士兵分别编号为1~N,南将军经常爱拿某一段编号内杀敌数最高的人与杀敌数最低的人进行比较,计算出两个人的杀敌数差值,用这种方法一方面能鼓舞杀敌数高的人,另一方面也算是批评杀敌数低的人,起到了很好的效果。

所以,南将军经常问军师小工第i号士兵到第j号士兵中,杀敌数最高的人与杀敌数最低的人之间军功差值是多少。

现在,请你写一个程序,帮小工回答南将军每次的询问吧。

注意,南将军可能询问很多次。

输入
只有一组测试数据
第一行是两个整数N,Q,其中N表示士兵的总数。Q表示南将军询问的次数。(1<N<=100000,1<Q<=1000000)
随后的一行有N个整数Vi(0<=Vi<100000000),分别表示每个人的杀敌数。
再之后的Q行,每行有两个正正数m,n,表示南将军询问的是第m号士兵到第n号士兵。
输出
对于每次询问,输出第m号士兵到第n号士兵之间所有士兵杀敌数的最大值与最小值的差。
样例输入
5 2
1 2 6 9 3
1 2
2 4
样例输出
1
7
题解:线段树;还可以用RMQ算法,感觉挺复杂,也没看。。。还有宏定义最好大写。。。。。 思路:线段树叶子节点存两个值:最大和最小值
#include <iostream>
#include <iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include <stdio.h>
#include <string.h>
#define rep(i , n) for(int i = 0 ; i < (n) ; i++)
using namespace std;
const int N = ;
const int INF=0x3f3f3f3f;
long long ans = , flag = ;
long long a[] , sum1[] , sum2[];
long long max1 = -INF , min1 = INF;
struct Node{
long long l , r , mi , ma ;
}tree[N*]; void build(long long l , long long r , int root)
{
tree[root].l = l , tree[root].r = r ;
if(l == r)
{
scanf("%lld" ,&tree[root].mi);
tree[root].ma = tree[root].mi ;
return ;
}
long long mid = (l + r) >> ;
if(l <= mid)
build(l , mid , root*);
if(r > mid)
build(mid+ , r , root*+);
tree[root].mi = min(tree[root*].mi , tree[root*+].mi);
tree[root].ma = max(tree[root*].ma , tree[root*+].ma);
cout << tree[root].ma << " " << tree[root].mi << endl ;
} void query(long long l , long long r , int root)
{
if(tree[root].l >= l && tree[root].r <= r)
{
cout << tree[root].ma <<" " << tree[root].mi <<endl ;
max1 = max(max1 , tree[root].ma) ;
min1 = min(min1 , tree[root].mi) ;
return ;
}
long long mid = (tree[root].l + tree[root].r) >> ;
if(l <= mid)
query(l , r , root*);
if(r > mid)
query(l , r, root*+);
} int main()
{ int n , q ;
while(~scanf("%d%d" , &n , &q))
{
build( , n , );
for(int i = ; i < q ; i++)
{
long long l , r ;
scanf("%lld%lld" , &l ,&r);
query(l , r , );
cout << max1 - min1 << endl ;
max1 = -INF , min1 = INF ; // 不能赋值为零噢。
}
} return ;
}

RMQ(算法)st表排序

https://blog.csdn.net/niushuai666/article/details/6624672

#include <iostream>
#include <iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include <stdio.h>
#include <math.h>
#include <string.h>
#define rep(i , n) for(int i = 0 ; i < (n) ; i++)
using namespace std;
const int N = ;
const int INF=0x3f3f3f3f;
long long ans = , flag = ;
long long max1 = -INF , min1 = INF;
int a[N] , dpa[N][N] , dpb[N][N];
int n , q ;

void RMQ()
{
for(int j = ; j < ; j++)
{
for(int i = ; i <= n ; i++)
{
if(i + ( << j) - <= n)
{
dpa[i][j] = max(dpa[i][j-] , dpa[i + ( << j - )][j-]);//状态转移方程
dpb[i][j] = min(dpb[i][j-] , dpb[i+ ( << j - )][j-]); } }
}
} int main()
{ while(~scanf("%d%d" , &n , &q))
{
for(int i = ; i <= n ; i++)
{
scanf("%d" , &a[i]);
dpa[i][] = dpb[i][] = a[i];//赋初值
}
RMQ(); for(int i = ; i < q ; i++)
{
long long l , r ;
scanf("%lld%lld" , &l ,&r);
int k = (int)(log(r - l + ) / log(2.0)) ;
int max1 = max(dpa[l][k] , dpa[r-( << k) + ][k]);//查表
int min1 = min(dpb[l][k] , dpb[r -( << k) + ][k]);
printf("%d\n" , max1 - min1);
}
} return ;
}

线段树(two value)与树状数组(RMQ算法st表)的更多相关文章

  1. BZOJ_1012_[JSOI2008]_最大数maxnumber_(线段树/树状数组+RMQ)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1012 两种操作: 1.求序列末尾n个数中的最大值. 2.在序列末尾插入一个数. 分析 线段树求 ...

  2. 【BZOJ】1012: [JSOI2008]最大数maxnumber(树状数组+rmq)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1012 树状数组原来我只懂得sum和add的操作,今天才知道可以有求区间最值的操作,我学习了一下写了个 ...

  3. Codeforces 803G Periodic RMQ Problem ST表+动态开节点线段树

    思路: (我也不知道这是不是正解) ST表预处理出来原数列的两点之间的min 再搞一个动态开节点线段树 节点记录ans 和标记 lazy=-1 当前节点的ans可用  lazy=0 没被覆盖过 els ...

  4. 线段树:CDOJ1591-An easy problem A (RMQ算法和最简单的线段树模板)

    An easy problem A Time Limit: 1000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Pr ...

  5. BZOJ4199 [Noi2015]品酒大会 【后缀数组 + 单调栈 + ST表】

    题目 一年一度的"幻影阁夏日品酒大会"隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发"首席品 酒家"和"首席猎手"两个奖项,吸 ...

  6. [BZOJ3277/BZOJ3473] 串 - 后缀数组,二分,双指针,ST表,均摊分析

    [BZOJ3277] 串 Description 现在给定你n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串(注意包括本身). Solution 首先将所有串连 ...

  7. bzoj3277 串 (后缀数组+二分答案+ST表)

    常见操作:先把所有串都连到一起,但中间加上一个特殊的符号(不能在原串中/出现过)作为分割 由于全部的子串就等于所有后缀的所有前缀,那我们对于每一个后缀,去求一个最长的前缀,来满足这个前缀在至少K个原串 ...

  8. BZOJ3879:SvT(后缀数组,单调栈,ST表)

    Description (我并不想告诉你题目名字是什么鬼) 有一个长度为n的仅包含小写字母的字符串S,下标范围为[1,n]. 现在有若干组询问,对于每一个询问,我们给出若干个后缀(以其在S中出现的起始 ...

  9. POJ 3321 Apple Tree 【树状数组+建树】

    题目链接:http://poj.org/problem?id=3321 Apple Tree Time Limit: 2000MS Memory Limit: 65536K Total Submiss ...

随机推荐

  1. 2018-11-26-win10-UWP-Controls-by-function

    title author date CreateTime categories win10 UWP Controls by function lindexi 2018-11-26 20:0:6 +08 ...

  2. Maya2017下载安装与激活

    目录 1. 更多推荐 2. 下载地址 2.1. OneDrive 2.2. 百度云 3. 安装激活步骤 1. 更多推荐 其他Maya版本的下载与激活:https://www.cnblogs.com/c ...

  3. python面向对象--类和实例的认识

    '''1.数据属性 2.函数属性''' #创建一个类class Chinese: "这是一个中国人的类" #类属性 money=4000 #注意类和对象均用点来访问自己的属性 de ...

  4. $_POST 和 php://input 的区别

    手册中摘取的几句话: 当 HTTP POST 请求的 Content-Type 是 application/x-www-form-urlencoded 或 multipart/form-data 时, ...

  5. Linux下git安装配置

    一.Linux下git安装配置 2013-07-28 20:32:10|  分类: 默认分类 |  标签:linux  git  server  |举报|字号 订阅     http://abomby ...

  6. windows 安装 mysql 5.6

    从官方网站下载安装包:mysql-5.6.33-winx64.zip,解压到d:\java,然后将解压后的bin目录加入系统环境变量Path中,进入mysql根目录,编辑my-default.ini, ...

  7. AOP 和 IOC

    IOC :  控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度.其中最常见的方式叫做依赖注入(Dependency ...

  8. LeetCode--051--N皇后(java)-star

    n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 上图为 8 皇后问题的一种解法. 给定一个整数 n,返回所有不同的 n 皇后问题的解决方案. 每一种解 ...

  9. Proto3语法翻译

    本文主要对proto3语法翻译.参考网址:https://developers.google.com/protocol-buffers/docs/proto3 defining a message t ...

  10. 用jquery实现图片轮播

    用jquery简单实现图片轮播效果,代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta ...