zoukankan      html  css  js  c++  java
  • HDU 4343 D

    D - Interval query
    Time Limit: 20 Sec

    Memory Limit: 256 MB

    题目连接

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=88748#problem/D

    Description

    This is a very simple question. There are N intervals in number axis, and M queries just like “QUERY(a,b)” indicate asking the maximum number of the disjoint intervals between (a,b) .

    Input

    There are several test cases. For each test case, the first line contains two integers N, M (0<N, M<=100000) as described above. In each following N lines, there are two integers indicate two endpoints of the i-th interval. Then come M lines and each line contains two integers indicating the endpoints of the i-th query.
    You can assume the left-endpoint is strictly less than the right-endpoint in each given interval and query and all these endpoints are between 0 and 1,000,000,000.

    Output

    For each query, you need to output the maximum number of the disjoint intervals in the asked interval in one line.

    Sample Input

    3 2
    1 2
    2 3
    1 3
    1 2
    1 3

    Sample Output

    1
    2

    HINT

    题意

    给你n个线段

    m次询问,问你在ab区间内,最多放下几个不能相互重叠的线段

    题解

    直接n*m暴力

    首先,我们按照右端点排序,然后能放进去就放进去,这种策略肯定是最优的

    然后就暴力吧……15s

    有两个想一想好像并咩有什么用的剪枝:

    预处理出来第一个能放进区间的线段

    预处理出哪些线段永远都不可能选的

    代码:

    #include<stdio.h>
    #include<iostream>
    #include<string.h>
    #include<algorithm>
    #define maxn 110000
    using namespace std;
    
    struct node
    {
        int x,y;
    };
    bool cmp(node a,node b)
    {
        if(a.y==b.y)
            return a.x<b.x;
        return a.y<b.y;
    }
    node a[maxn];
    node b[maxn];
    node qq[maxn];
    int cc[maxn];
    //node b[maxn];
    int tot=0;
    int main()
    {
        int n,m;
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            tot=0;
            memset(a,0,sizeof(a));
            memset(b,0,sizeof(b));
            memset(qq,0,sizeof(qq));
            memset(cc,0,sizeof(cc));
            for(int i=0;i<n;i++)
                scanf("%d %d",&a[i].x,&a[i].y);
            sort(a,a+n,cmp);
            for(int i=0;i<n;i++)
            {
                int flag=0;
                for(int j=i+1;j<n;j++)
                {
                    if(a[j].y>a[i].y)
                        break;
                    if(a[j].x<a[i].x)
                        continue;
                    flag=1;
                    break;
                }
                if(!flag)
                    b[tot++]=a[i];
            }
            int x,y,ans;
            for(int i=0;i<m;i++)
            {
                scanf("%d%d",&qq[i].x,&qq[i].y);
                int l=0,r=tot-1;
                x = qq[i].x;
                y = qq[i].y;
                while(l<=r)
                {
                    int mid=(l+r)>>1;
                    if(b[mid].y<=x)
                        l=mid+1;
                    else
                        r=mid-1;
                }
                cc[i]=l;
            }
            for(int i=0;i<m;i++)
            {
                x = qq[i].x,y = qq[i].y;
                ans=0;
                int tmp=x;
                int l = cc[i];
                for(int j=l;j<tot;j++)
                {
                    if(b[j].y<=y)
                    {
                        if(b[j].x<tmp)
                            continue;
                        tmp = b[j].y;
                        ans++;
                    }
                    else
                        break;
                }
                printf("%d
    ",ans);
            }
        }
    }
  • 相关阅读:
    mac下编写命令脚本
    mac环境mongodb安装小坑
    JS
    设计模式:装饰器
    proxy 数据帧听
    react hook 简单实现
    报错:java.lang.NumberFormatException: null
    git回滚到指定版本
    1109. 航班预订统计 力扣(中等) 差分数组 不会但神奇
    528. 按权重随机选择 力扣(中等) 前缀和rand()
  • 原文地址:https://www.cnblogs.com/qscqesze/p/4746014.html
Copyright © 2011-2022 走看看