RT,乱搞做法,洛谷AC,但CCF名单没我(嘤嘤嘤)。
应该是能卡到O(nm)的。不管怎样,水了一道蓝题
#include<iostream>
#include<cstdio>
#include<stack>
#include<cstring>
using namespace std;
int n,m;
struct kx{
int a,b;
}f[500001];
//stack<kx> q;
stack<int> q;
int k[500001],sum[500001];
int s1[500001];//[i,n]
int main(){
// freopen("stack.in","r",stdin);
// freopen("stack.out","w",stdout);
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>f[i].a;
for(int i=1;i<=n;i++) cin>>f[i].b;
memset(sum,0x3f,sizeof(sum));
for(int i=1;i<=n;i++){
while(!q.empty()&&(f[q.top()].a==f[i].a||f[q.top()].b<=f[i].b)){
sum[q.top()]=i;
q.pop();
}
// sum[i]=sum[i-1]+s1[i];
q.push(i);
}
for(int i=1,l,r;i<=m;i++){
cin>>l>>r;
int p=l,ans=0;
while(p<=r){
p=sum[p];
ans++;
}
cout<<ans<<endl;
}
/*for(int i=1,l,r;i<=m;i++){
cin>>l>>r;
int ans=0;
while(!q.empty()) q.pop();
for(int j=l;j<=r;j++){
while(!q.empty()){
kx g=q.top();
if(f[j].a==g.a){
q.pop();
continue;
}
if(f[j].b>=g.b){
q.pop();
continue;
}
q.push((kx){f[j].a,f[j].b});
break;
}
if(q.empty()){
ans++;
//cout<<j<<" ";
q.push((kx){f[j].a,f[j].b});
}
}
cout<<ans<<"\n";
}*/
fclose(stdin);
fclose(stdout);
return 0;
}
求如何优化/正确做法