人类智慧做法70pts求条
查看原帖
人类智慧做法70pts求条
701460
Magus楼主2024/9/12 17:37

做法详见tj1.

#include<bits/stdc++.h>
#define int long long
#define I using
#define AK namespace
#define NOIP2024 std
I AK NOIP2024;
const int maxn=1e5+10,inf=1e18;
int n,q,l,r,tot,arr[maxn],tag[maxn];
struct rec
{
	int val,id;
	bool operator<(rec x)const
	{
		return(val==x.val)?(id<x.id):(val<x.val);
	}
}flag[maxn];
struct node
{
	int val,l,r;
}ans[maxn*10];
bool cmp(node x,node y)
{
	if(x.val==y.val)
	{
		return x.l<y.l;
	}
	return x.val<y.val;
}
signed main()
{
	cin>>n>>q;
	for(int i=1;i<=n;i++)
	{
		cin>>arr[i];
		flag[i]={arr[i],i};
	}
	sort(flag+1,flag+n+1);
	for(int i=1;i<n;i++)
	{
		for(int j=i+1;j<=min(n,i+10);j++)
		{
			ans[++tot]={abs(flag[j].val-flag[i].val),min(flag[i].id,flag[j].id),max(flag[i].id,flag[j].id)};
		}
	}
	sort(ans+1,ans+tot+1,cmp);
	while(q--)
	{
		int qwq=inf,cnt=0;
		cin>>l>>r;
		for(int i=1;i<=2000;i++)
		{
			if(l<=ans[i].l and r>=ans[i].r)
			{
			    cout<<ans[i].val<<"\n";
				goto loop;
			}
		}
		for(int i=l;i<=r;i++)
        {
        	tag[++cnt]=arr[i];
		}
        sort(tag+1,tag+cnt+1);
        for(int i=2;i<=cnt;i++)
        {
        	if(tag[i]!=tag[i-1])
        	{
        		qwq=min(qwq,abs(tag[i]-tag[i-1]));
			}
		}
        cout<<qwq<<"\n";
		loop:;
	}
	return 0;
}

2024/9/12 17:37
加载中...