zoukankan      html  css  js  c++  java
  • NC20302 国旗计划(倍增)

    首先破环成链,因为图中是一个环,所以转化成有n种可能性的链。

    输入如果右端点小,就+m

    一个显然的贪心是,既然选择当前点,那么下一个点的左端点越靠近当前点的右端越好

    这个成立的原因是,没有两个线段存在包含关系,因此左端点越右,右端点越右,这样覆盖的会尽可能的远。

    之后就可以用倍增优化进行跳跃,直到覆盖当前点所对应的这条链

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    typedef pair<int,int> pll;
    const int N=4e5+10;
    const int mod=1e9+7;
    struct node{
        int l,r;
        int id;
    }s[N];
    int f[N][25];
    int n,m;
    int ans[N];
    bool cmp(node a,node b){
        return a.l<b.l;
    }
    void init(){
        int now=1;
        int i,j;
        for(i=1;i<=2*n;i++){
            while(s[now].l<=s[i].r&&now<=2*n){
                now++;
            }
            f[i][0]=now-1;
        }
        for(j=1;j<=20;j++){
            for(i=1;i<=2*n;i++){
                f[i][j]=f[f[i][j-1]][j-1];
            }
        }
    }
    void solve(int x){
        int d=s[x].l+m;
        int res=1;
        int tmp=x;
        int i;
        for(i=20;i>=0;i--){
            if(f[x][i]!=0&&s[f[x][i]].r<d){
                res+=(1<<(i));
                x=f[x][i];
            }
        }
        ans[s[tmp].id]=res+1;
    }
    int main(){
        ios::sync_with_stdio(false);
        int i;
        cin>>n>>m;
        for(i=1;i<=n;i++){
            cin>>s[i].l>>s[i].r;
            if(s[i].l>s[i].r){
                s[i].r+=m;
            }
            s[i].id=i;
        }
        sort(s+1,s+1+n,cmp);
        for(i=1;i<=n;i++){
            s[i+n]=s[i];
            s[i+n].l+=m;
            s[i+n].r+=m;
        }
        init();
        for(i=1;i<=n;i++){
            solve(i);
        }
        for(i=1;i<=n;i++)
            cout<<ans[i]<<" ";
        cout<<endl;
        return 0;
    }
    View Code
    没有人不辛苦,只有人不喊疼
  • 相关阅读:
    HDU 2844 Coins(多重背包)
    HDU 4540 威威猫系列故事——打地鼠(DP)
    Codeforces Round #236 (Div. 2)
    FZU 2140 Forever 0.5
    HDU 1171 Big Event in HDU(DP)
    HDU 1160 FatMouse's Speed(DP)
    ZOJ 3490 String Successor
    ZOJ 3609 Modular Inverse
    ZOJ 3603 Draw Something Cheat
    ZOJ 3705 Applications
  • 原文地址:https://www.cnblogs.com/ctyakwf/p/14639561.html
Copyright © 2011-2022 走看看