1 条题解

  • 0
    @ 2026-7-4 22:59:26

    #include <cstdio>
    #include <iostream>
    using namespace std;
    const int M = 100005;
    int read()
    {
    	int x=0,f=1;char c;
    	while((c=getchar())<'0' || c>'9') {if(c=='-') f=-1;}
    	while(c>='0' && c<='9') {x=(x<<3)+(x<<1)+(c^48);c=getchar();}
    	return x*f;
    }
    int n,m,q,a[M],s[M],L[M][20],R[M][20];
    signed main()
    {
    	n=read();read();q=read();
    	for(int i=1;i<=n;i++) a[i]=read();
    	for(int i=1;i<=n;i++)
    	{
    		while(m && a[s[m]]<a[i]) m--;
    		L[i][0]=m?s[m]:i;s[++m]=i;
    	}
    	m=0;
    	for(int i=n;i>=1;i--)
    	{
    		while(m && a[s[m]]<a[i]) m--;
    		R[i][0]=m?s[m]:i;s[++m]=i;
    	}
    	L[0][0]=0;R[n+1][0]=n+1;
    	for(int j=1;j<20;j++)
    		for(int i=0;i<=n+1;i++)
    		{
    			L[i][j]=min(L[L[i][j-1]][j-1],L[R[i][j-1]][j-1]);
    			R[i][j]=max(R[L[i][j-1]][j-1],R[R[i][j-1]][j-1]);
    		}
    	while(q--)
    	{
    		int a=read(),b=read(),ans=0;
    		if(a>b) swap(a,b);
    		int l=a,r=a;
    		for(int i=19;i>=0;i--)
    		{
    			int nl=min(L[l][i],L[r][i]);
    			int nr=max(R[l][i],R[r][i]);
    			if(nr<b) l=nl,r=nr,ans+=(1<<i);
    		}
    		a=r;l=r=b;
    		for(int i=19;i>=0;i--)
    		{
    			int nl=min(L[l][i],L[r][i]);
    			int nr=max(R[l][i],R[r][i]);
    			if(a<nl) l=nl,r=nr,ans+=(1<<i);
    		}
    		printf("%d\n",ans);
    	}
    }
    
    
    • 1

    [JOISC 2017] 火车旅行 / Railway Trip

    信息

    ID
    8431
    时间
    2000ms
    内存
    512MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者