• (树状数组+离散化)lines--hdu --5124


    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
    ", 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
    ", 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
    ", Max);
        }
        return 0;
    }
    勿忘初心
  • 相关阅读:
    数论初步
    最大流
    vue + elemen 初始化项目--构建
    call, appply , bind
    动态引入全局组件
    少见好用的js API
    vue父子组件通讯
    vue优化相关---性能篇
    vue推荐文章
    webpack4.x系列--资源和样式解析
  • 原文地址:https://www.cnblogs.com/YY56/p/4947422.html
Copyright © 2020-2023  润新知