给出n个数,然后对于D区间的数求一个最大差值
思路:
区间最大最小。。。我居然没想到线段树。。。
#include <bits/stdc++.h> using namespace std; typedef long long LL; const int N=1e5+10; struct SegT{ int left; int right; int mid; int tmin,tmax; }; SegT q[N*4]; int n; void Build(int num,int L ,int R) { int mid; q[num].left=L; q[num].right=R; mid=(L+R)/2; if(L==R) { scanf("%d",&q[num].tmax); q[num].tmin=q[num].tmax; return; } Build(2*num,L,mid); Build(2*num+1,mid+1,R); q[num].tmin=min(q[2*num].tmin,q[2*num+1].tmin); q[num].tmax=max(q[2*num].tmax,q[2*num+1].tmax); } int query_min(int num,int s, int t) { if(q[num].left>=s&&q[num].right<=t) return q[num].tmin; int mid=(q[num].left+q[num].right)/2; if(mid>=t) return query_min(2*num,s,t); else if(mid<s) return query_min(2*num+1,s,t); else return min(query_min(2*num,s,mid),query_min(2*num+1,mid+1,t)); } int query_max(int num,int s, int t) { if(q[num].left>=s&&q[num].right<=t) return q[num].tmax; int mid=(q[num].left+q[num].right)/2; if(mid>=t) return query_max(2*num,s,t); else if(mid<s) return query_max(2*num+1,s,t); else return max(query_max(2*num,s,mid),query_max(2*num+1,mid+1,t)); } int main() { int T,cas=1,d; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&d); Build(1,1,n); int ans=0; for(int i=1;i<=(n-d+1);i++) { ans=max(ans,abs(query_max(1,i,i+d-1)-query_min(1,i,i+d-1))); } printf("Case %d: %d ",cas++,ans); } return 0; }