佬们求看看哪出问题了
  • 板块P10059 Choose
  • 楼主0tAp
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/1/16 13:15
  • 上次更新2024/1/16 17:44:05
查看原帖
佬们求看看哪出问题了
758858
0tAp楼主2024/1/16 13:15
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define dwn(i,a,b) for(int i=(a);i>=(b);i--)
int a[N];
int n;
int q1[N],q2[N];
int ask(int L)
{
	int h1,h2;h1=h2=0;int t1,t2;t1=t2=0;
	int mm=1e9;
	memset(q1,0,sizeof q1);
	memset(q2,0,sizeof q2); 
	rep(i,1,n)
	{
		while(h2<t2&&a[i]>a[q2[t2]])t2--;
		q2[t2++]=i;
		while(h2<=t2&&q2[h2]+L<=i)h2++;
		while(h1<t1&&a[i]<a[q1[t1]])t1--;
		q1[t1++]=i;
		while(h1<=t1&&q1[h1]+L<=i)h1++;
		if(i>=L)mm=min(mm,a[q2[h2]]-a[q1[h1]]);
	}
	return mm;
}

int erfen(int L,int R,int min_x)
{
	int l=L,r=R;
	while(l<r)
	{
		int mid=l+r>>1;
		int val=ask(mid);
		if(val!=min_x)
		{
			l=mid+1;
		}
		else r=mid;
	}
	return l;
}

int main()
{
	int T;scanf("%d",&T);
	while(T--)
	{
		int k;
		int min_x;
		scanf("%d%d",&n,&k);
		rep(i,1,n)cin>>a[i];
		min_x=ask(n-k+1);
		int l_min=erfen(1,n-k+1,min_x);
		cout<<min_x<<" "<<l_min<<endl;
	}
}
2024/1/16 13:15
加载中...