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)。
输出格式
一个正整数,调整展台总用时的最小值。
限制
各个测试点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; }