zoukankan      html  css  js  c++  java
  • cf E. Valera and Queries

    http://codeforces.com/contest/369/problem/E

    题意:输入n,m; n 代表有多少个线段,m代表有多少个询问点集。每一个询问输出这些点的集合所占的线段的个数。

    思路:求出没有被点的覆盖的线段的个数,n-这个个数就是所求的。

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <algorithm>
     4 #define maxn 2000000
     5 using namespace std;
     6 const int inf=1e6+5;
     7 
     8 int n,m;
     9 int c[maxn];
    10 int ans[maxn];
    11 struct node
    12 {
    13     int l,r;
    14     int id;
    15     bool operator <(const node &a)const
    16     {
    17         return (r<a.r)||(r==a.r&&l<a.l);
    18     }
    19 } p[maxn],q[maxn];
    20 
    21 int low_bit(int x)
    22 {
    23     return x&(-x);
    24 }
    25 
    26 void add(int pos,int val)
    27 {
    28     while(pos<=inf)
    29     {
    30         c[pos]+=val;
    31         pos+=low_bit(pos);
    32     }
    33 }
    34 
    35 int sum(int pos)
    36 {
    37     int sum1=0;
    38     while(pos>0)
    39     {
    40         sum1+=c[pos];
    41         pos-=low_bit(pos);
    42     }
    43     return sum1;
    44 }
    45 
    46 int main()
    47 {
    48     while(scanf("%d%d",&n,&m)!=EOF)
    49     {
    50         for(int i=0; i<n; i++)
    51         {
    52             scanf("%d%d",&p[i].l,&p[i].r);
    53             p[i].id=i+1;
    54         }
    55         sort(p,p+n);
    56         int cnt=0;
    57         for(int i=1; i<=m; i++)
    58         {
    59             ans[i]=n;
    60         }
    61         for(int i=1; i<=m; i++)
    62         {
    63             int num,x;
    64             scanf("%d",&num);
    65             int last=0;
    66             for(int j=1; j<=num; j++)
    67             {
    68                 scanf("%d",&x);
    69                 q[cnt].l=last;
    70                 q[cnt].r=x;
    71                 q[cnt++].id=i;
    72                 last=x;
    73             }
    74             q[cnt].l=x;
    75             q[cnt].r=inf;
    76             q[cnt++].id=i;
    77         }
    78         sort(q,q+cnt);
    79         int j=0;
    80         for(int i=0; i<cnt; i++)
    81         {
    82             while(j<n&&p[j].r<q[i].r)
    83             {
    84                 add(p[j++].l,1);
    85             }
    86             ans[q[i].id]-=sum(q[i].r-1)-sum(q[i].l);
    87         }
    88         for(int i=1; i<=m; i++)
    89         {
    90             printf("%d
    ",ans[i]);
    91         }
    92     }
    93     return 0;
    94 }
    View Code
  • 相关阅读:
    加法&除法
    [转] KMP算法
    软件测试视频集
    集成测试的目的和意义
    UNIX常用命令简介
    软件测试V模型
    集成测试、单元测试与系统测试的差别
    软件测试的基本概念和方法
    软件测试工程师 笔试题
    软件测试
  • 原文地址:https://www.cnblogs.com/fanminghui/p/3971547.html
Copyright © 2011-2022 走看看