zoukankan      html  css  js  c++  java
  • CodeForces 1000C Covered Points Count(区间线段覆盖问题,差分)

    https://codeforces.com/problemset/problem/1000/C

     

     

    题意:

    有n个线段,覆盖[li,ri],最后依次输出覆盖层数为1~n的点的个数。

    思路:

    区间线段覆盖问题,第一反应树状数组、线段树,看了看数据规模,开不了这么大的空间。

    只能用差分了

     代码如下:

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <iostream>
     4 #include <string>
     5 #include <math.h>
     6 #include <algorithm>
     7 #include <vector>
     8 #include <stack>
     9 #include <queue>
    10 #include <set>
    11 #include <map>
    12 #include <math.h>
    13 const int INF=0x3f3f3f3f;
    14 typedef long long LL;
    15 const int mod=1e9+7;
    16 #define Bug cout<<"---------------------"<<endl
    17 const int maxn=2*1e5+10;
    18 using namespace std;
    19 
    20 pair<LL,int> p[2*maxn];//注意要开两倍空间 
    21 LL ans[maxn];
    22 
    23 int main()
    24 {
    25     int n;
    26     scanf("%d",&n);
    27     int cnt = 0;
    28     for(int i = 0;i < n;i++)
    29     {
    30         LL l,r;//注意是long long 
    31         scanf("%lld %lld",&l,&r);
    32         p[i*2] = make_pair(l,1);
    33         p[i*2+1] = make_pair(r+1,-1);
    34     }
    35     sort(p,p+n*2);
    36     LL now = 0;//当前点的覆盖层数 
    37     for(int i = 0;i < n*2;i++)
    38     {
    39         now += p[i].second;
    40         if(p[i].first == p[i+1].first)    continue;//叠加差分 
    41         ans[now] += p[i+1].first - p[i].first; 
    42     }
    43     for(int i=1;i<=n;i++)
    44         printf("%lld ",ans[i]);
    45     return 0;
    46 }

    -

  • 相关阅读:
    得不到的都能释怀
    个人读后感
    面向对象程序设计
    关于QQ的NABCD模型
    团队成员及分工
    软件工程结对项目--实用计算器的设计和制作
    实践作业2 个人项目作业
    github地址
    github心得体会
    人,绩效和职业道德
  • 原文地址:https://www.cnblogs.com/jiamian/p/11618951.html
Copyright © 2011-2022 走看看