区间染色_浮水法_洛谷_P3740贴海报

题目链接:洛谷_P3740贴海报

题目描述

Bytetown城市要进行市长竞选,所有的选民可以畅所欲言地对竞选市长的候选人发表言论。为了统一管理,城市委员会为选民准备了一个张贴海报的electoral墙。

张贴规则如下:

  1. electoral墙是一个长度为N个单位的长方形,每个单位记为一个格子;

  2. 所有张贴的海报的高度必须与electoral墙的高度一致的;

  3. 每张海报以“A B”表示,即从第A个格子到第B个格子张贴海报;

  4. 后贴的海报可以覆盖前面已贴的海报或部分海报。

现在请你判断,张贴完所有海报后,在electoral墙上还可以看见多少张海报。

输入格式

第一行: N M 分别表示electoral墙的长度和海报个数

接下来M行: Ai Bi 表示每张海报张贴的位置

输出格式

输出贴完所有海报后,在electoral墙上还可以看见的海报数。

输入输出样例

 输入
    1 4
    2 6
    8 10
    3 4
    7 10
 输出 
    4

说明/提示

      

【约束条件】

1 0<= N <= 10000000 1<=M<=1000 1<= Ai <= Bi <=10000000

所有的数据都是整数。数据之间有一个空格

题解(链接)

     浮水法 dalao的题解_blog

     还可以线段树做(本蒟蒻懒得打)

代码

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m;
int x[10000],y[10000],k,ans,f[10000];
void check(int xx,int yy,int nn,int mm)
{
    if(f[mm]) return;
    while (nn<=n && (xx>=y[nn] || yy<=x[nn])) nn++;
    if(nn>n){
        ans++;
        f[mm]=1;
    }
    if(x[nn]>xx && x[nn]<yy) check(xx,x[nn],nn+1,mm);
    if(y[nn]<yy && y[nn]>xx) check(y[nn],yy,nn+1,mm);
}
int main()
{
    scanf("%d%d",&m,&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d",&x[i],&y[i]);
        y[i]++;
    }
    ans=1;
    for(int i=n-1;i>=1;i--)
     check(x[i],y[i],i+1,i);
    printf("%d",ans);
}

 

posted @ 2020-10-29 21:33  Li_yxxx  阅读(72)  评论(0)    收藏  举报