乱搞做法
查看原帖
乱搞做法
344405
曹操废了楼主2022/3/30 20:12

RTRT,乱搞做法,洛谷AC,但CCF名单没我(嘤嘤嘤)。 应该是能卡到O(nm)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;
}

求如何优化//正确做法

2022/3/30 20:12
加载中...