zoukankan      html  css  js  c++  java
  • bzoj4444[Scoi2015]国旗计划

    4444: [Scoi2015]国旗计划

    Time Limit: 20 Sec  Memory Limit: 256 MB
    Submit: 657  Solved: 345
    [Submit][Status][Discuss]

    Description

    A国正在开展一项伟大的计划——国旗计划。这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈。这
    项计划需要多名边防战士以接力的形式共同完成,为此,国土安全局已经挑选了N名优秀的边防战上作为这
    项计划的候选人。
    A国幅员辽阔,边境线上设有M个边防站,顺时针编号1至M。每名边防战士常驻两个边防站,并且善于
    在这两个边防站之间长途奔袭,我们称这两个边防站之间的路程是这个边防战士的奔袭区间。n名边防战士
    都是精心挑选的,身体素质极佳,所以每名边防战士的奔袭区间都不会被其他边防战士的奔袭区间所包含。
    现在,国十安全局局长希望知道,至少需要多少名边防战士,才能使得他们的奔袭区间覆盖全部的边境线,
    从而顺利地完成国旗计划。不仅如此,安全局局长还希望知道更详细的信息:对于每一名边防战士,在他必
    须参加国旗计划的前提下,至少需要多少名边防战士才能覆盖全部边境线,从而顺利地完成国旗计划。
     

    Input

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

    Output

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

    Sample Input

    4 8
    2 5
    4 7
    6 1
    7 3

    Sample Output

    3 3 4 3

    HINT

     n≤2×10^5,M< 10^9,1≤Ci,Di≤M

    https://www.cnblogs.com/clrs97/p/5304387.html

     1 #include<bits/stdc++.h>
     2 #define N 400010
     3 using namespace std;
     4 int n,m,tot,len,mx,id[N>>1],f[N<<1],hd[N<<1];
     5 int t,q[N<<1],ans[N],b[N],l[N>>1],r[N>>1];
     6 struct edge{int v,next;}e[N<<1];
     7 void cmax(int &x,int y){if(y>x)x=y;}
     8 void adde(int u,int v){
     9     e[++tot].v=v;
    10     e[tot].next=hd[u];
    11     hd[u]=tot;
    12 }
    13 void dfs(int u){
    14     q[++t]=u;
    15     if(u<=len)for(int i=mx;;i++)
    16     if(q[t-i]>=u+len){ans[u]=i;break;}
    17     for(int i=hd[u];i;i=e[i].next)dfs(e[i].v);
    18     --t;
    19 }
    20 int main(){
    21     scanf("%d%d",&n,&m);m=0;
    22     for(int i=1;i<=n;i++)
    23     scanf("%d%d",&l[i],&r[i]),
    24     b[++m]=l[i],b[++m]=r[i];
    25     sort(b+1,b+1+m);
    26     len=unique(b+1,b+1+m)-b-1;int x,y;
    27     //int len=m,x,y;
    28     for(int i=1;i<=n;i++){
    29         id[i]=x=lower_bound(b+1,b+1+len,l[i])-b;
    30         y=lower_bound(b+1,b+1+len,r[i])-b;
    31         if(x<y)cmax(f[x],y),cmax(f[x+len],y+len);
    32         else cmax(f[1],y),cmax(f[x],y+len),cmax(f[x+len],len<<1);
    33     }
    34     for(int i=1;i<=len<<1;i++)cmax(f[i],f[i-1]);
    35     //for(int i=1;i<=len<<1;i++)printf("%d ",f[i]);puts("");
    36     for(int i=1;i<len<<1;i++)adde(f[i],i);
    37     for(int i=1;i<=len;i=f[i])++mx;--mx;
    38     dfs(len<<1);
    39     for(int i=1;i<=n;i++)printf("%d ",ans[id[i]]);
    40     return 0;
    41 }
  • 相关阅读:
    整理DB2左补零,右补零的方法
    DB2复制表结构及数据
    两种方式,创建有返回值的DB2函数
    IDEA中Java目录结构
    uWSGI、uwsgi、WSGI、之间的关系,为什么要用nginx加uWSGI部署。
    LeetCode_9_回文数字
    JAVA学习笔记
    学习过程中的杂记
    csrf(跨站请求伪造)
    Jquery中$(function(){})
  • 原文地址:https://www.cnblogs.com/wsy01/p/8324749.html
Copyright © 2011-2022 走看看