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
  • 相关阅读:
    SharedPreferences.Editor 的apply()与commit()方法的区别
    Android 解决方法数 65536 (65k) 限制
    Android RatingBar 自定义样式
    自定义 checkbox 新玩法 ?
    Android 透明度百分比对应的 十六进制
    Linux文件权限rwx简单了解
    Linux学习之Vim使用
    Linux学习之用户管理
    Linux学习之sudo命令
    一元稀疏多项式加法运算
  • 原文地址:https://www.cnblogs.com/HITLJR/p/7143384.html
Copyright © 2011-2022 走看看