Problem 8. Novice urbanist 巧妙的暴力

对于一条斑马线和一栋建筑,斑马线在移动到该建筑范围内的移动长度l(矢量),是一个区间内的值。

也就是当移动距离选取区间l内的值时,这条斑马线满足条件。

离线,区间更改,N个查询。前缀和+1,-1。

此外由于建筑有重叠,重叠的建筑需要看做一个区间,即把建筑处理成不相交的区间。

上代码

#include <bits/stdc++.h>
const long long mod = 1e9+7;
const double ex = 1e-10;
#define inf 0x3f3f3f3f
using namespace std;
int a[11111];
struct node
{
    int l,r;
}B[1111],E[1111];
int sum[5000000];
bool cmp(node x,node y)
{
    return x.l<y.l;
}
int main()
{
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    int N,M;
    cin >>N >>M;
    for (int i = 1;i<=N ;i++)
    {
        scanf("%d",&a[i]);
    }
    for (int i = 1;i<=M; i++)
    {
        scanf("%d%d",&B[i].l,&B[i].r);
    }
    sort(B+1,B+M+1,cmp);
    int cnt = 0;
    int R=-1;
    for (int i = 1;i<=M; i++){
        if (B[i].l > R ) {
            E[cnt].r = R;
            E[++cnt].l = B[i].l;
        }
        R = max(R,B[i].r);
    }
    E[cnt].r = R;
    for (int i = 1 ; i<=N; i++)
        for (int j = 1; j <= cnt; j++)
    {
        sum[E[j].r - a[i] + 2000000+1]--;
        sum[E[j].l - a[i] + 2000000]++;
    }
    int ans = 0,t = 0;
    int tsum = 0;
    for (int i = 0;i<=4000011; i++)
        {
            tsum+=sum[i];
            if (tsum > ans) {ans = tsum;t = abs(i-2000000);}
            else if (tsum == ans) t = min(t,abs(i-2000000));
        }
    cout << t <<" " <<ans<<endl;
    return 0;
}
View Code

 

posted @ 2017-07-09 22:09  HITLJR  阅读(134)  评论(0编辑  收藏  举报