zoukankan      html  css  js  c++  java
  • vijos P1459车展

    P1459车展
     
     

    描述

    遥控车是在是太漂亮了,韵韵的好朋友都想来参观,所以游乐园决定举办m次车展。车库里共有n辆车,从左到右依次编号为1,2,…,n,每辆车都有一个展台。刚开始每个展台都有一个唯一的高度h[i]。主管已经列好一张单子:
    L1 R1
    L2 R2

    Lm Rm
    单子上的(Li,Ri)表示第i次车展将要展出编号从Li到Ri的车。

    为了更加美观,展览时需要调整展台的高度,使参展所有展台的高度相等。展台的高度增加或减少1都需花费1秒时间。由于管理员只有一个人,所以只好对每个展台依次操作。每次展览结束后,展台高度自动恢复到初始高度。

    请告诉管理员为了举办所有展览,他最少需要花多少时间将展台调整好。

    格式

    输入格式

    第一行为两个正整数n、m。

    第二行共n个非负整数,表示第i辆车展台的高度h[i]。

    接下来m行每行2个整数Li、Ri(Li≤Ri)。

    输出格式

    一个正整数,调整展台总用时的最小值。

    样例1

    样例输入1[复制]

     
    6 4
    4 1 2 13 0 9
    1 5
    2 6
    3 4
    2 2

    样例输出1[复制]

     
    48

    限制

    各个测试点1s

    提示

    对于50%的数据 n≤500,m≤1000;
    对于80%的数据 n≤1000,m≤100000;
    对于100%的数据n≤1000,m≤200000;
    答案在2^64以内。

    附上一组测试数据

    输入

    10 10 
    28 5 10 16 24 14 7 15 20 0 
    1 7 
    2 4 
    9 10 
    9 10 
    8 9 
    3 6 
    7 10 
    3 9 
    4 7 
    6 10

    输出

    222

    AC代码1:

    消耗时间 2762 ms
    消耗内存 572 KiB
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<iostream>
    #define ll long long
    using namespace std;
    const int N=1e3+10;
    int n,m,a[N],d[N]; 
    ll tot=0;
    inline const int read(){
        register int x=0,f=1;
        register char ch=getchar();
        while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    inline int abs(int x){
        return x>0?x:-x;
    }
    int main(){
        n=read();m=read();
        for(int i=1;i<=n;i++) a[i]=read();
        memcpy(d,a,sizeof a);
        for(int i=1,l,r,mid;i<=m;i++){
            l=read();r=read();mid=l+r>>1;
            nth_element(a+l,a+mid,a+r+1);
            ll t1=0;
            for(int j=l;j<=r;j++) t1+=abs(a[j]-a[mid]);
            tot+=t1;
            memcpy(a,d,sizeof d);
        }
        cout<<tot;
        return 0;
    }

    AC代码2:

    消耗时间 576 ms
    消耗内存 1564 KiB
    #include<cstdio>
    #include<algorithm>
    #define ll long long
    using namespace std;
    const int N=1001<<2;
    const int M=N*20;
    int sum[M],ls[M],rs[M];
    int T[N],num[N],a[N],san[N],tot;
    inline const int read(){
        register int x=0,f=1;
        register char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    void build(int &rt,int l,int r){
        rt=++tot;
        sum[rt]=0;
        if(l==r) return ;
        int mid=(l+r>>1);
        build(ls[rt],l,mid);
        build(rs[rt],mid+1,r);
    }
    void updata(int &rt,int last,int p,int l,int r){
        rt=++tot;
        ls[rt]=ls[last];
        rs[rt]=rs[last];
        sum[rt]=sum[last]+1;
        if(l==r) return ;
        int mid=(l+r>>1);
        if(p<=mid)
            updata(ls[rt],ls[last],p,l,mid);
        else
            updata(rs[rt],rs[last],p,mid+1,r);
    }
    int query(int l,int r,int x,int y,int k){
        if(l==r) return l;
        int mid=(l+r>>1);
        int cnt=sum[ls[y]]-sum[ls[x]];
        if(k<=cnt)
            return query(l,mid,ls[x],ls[y],k);
        else
            return query(mid+1,r,rs[x],rs[y],k-cnt);
    }
    ll total;
    int main(){
        int n=read(),m=read();
        for(int i=1;i<=n;i++) san[i]=num[i]=a[i]=read();
        stable_sort(san+1,san+n+1);
        int cnt=unique(san+1,san+n+1)-(san+1);
        build(T[0],1,cnt);
        for(int i=1;i<=n;i++) num[i]=lower_bound(san+1,san+cnt+1,num[i])-san;
        for(int i=1;i<=n;i++) updata(T[i],T[i-1],num[i],1,cnt);
        for(int i=1;i<=m;i++){
            int x=read(),y=read(),k=(y-x>>1)+1;
            int id=query(1,cnt,T[x-1],T[y],k);
            int smid=san[id];
            ll t1=0;
            for(int j=x;j<=y;j++) t1+=abs(a[j]-smid);
            total+=t1;
        }
        printf("%lld",total);
        return 0;
    }
  • 相关阅读:
    Nginx技术研究系列6-配置详解
    IBatis.Net 老技术新研究
    .Net 内存对象分析
    Nginx技术研究系列2-基于Redis实现动态路由
    hexo d 报错‘fatal: could not read Username for 'https://github.com': No error’
    从架构理解价值-我的软件世界观(转载)
    消息队列1:RabbitMQ解析并基于Springboot实战
    PostgreSQL之oracle_fdw安装与使用
    消息队列0:消息队列概述
    Java多线程1:进程和线程的区别
  • 原文地址:https://www.cnblogs.com/shenben/p/5923310.html
Copyright © 2011-2022 走看看