CF1175E Minimal Segment Cover

贪心,倍增优化n至log(n)

#include<iostream>
#include<cstdio>

#define ri register int
#define u int

namespace opt {

    inline u in() {
        u x(0),f(1);
        char s(getchar());
        while(s<'0'||s>'9') {
            if(s=='-') f=-1;
            s=getchar();
        }
        while(s>='0'&&s<='9') {
            x=(x<<1)+(x<<3)+s-'0';
            s=getchar();
        }
        return x*f;
    }

}

using opt::in;

#define NN 500005

#include<algorithm>
#include<cmath>

namespace mainstay {

    u N,M,mx,f[NN][30];

    inline void solve() {
        N=in(),M=in();
        for(ri i(1); i<=N; ++i) {
            u _a(in()),_b(in());
            f[_a][0]=std::max(f[_a][0],_b);
            mx=std::max(mx,_b);
        }
        for(ri i(1); i<=mx; ++i) {
            f[i][0]=std::max(f[i][0],f[i-1][0]);
        }
        for(ri j(1); j<=20; ++j) {
            for(ri i(0); i<=mx; ++i) {
                f[i][j]=f[f[i][j-1]][j-1];
            }
        }
        for(ri i(1); i<=M; ++i) {
            u _a(in()),_b(in()),_ans(0);
            for(ri j(20); j>=0; --j) {
                if(f[_a][j]<_b) {
                    _ans+=(1<<j);
                    _a=f[_a][j];
                }
            }
            printf("%d\n",f[_a][0]>=_b?_ans+1:-1);
        }
    }

}

int main() {

    //freopen("x.txt","r",stdin);
    std::ios::sync_with_stdio(false);
    mainstay::solve();

}

 

posted @ 2019-11-08 16:28  pai_hoo  阅读(94)  评论(0编辑  收藏  举报