http://acm.hdu.edu.cn/showproblem.php?pid=5124

 

lines

Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1362    Accepted Submission(s): 566


Problem Description
John has several lines. The lines are covered on the X axis. Let A is a point which is covered by the most lines. John wants to know how many lines cover A.
 

 

Input
The first line contains a single integer T(1T100)(the data for N>100 less than 11 cases),indicating the number of test cases.
Each test case begins with an integer N(1N105),indicating the number of lines.
Next N lines contains two integers Xi and Yi(1XiYi109),describing a line.
 

 

Output
For each case, output an integer means how many lines cover A.
 

 

Sample Input
2
5
1 2
2 2
2 4
3 4
5 1000
5
1 1
2 2
3 3
4 4
5 5
 

 

Sample Output
3
1
 

 

Source
 
一个离散化, 我也是醉了, 怎么就搞不懂了。。。。
 
这题居然能不用离散化, 暴力水过, 还是会离散化好点, 但是这个水代码也粘贴下吧!!!
 
#include<stdio.h>
#include<string.h>

#define N 1100000
#define max(a,b) (a>b?a:b)

int a[N];

int main()
{
    int T;

    scanf("%d", &T);

    while(T--)
    {
      int n, i, L, R;
      
      scanf("%d", &n);
      memset(a, 0, sizeof(a));

      for(i=1; i<=n; i++)
      {
          scanf("%d%d", &L, &R);
          a[L] ++;
          a[R+1] --;
      }

      int Max = a[0], sum=a[0];
     
      for(i=0; i<N; i++)
      {
          sum += a[i];
          Max = max(Max, sum);
      }

      printf("%d\n", Max);
    }

    return 0;
}
水过代码

 

 

下面两个代码都是用了离散化, 但是其实我并不怎么懂离散化, 只懂了一点点, 继续学习吧!!

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
#define N 201000

struct node
{
    int L, R;
}a[N];

int b[N], V[N];

int main()
{
    int T;

    scanf("%d", &T);

    while(T--)
    {
       int i, L, R, n, k=0;

       scanf("%d", &n);

       memset(a, 0, sizeof(a));
       memset(b, 0, sizeof(b));
       memset(V, 0, sizeof(V));

       for(i=0; i<n; i++)
       {
           scanf("%d%d", &a[i].L, &a[i].R);
           b[k++] = a[i].L;
           b[k++] = a[i].R;
       }

       sort(b, b+k);

       int z = unique(b, b+k)-b;

       for(i=0; i<n; i++)
       {
           L = lower_bound(b, b+z, a[i].L) - b;
           R = lower_bound(b, b+z, a[i].R) - b;
           V[L]++;
           V[R+1]--;
       }

       int sum=V[0], Max = V[0];
       for(i=1; i<N; i++)
       {
           sum += V[i];
           Max = max(Max, sum);
       }

       printf("%d\n", Max);
    }
    return 0;
}

 

 

 

 

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <map>

using namespace std;

#define N 200005

struct node
{
    int L, R;
}a[N];

int V[N], b[N];

map<int, int>dic;

int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        int i, j, k=0, n, L, R;

        scanf("%d", &n);

        memset(a, 0, sizeof(a));
        memset(V, 0, sizeof(V));
        memset(b, 0, sizeof(b));

        for(i=0; i<n; i++)
        {
            scanf("%d%d", &a[i].L, &a[i].R);
            b[k++] = a[i].L;
            b[k++] = a[i].R;
        }

        sort(b, b+k);
        j=1;
        for(i=0; i<k; i++)
        {
           if(i==0)
                dic[b[i]]=j++;
           else if(b[i]!=b[i-1])
                dic[b[i]]=j++;
        }

        for(i=0; i<n; i++)
        {
            L = dic[a[i].L];
            R = dic[a[i].R];
            V[L]++;
            V[R+1]--;
        }

        int Max = V[0], sum = V[0];

        for(i=0; i<N; i++)
        {
            sum += V[i];
            Max = max(Max, sum);
        }

        printf("%d\n", Max);
    }
    return 0;
}

 

posted on 2015-11-08 15:32  栀蓝  阅读(169)  评论(0编辑  收藏  举报

levels of contents