zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    docker 容器与主机之间的数据copy
    vim 中如何快速注释和取消注释
    java查找字符中的某个内容并替换
    linux正则表达式
    数据流重定向与管道命令
    linux杂七杂八
    linux变量
    redis常用命令操作
    redis基本操作介绍
    redis数据结构
  • 原文地址:https://www.cnblogs.com/HITLJR/p/7143384.html
Copyright © 2011-2022 走看看