我真的很不理解(JOISC2017)
  • 板块题目总版
  • 楼主pengyule
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/2/25 16:45
  • 上次更新2023/10/28 07:47:14
查看原帖
我真的很不理解(JOISC2017)
300078
pengyule楼主2022/2/25 16:45

铁路旅行

#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,K,q,a[N],stk[N],l[20][N],r[20][N];
int main(){
	cin>>n>>K>>q;
	for(int i=1;i<=n;i++)cin>>a[i];
	int tp=0;
	for(int i=1;i<=n;i++){
		while(tp&&a[i]>a[stk[tp]])tp--;
		l[0][i]=tp?stk[tp]:i;
		stk[++tp]=i;
	}
	tp=0;
	for(int i=n;i;i--){
		while(tp&&a[i]>a[stk[tp]])tp--;
		r[0][i]=tp?stk[tp]:i;
		stk[++tp]=i;
	}
	for(int i=1;i<=18;i++)
		for(int j=1;j<=n;j++){
			l[i][j]=min(l[i-1][l[i-1][j]],l[i-1][r[i-1][j]]);
			r[i][j]=max(r[i-1][r[i-1][j]],r[i-1][l[i-1][j]]);
		}
	for(int x,y;q--;){
		cin>>x>>y;
		if(x>y)swap(x,y);
		int s=x,t=x,ans=0;
		for(int i=18;~i;i--){
			int ns=min(l[i][s],l[i][t]),nt=max(r[i][s],r[i][t]);
			if(nt<y)s=ns,t=nt,ans+=1<<i;
		}
		int p=t;
		s=t=y;cerr<<p<<ans;//<-
		for(int i=18;~i;i--){
			int ns=min(l[i][s],l[i][t]),nt=max(r[i][s],r[i][t]);
			if(ns>p)s=ns,t=nt,ans+=1<<i;
		}
		cerr<<s;//<-
		cout<<ans<<'\n';
	}
}

数据:

7 3 1
3
1
2
2
2
1
3
2 6

cerr输出315,输出答案2

这应该是说它得经过3,5俩个点吧

但最优方案显然是a2->a1->a7->a6(答案没问题,但路径怎么回事?)求助。

2022/2/25 16:45
加载中...