nyoj 119 士兵杀敌(三)
2016-05-07 09:27
218 查看
描述
南将军统率着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号士兵之间所有士兵杀敌数的最大值与最小值的差。
样例输入
样例输出
简单的rmq就能解决
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
#define max_n 100030
int nmax[max_n][20];
int nmin[max_n][20];
int n;
void rmq()
{
int i, j;
for (j = 1; (1 << j) <= n; j++)
for (i = 0; i + (1 << j) - 1 < n; i++)
{
nmax[i][j] = max(nmax[i][j - 1], nmax[i + (1 << (j - 1))][j - 1]);
nmin[i][j] = min(nmin[i][j - 1], nmin[i + (1 << (j - 1))][j - 1]);
}
}
int search(int a, int b)
{
int j = (int)log2(b - a + 1.0);
return max(nmax[a][j], nmax[b - (1 << j) + 1][j]) - min(nmin[a][j], nmin[b - (1 << j) + 1][j]);
}
int main()
{
int m;
int i;
scanf("%d%d",&n,&m);
for (i = 0; i < n; i++)
{
scanf("%d",&nmax[i][0]);
nmin[i][0] = nmax[i][0];
}
rmq();
while (m--)
{
int a, b;
scanf("%d%d",&a,&b);
printf("%d\n",search(a - 1, b - 1));
}
}
南将军统率着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 <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
#define max_n 100030
int nmax[max_n][20];
int nmin[max_n][20];
int n;
void rmq()
{
int i, j;
for (j = 1; (1 << j) <= n; j++)
for (i = 0; i + (1 << j) - 1 < n; i++)
{
nmax[i][j] = max(nmax[i][j - 1], nmax[i + (1 << (j - 1))][j - 1]);
nmin[i][j] = min(nmin[i][j - 1], nmin[i + (1 << (j - 1))][j - 1]);
}
}
int search(int a, int b)
{
int j = (int)log2(b - a + 1.0);
return max(nmax[a][j], nmax[b - (1 << j) + 1][j]) - min(nmin[a][j], nmin[b - (1 << j) + 1][j]);
}
int main()
{
int m;
int i;
scanf("%d%d",&n,&m);
for (i = 0; i < n; i++)
{
scanf("%d",&nmax[i][0]);
nmin[i][0] = nmax[i][0];
}
rmq();
while (m--)
{
int a, b;
scanf("%d%d",&a,&b);
printf("%d\n",search(a - 1, b - 1));
}
}
相关文章推荐
- 通过 poj3368 问题讨论:RMQ问题的 tarjan_lca 求解
- POJ3264-Balanced Lineup RMQ
- [BZOJ2006][NOI2010][RMQ/主席树][二叉堆]超级钢琴
- 树上倍增实现lca
- RMQ问题
- NYOJ 86 找球号
- NYOJ 68 三点顺序
- nyoj 78 圈水池
- 最大最小值
- RMQ 模板
- [PKU3264]Balanced Lineup
- Balanced Lineup(RMQ)(POJ 3264)
- RANGE MINIUM/MAXIUM QUERY问题
- POJ3368/HDU1806/UVa11235 Frequent Values 游程编码+RMQ
- poj3264 Balanced Lineup(RMQ +st)
- RMQ Codeforces Round #322 (Div. 2) B. Luxurious Houses
- RMQ问题
- RMQ_Sparse Table & Segment Tree
- 蛇形填数
- 简单问题