【离散化】poj1083 Moving Tables

题目地址:http://poj.org/problem?id=1083


题目大意:给定一个走廊,n组区间,求一个区间重叠的最大数
将区间端点离散化,排好序,从左向右,维护一个计数器,遇到区间起点+1,遇到区间终点-1,然后计数器曾得到的最大值*10就是答案了。
两个小地方注意一下:
1.因为(1,20)与(20,1)并没有区别,为了处理方便,我们不妨人为让区间起点<区间终点

2.注意到题目环境是一个走廊,所以room1和room2实际上是等价的,所以我们不妨把奇数房间号+1(我就因为这个跪了一次,做忘了不小心当成一条直线了。。。)


#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>

using namespace std;

int t;
int a[450],soe[450];
int n;

void q_sort(int l,int r){
    int i,j,x,y;
    i=l;
    j=r;
    x=a[(l+r)>>1];

    while (i<=j){
        while (a[i]<x) i++;
        while (a[j]>x) j--;
        if (i<=j){
            y=a[i];
            a[i]=a[j];
            a[j]=y;
            y=soe[i];
            soe[i]=soe[j];
            soe[j]=y;
            i++;j--;
        }
    }
    if (l<j) q_sort(l,j);
    if (i<r) q_sort(i,r);

}

int main(){
    cin>>t;
    for (int bibi=1;bibi<=t;bibi++){
        cin>>n;
        memset(a,0,sizeof(a));
        memset(soe,0,sizeof(soe));

        for (int i=1;i<=n;i++){
            cin>>a[2*i-1]>>a[2*i];
            if (a[2*i-1]>=a[2*i]){
                int y=a[2*i-1];
                a[2*i-1]=a[2*i];
                a[2*i]=y;
            }

            if (a[2*i-1]%2!=0) a[2*i-1]++;
            if (a[2*i]%2!=0) a[2*i]++;
            //这里出了点问题,不小心搞成一条线了
            soe[2*i-1]=1;
            soe[2*i]=-1;

        }

        q_sort(1,2*n);

        int Max=1,f=0;
        for (int i=1;i<=n*2;i++){
            f+=soe[i];
            if (f>Max){Max=f;}
        }

        cout<<Max*10<<endl;

    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值