求助,WA了,自测的样例都是对的
查看原帖
求助,WA了,自测的样例都是对的
206010
TKater_yzt楼主2021/10/2 20:24

RT,看了看,自己写的RMQ的模板没问题啊,手测的几组样例也没问题,但就是WA了qaq

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cmath>
#define LL long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
using namespace std;

const LL maxlog=24;
const LL maxn=1e5+1e2;

struct RMQ{
	LL d[maxn][maxlog],len;
	void init(const vector<LL>& A)
	{
		LL n=A.size();
		for(LL i=0;i<n;i++)d[i+1][0]=A[i];
		for(LL j=1;(1<<j)<=n;j++)
			for(LL i=1;i+(1<<j)-1<=n;i++)
				d[i][j]=max(d[i][j-1],d[i+(1<<j)-1][j-1]);
		len=n;
	}
	LL query(LL l,LL r)
	{
		LL k=0;
		while((1<<(k+1))<=r-l+1)k++;
//		printf("%lld %lld\n",l,r);
//		for(LL i=1;i<=len;i++)printf("%lld ",d[i][0]);
//		printf("\n");
		return max(d[l][k],d[r-(1<<k)+1][k]);
	}
};

RMQ rmq;

LL l[maxn],r[maxn],num[maxn],a[maxn];

int main()
{
	LL n,q,i,j,left,right;
	while(1)
	{
		scanf("%lld",&n);
		if(n==0)return 0;
		scanf("%lld",&q);
		for(i=1;i<=n;i++) scanf("%lld",&a[i]);
		LL start=1,k=0;
		vector<LL> cnt;
		a[n+1]=a[n]+1;
		for(i=2;i<=n+1;i++)
		{
			if(a[i-1]<a[i])
			{
				cnt.push_back(i-start);
				++k;
				for(j=start;j<i;j++)
				{
					l[j]=start;
					r[j]=i-1;
					num[j]=k;
				}
				start=i;
			}
		}
		rmq.init(cnt);
		LL ans=0;
		for(i=1;i<=q;i++)
		{
			scanf("%lld %lld",&left,&right);
			if(num[left]==num[right])
			{
				printf("%lld\n",right-left+1);
			}
			else {
				if(num[left]==num[right]-1)
					{
						printf("%lld\n",max((r[left]-left+1),(right-l[right]+1)));
					}
					if(num[left]+1<=num[right]-1)
					{
					ans=max((r[left]-left+1),(right-l[right]+1));
					ans=max(ans,rmq.query(num[left]+1,num[right]-1));
					printf("%lld\n",ans);
					}
				}
		}
	}
	return 0;
}
2021/10/2 20:24
加载中...