国旗计划

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

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

现在,国十安全局局长希望知道,至少需要多少名边防战士,才能使得他们的奔袭区间覆盖全部的边境线,从而顺利地完成国旗计划。不仅如此,安全局局长还希望知道更详细的信息:对于每一名边防战士,在他必须参加国旗计划的前提下,至少需要多少名边防战士才能覆盖全部边境线,从而顺利地完成国旗计划。
输入:
第一行,包含两个正整数 N, M N,M,分别表示边防战士数量和边防站数量。

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

#include<iostream>
#include<algorithm>
using namespace std;
#define MAX 400005
struct p{int l,r,num;}a[MAX];
int jump[MAX][17],ans[MAX],tmp,n,m,top,l,r,now,to;
bool cmp(p a,p b){
    return a.l<b.l;
}
int main(){
    cin>>n>>m;
    a[0]=p{0x7fffffff,0x7fffffff,0x7fffffff};
    for(int i=1;i<=n;i++){
        cin>>l>>r;
        if(r<l)r+=m;
        a[++top]=p{l,r,i};
        a[++top]=p{l+m,r+m,0};
    }
    sort(a+1,a+2*n+1,cmp);
    for(int i=1,xibo=1;i<=2*n;i++){
        while(a[xibo].l<=a[i].r&&xibo<=2*n)xibo++;
        jump[i][0]=xibo-1;
    }
    for(int j=1;j<=16;j++)for(int i=1;i<=2*n;i++)jump[i][j]=jump[jump[i][j-1]][j-1];
    for(int i=1;i<=2*n;i++){
        if(a[i].num){
            tmp=0,now=i;
            for(int j=16;j>=0;j--)if(jump[now][j]&&a[jump[now][j]].r<a[i].l+m)now=jump[now][j],tmp+=(1<<j);
            ans[a[i].num]=tmp+2;
        }
    }
    for(int i=1;i<=n;i++)cout<<ans[i]<<" ";
}

原文地址:https://www.cnblogs.com/SZJZC/p/11543751.html

时间: 2024-10-28 23:19:38

国旗计划的相关文章

4444: [Scoi2015]国旗计划

4444: [Scoi2015]国旗计划 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 485  Solved: 232 Description A国正在开展一项伟大的计划——国旗计划.这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈.这 项计划需要多名边防战士以接力的形式共同完成,为此,国土安全局已经挑选了N名优秀的边防战上作为这 项计划的候选人. A国幅员辽阔,边境线上设有M个边防站,顺时针编号1至M.每名边防战士常驻两个边防站,并且善于

【BZOJ4444】[Scoi2015]国旗计划 双指针+倍增

[BZOJ4444][Scoi2015]国旗计划 Description A国正在开展一项伟大的计划——国旗计划.这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈.这项计划需要多名边防战士以接力的形式共同完成,为此,国土安全局已经挑选了N名优秀的边防战上作为这项计划的候选人. A国幅员辽阔,边境线上设有M个边防站,顺时针编号1至M.每名边防战士常驻两个边防站,并且善于在这两个边防站之间长途奔袭,我们称这两个边防站之间的路程是这个边防战士的奔袭区间.n名边防战士都是精心挑选的,身体素质极佳,所以

LibreOJ #2007. 「SCOI2015」国旗计划

二次联通门 : LibreOJ #2007. 「SCOI2015」国旗计划 --by Claris /* LibreOJ #2007. 「SCOI2015」国旗计划 跪膜Claris... */ #include <cstdio> #include <iostream> #include <algorithm> const int BUF = 12312312; char Buf[BUF], *buf = Buf; inline void read (int &

AC日记——「SCOI2015」国旗计划 LiBreOJ 2007

#2007. 「SCOI2015」国旗计划 思路: 跪烂Claris 代码: #include <cstdio> #include <algorithm> #define maxn 800010 int n,m,ai[maxn][2],bi[maxn],f[maxn<<1],st[maxn]; int g[maxn],nxt[maxn<<1],q[maxn<<1],t,ans[maxn],L,x,y,i; inline void in(int&a

[SCOI2015]国旗计划

题目描述 A 国正在开展一项伟大的计划 -- 国旗计划.这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈.这项计划需要多名边防战士以接力的形式共同完成,为此,国土安全局已经挑选了 N 名优秀的边防战上作为这项计划的候选人. A 国幅员辽阔,边境线上设有 M 个边防站,顺时针编号 1 至 M . 每名边防战士常驻两个边防站,并且善于在这两个边防站之间长途奔袭,我们称这两个边防站之间的路程是这个边防战士的奔袭区间. N名边防战士都是精心挑选的,身体素质极佳,所以每名边防战士的奔袭区间都不会被其他边

4444: [Scoi2015]国旗计划|贪心|倍增

由于没有区间被其它区间包括这个条件,也就是假设li<lj那么一定满足ri<rj,就能够贪心搞一搞了. 假如区间[l,r]都已经被覆盖,那么能够继续找一个li在[l,r]范围内的最大的一个,继续扩展覆盖的区间,然后再以相同的方式找下一个战士 这样能够依照左端点排序,然后每个战士要找的下一个战士都是确定的,然后用倍增找出一共须要多少战士就能够了 #include<algorithm> #include<iostream> #include<cstdlib> #i

BZOJ4444 : [Scoi2015]国旗计划

首先将坐标离散化,因为区间互不包含,可以理解为对于每个起点输出最少需要多少个战士. 将环倍长,破环成链,设$f[i]$表示区间左端点不超过$i$时右端点的最大值,可以通过$O(n)$递推求出. 那么如果将$f[i]$看成$i$的祖先的话,它实际上形成了一棵以$2n$为根的树. 首先暴力计算出1号点的答案$t$,设$L=t-1$. 然后dfs这棵树,用一个栈按深度依次保存每个点到根路径上的点. 对于一个点,只需要从$L$开始暴力枚举答案,然后$O(1)$检验即可. 因为每个点的答案相差不超过1,所

贪心(qwq)习题题解

贪心(qwq)习题题解 SCOI 题解 [ SCOI2016 美味 ] 假设已经确定了前i位,那么答案ans一定属于一个区间. 从高位往低位贪心,每次区间查找是否存在使此位答案为1的值. 比如6位数确定了前三位\((101...)_2\),下一位应该是1 那么\(a_i+x_i\)的查找区间为:\([(101100)_2,(101111)_2]\) ,同理如果应该是0则为\([(101000)_2,(101011)_2]\). 注意到有区间\([l,r]\)范围的限制所以用主席树维护即可. [

ORACLE实际执行计划与预估执行计划不一致性能优化案例

  在一台ORACLE服务器上做巡检时,使用下面SQL找出DISK_READ最高的TOP SQL分析时,分析过程中,有一条SQL语句的一些反常现象,让人觉得很奇怪: SELECT SQL_ID,        SQL_TEXT,        DISK_READS,        BUFFER_GETS,        PARSING_SCHEMA_NAME,        EXECUTIONS FROM   V$SQLAREA ORDER  BY DISK_READS DESC; 在SQL D