zoukankan      html  css  js  c++  java
  • little w and Segment Coverage

    题目描述

    小w有m条线段,编号为1到m。

    用这些线段覆盖数轴上的n个点,编号为1到n。

    第i条线段覆盖数轴上的区间是L[i],R[i]。

    覆盖的区间可能会有重叠,而且不保证m条线段一定能覆盖所有n个点。

    现在小w不小心丢失了一条线段,请问丢失哪条线段,使数轴上没被覆盖到的点的个数尽可能少,请输出丢失的线段的编号和没被覆盖到的点的个数。如果有多条线段符合要求,请输出编号最大线段的编号(编号为1到m)。

    输入描述:

    第一行包括两个正整数n,m(1≤n,m≤10^5)。
    接下来m行,每行包括两个正整数L[i],R[i](1≤L[i]≤R[i]≤n)。

    输出描述:

    输出一行,包括两个整数a b。
    a表示丢失的线段的编号。
    b表示丢失了第a条线段后,没被覆盖到的点的个数。
    示例1

    输入

    复制
    5 3
    1 3
    4 5
    3 4

    输出

    复制
    3 0

    说明

    若丢失第1条线段,1和2没被线段覆盖到。
    若丢失第2条线段,5没被线段覆盖到。
    若丢失第3条线段,所有点都被线段覆盖到了。
    示例2

    输入

    复制
    6 2
    1 2
    4 5

    输出

    复制
    2 4

    说明

    若丢失第1条线段,1,2,3,6没被线段覆盖到。
    若丢失第2条线段,3,4,5,6没被线段覆盖到。
    #include <bits/stdc++.h>
    
    using namespace std;
    const int maxn=1e5+16;
    int l[maxn],r[maxn],uncovered,n,m,cur[maxn],C[maxn];
    int one[maxn],line,ans=0x3f3f3f3f;
    int main()
    {
        cin>>n>>m;
        for(int i=1;i<=m;i++){
             scanf("%d%d",l+i,r+i);
             cur[l[i]]++,cur[r[i]+1]--;
        }
        for(int i=1;i<=n;i++){
             cur[i]+=cur[i-1];
             if(!cur[i])uncovered++;
             if(cur[i]==1)C[i]=1;
             C[i]+=C[i-1];
        }
        for(int i=1;i<=m;i++){
              int now=C[r[i]]-C[l[i]-1];
              if(ans>=now)line=i,ans=now;
        }
        cout<<line<<' '<<uncovered+ans<<endl;
        return 0;
    }
  • 相关阅读:
    PHP数组(数组正则表达式、数组、预定义数组)
    面向对象。OOP三大特征:封装,继承,多态。 这个讲的是【封存】
    uvalive 3938 "Ray, Pass me the dishes!" 线段树 区间合并
    LA4329 Ping pong 树状数组
    HDU 1257 最少拦截系统
    HDU 1260 Tickets
    codeforce 621D
    codeforce 621C Wet Shark and Flowers
    codeforce 621B Wet Shark and Bishops
    codeforce 621A Wet Shark and Odd and Even
  • 原文地址:https://www.cnblogs.com/czy-power/p/10587631.html
Copyright © 2011-2022 走看看