zoukankan      html  css  js  c++  java
  • loj #2007. 「SCOI2015」国旗计划

    #2007. 「SCOI2015」国旗计划

     

    题目描述

    A 国正在开展一项伟大的计划 —— 国旗计划。这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈。这项计划需要多名边防战士以接力的形式共同完成,为此,国土安全局已经挑选了 N NN 名优秀的边防战上作为这项计划的候选人。

    A 国幅员辽阔,边境线上设有 M MM 个边防站,顺时针编号 1 11 至 M MM。每名边防战士常驻两个边防站,并且善于在这两个边防站之间长途奔袭,我们称这两个边防站之间的路程是这个边防战士的奔袭区间。N NN 名边防战士都是精心挑选的,身体素质极佳,所以每名边防战士的奔袭区间都不会被其他边防战士的奔袭区间所包含。

    现在,国十安全局局长希望知道,至少需要多少名边防战士,才能使得他们的奔袭区间覆盖全部的边境线,从而顺利地完成国旗计划。不仅如此,安全局局长还希望知道更详细的信息:对于每一名边防战士,在他必须参加国旗计划的前提下,至少需要多少名边防战士才能覆盖全部边境线,从而顺利地完成国旗计划。

    输入格式

    第一行,包含两个正整数 N,M N, MN,M,分别表示边防战士数量和边防站数量。

    随后 n nn 行,每行包含两个正整数。其中第 i ii 行包含的两个正整数 Ci C_iCi​​、Di D_iDi​​ 分别表示 i ii 号边防战士常驻的两个边防站编号,Ci C_iCi​​ 号边防站沿顺时针方向至 Di D_iDi​​ 号边防站力他的奔袭区间。数据保证整个边境线都是可被覆盖的。

    输出格式

    输出数据仅 1 11 行,需要包含 n nn 个正整数。其中,第 j jj 个正整数表示 j jj 号边防战士必须参加的前提下至少需要多少名边防战士才能顺利地完成国旗计划。

    样例

    样例输入

    4 8
    2 5
    4 7
    6 1
    7 3

    样例输出

    3 3 4 3

    数据范围与提示

    N≤2×105,M<109,1≤Ci,Di≤M N leq 2 imes 10 ^ 5, M < 10 ^ 9, 1 leq C_i, D_i leq MN2×105​​,M<109​​,1Ci​​,Di​​M

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define maxn 400010
    using namespace std;
    int head[maxn],dep[maxn],s[maxn],ans[maxn];
    int n,m,num,t;
    struct node{int to,pre;}e[maxn*2];
    struct Node{
        int l,r,id;
        bool operator < (const Node &x)const{
            return l<x.l;
        }
    }q[maxn];
    void Insert(int from,int to){
        e[++num].to=to;
        e[num].pre=head[from];
        head[from]=num;
    }
    void dfs(int now,int father,int h){
        dep[now]=dep[father]+1;
        s[++t]=now;
        if(q[now].id!=0){
            while(h<t&&q[s[h+1]].r>=q[now].l+m)h++;
            ans[q[now].id]=dep[now]-dep[s[h]]+1;
        }
        for(int i=head[now];i;i=e[i].pre){
            int to=e[i].to;
            dfs(to,now,h);
        }
        t--;
    }
    int main(){
        freopen("Cola.txt","r",stdin);
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++){
            int l,r;
            scanf("%d%d",&l,&r);
            if(l>r)r+=m;
            q[i].l=l;q[i].r=r;q[i].id=i;
            q[i+n].l=l+m;q[i+n].r=r+m;
        }
        int now=1;
        sort(q+1,q+2*n+1);
        for(int i=1;i<2*n;i++){
            while(now<2*n&&q[i].r>=q[now+1].l)now++;
            Insert(now,i);
        }
        dfs(2*n,0,1);
        for(int i=1;i<=n;i++)
            printf("%d ",ans[i]);
        return 0;
    }
    自上向下
  • 相关阅读:
    IOS7 UI设计的十大准则
    IOS8-人机界面指南
    Android应用切换皮肤功能实现
    Android 打造自己的个性化应用(五):仿墨迹天气实现续--> 使用Ant实现zip/tar的压缩与解压
    Android 打造自己的个性化应用(四):仿墨迹天气实现-->自定义扩展名的zip格式的皮肤
    Android 打造自己的个性化应用(三):应用程序的插件化
    Android 打造自己的个性化应用(二):应用程序内置资源实现换肤功能
    Android 打造自己的个性化应用(一):应用程序换肤主流方式的分析与概述
    Android防止内存泄漏以及MAT的使用
    Android内存泄漏监测(MAT)及解决办法
  • 原文地址:https://www.cnblogs.com/thmyl/p/8867928.html
Copyright © 2011-2022 走看看