vijos P1459车展

P1459车展

Accepted

标签:数据结构 平衡树数据结构 堆重游SC theme Park

描述

遥控车是在是太漂亮了,韵韵的好朋友都想来参观,所以游乐园决定举办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;
}
时间: 2024-10-05 02:52:38

vijos P1459车展的相关文章

Vijos P1459 车展 treap求任意区间中位数

描述 遥控车是在是太漂亮了,韵韵的好朋友都想来参观,所以游乐园决定举办m次车展.车库里共有n辆车,从左到右依次编号为1,2,…,n,每辆车都有一个展台.刚开始每个展台都有一个唯一的高度h[i].主管已经列好一张单子:L1 R1L2 R2…Lm Rm单子上的(Li,Ri)表示第i次车展将要展出编号从Li到Ri的车. 为了更加美观,展览时需要调整展台的高度,使参展所有展台的高度相等.展台的高度增加或减少1都需花费1秒时间.由于管理员只有一个人,所以只好对每个展台依次操作.每次展览结束后,展台高度自动

车展(vijos P1459)

描述 遥控车是在是太漂亮了,韵韵的好朋友都想来参观,所以游乐园决定举办m次车展.车库里共有n辆车,从左到右依次编号为1,2,…,n,每辆车都有一个展台.刚开始每个展台都有一个唯一的高度h[i].主管已经列好一张单子: L1 R1 L2 R2 … Lm Rm 单子上的(Li,Ri)表示第i次车展将要展出编号从Li到Ri的车. 为了更加美观,展览时需要调整展台的高度,使参展所有展台的高度相等.展台的高度增加或减少1都需花费1秒时间.由于管理员只有一个人,所以只好对每个展台依次操作.每次展览结束后,展

【以前的空间】几道平衡树

vijos 1459 车展 一个空的树.. 依次添加1到n.就能解决左端点为1的所有询问了吧.然后从2开始做一遍啊...n方logn得到全部答案."神牛的话就是这么吊--看上去没什么信息量但还是水很深--实际上要维护子树内元素和.也就是我程序里面写的change,lsum指左子树中所有点的值得和,rsum指右子树中所有点的值得和,zsum指整个子树中节点的和,也就是lsum+rsum+本节点的值.在计算代价的时候是这样的--假设从i加到j需到的代价为sum,首先找到中间值,就是排名为(j-i)d

Vijos P1066 弱弱的战壕【多解,线段树,暴力,树状数组】

弱弱的战壕 描述 永恒和mx正在玩一个即时战略游戏,名字嘛~~~~~~恕本人记性不好,忘了-_-b. mx在他的基地附近建立了n个战壕,每个战壕都是一个独立的作战单位,射程可以达到无限(“mx不赢定了?!?”永恒[email protected][email protected]). 但是,战壕有一个弱点,就是只能攻击它的左下方,说白了就是横纵坐标都不大于它的点(mx:“我的战壕为什么这么菜”ToT).这样,永恒就可以从别的地方进攻摧毁战壕,从而消灭mx的部队. 战壕都有一个保护范围,同它的攻击

Vijos P1785 同学排序【模拟】

同学排序 描述 现有m位同学,第1位同学为1号,第2位同学为2号,依次第m位同学为m号.要求双号的学生站出来,然后余下的重新组合,组合完后,再次让双号的学生站出来,重复n次,问这时有多少同学出来站着? 样例1 样例输入1 1989 5 样例输出1 1926 限制 1s 提示 [数据范围] 1≤n≤10 100≤m≤100000 题目链接:https://vijos.org/p/1785 分析:站出序号为偶数的人,如果总人数为奇数,剩余人数向上取整再折半就好了! 下面给出AC代码: 1 #incl

Vijos 1057 盖房子

二次联通门 : Vijos 1057 盖房子 /* Vijos 1057 盖房子 简单的dp 当前点(i, j)所能构成的最大的正方形的边长 为点(i - 1, j - 1)与(i, j - 1), (i - 1, j)三点中最小的边长构成.. 一遍递推, 一边取最大即可 */ #include <cstdio> #define Max 1009 inline int min (int a, int b) { return a < b ? a : b; } inline int max

读车神探来了:上海车展大爆移动视频商业化图谋

作为重磅国际车展之一的上海车展已经于上月28日正式闭幕,据不完全统计,展会期间共接待观众近26万人,现场购车及订车16000余辆,销售金额近24.3亿元人民币. 文/张书乐 TMT行业观察者.游戏产业时评人,人民网.人民邮电报专栏作者 但较以往车展不同,人流最为密集的却不是展台,而是全国范围内移动视频用户们的手机屏幕.仅以一下科技(秒拍.一直播.小咖秀母公司)披露的数据为例:在一直播上,其携手闫闯.ai媚儿两个KOL,与奥迪于19日单日直播,累计观看量就达831.6万.点赞783.9万,最高在线

Vijos 1193 扫雷 【动态规划】

扫雷 描述 相信大家都玩过扫雷的游戏.那是在一个n*n的矩阵里面有一些雷,要你根据一些信息找出雷来.万圣节到了,"余"任过流行起了一种简单的扫雷游戏,这个游戏规则和扫雷一样,如果某个格子没有雷,那么它里面的数字表示和他8连通的格子里面雷的数目.现在棋盘是n*2的,第一列里某些格子是雷,而第二列没有雷,如:o 1* 2* 3* 2o 2* 2* 2 ('*'代表有雷,'o'代表无雷)由于第一类的雷有可能有多种方案满足第二列的数的限制,你的任务即根据第二列的信息求第一列雷有多少中摆放方案.

Vijos 1523 贪吃的九头龙 【树形DP】

贪吃的九头龙 背景 安徽省芜湖市第二十七中学测试题 NOI 2002 贪吃的九头龙(dragon) Description:OfficialData:OfficialProgram:Converted by JackDavid127 描述 传说中的九头龙是一种特别贪吃的动物.虽然名字叫"九头龙",但这只是说它出生的时候有九个头,而在成长的过程中,它有时会长出很多的新头,头的总数会远大于九,当然也会有旧头因衰老而自己脱落. 有一天,有M个脑袋的九头龙看到一棵长有N个果子的果树,喜出望外,