| 比赛 |
26暑假集训模拟赛2 |
评测结果 |
AAAAAAAAAAAAAAAAAARM |
| 题目名称 |
丹钓战 |
最终得分 |
90 |
| 用户昵称 |
VTXE |
运行时间 |
5.686 s |
| 代码语言 |
C++ |
内存使用 |
39.94 MiB |
| 提交时间 |
2026-07-02 10:40:14 |
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll n,Q;
ll a[510000],b[510000];
ll c[510000];
ll st[510000];
ll f[30][510000];
ll cnt;
int main(){
freopen("stack.in","r",stdin);
freopen("stack.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>Q;
for (int i=1;i<=n;i++){
cin>>a[i];
}
for (int i=1;i<=n;i++){
cin>>b[i];
}
for (int i=1;i<=n;i++){
while (cnt>0){
ll j=st[cnt];
if (a[i]==a[j]||b[i]>=b[j]){
c[j]=i;
cnt--;
}else break;
}
st[++cnt]=i;
}
while (cnt>0){
c[st[cnt--]]=n+1;
}
c[n+1]=n+1;
for (int i=1;i<=n+1;i++){
f[0][i]=c[i];
}
for (int k=1;k<20;k++){
for (int i=1;i<=n+1;i++){
f[k][i]=f[k-1][f[k-1][i]];
}
}
while (Q--){
ll l,r;
cin>>l>>r;
ll ans=1;
ll tot=l;
for (int k=19;k>=0;k--){
if (f[k][tot]<=r){
ans+=(1<<k);
tot=f[k][tot];
}
}
cout<<ans<<'\n';
}
return 0;
}