题目链接:https://qduoj.com/problem/21/点击打开链接
water problem
发布时间: 2015年10月10日 15:34 时间限制: 1000ms 内存限制: 256M
题意很简单
给你N个数, Q个查询
每次查询给你一个区间[L, R]
你要找出 [L, R] 这个区间里面取模M后的最大值。
第一行一个T,表示测试数据组数。
第二行两个整数N, M (1<=N<=10^5, 1<=M<=10^9)。
第三行给你N个整数 整数范围在1到10^9之间。
第四行给你一个整数Q. ( 1<=Q<=10^5)
下面Q行, 每一行对应两个整数L, R (1<=L<=R<10^9)
每一行对应一个询问的答案。
复制
1 5 3 4 2 2 3 5 2 1 3 4 5
2 2
线段树水题 在创建的时候设maxx记录每个点的值取模后的值 然后回溯的时候取最大
#include <bits/stdc++.h>
#define maxn 100100
using namespace std;
struct xjy
{
int left;
int right;
int maxx;
};
int a[maxn];
xjy tree[maxn<<2];
int mod;
int ans=0;
void build(int i,int left,int right)
{
if(left==right)
{
tree[i].left=left;
tree[i].right=right;
tree[i].maxx=a[left]%mod;
return ;
}
int mid=(left+right)>>1;
build(i<<1,left,mid);
build(i<<1|1,mid+1,right);
tree[i].left=left;
tree[i].right=right;
tree[i].maxx=max(tree[i<<1].maxx,tree[i<<1|1].maxx);
}
void query(int i,int left,int right)
{
if(tree[i].left==left&&tree[i].right==right)
{
ans=max(ans,tree[i].maxx);
return ;
}
int mid=(tree[i].left+tree[i].right)>>1;
if(right<=mid)
query(i<<1,left,right);
else if(left>mid)
query(i<<1|1,left,right);
else
{
query(i<<1,left,mid);
query(i<<1|1,mid+1,right);
}
}
int main()
{
int t;
cin >> t;
while(t--)
{
memset(tree,0,sizeof(tree));
memset(a,0,sizeof(a));
ans=0;
int n;
cin >> n >> mod;
for(int i=1;i<=n;i++)
cin >> a[i];
build (1,1,n);
int test;
cin >> test;
while(test--)
{
ans=0;
int l,r;
cin >> l >> r;
query(1,l,r);
cout << ans << endl;
}
}
}