Vijos1459 车展 (数学)
2016-11-03 23:34
169 查看
描述
遥控车是在是太漂亮了,韵韵的好朋友都想来参观,所以游乐园决定举办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以内。
来源
birdor
分析可知,将高度都调整成区间中位数时,代价最小。
枚举i作为中心,向两边扩展序列。
先扩展左边,用链表记录每个“大于a[i]的数比小于a[i]的数多x”的位置po1。
再扩展右边,用右边的每个“大于a[i]的数比小于a[i]的数少x”的位置po2,匹配之前左边记录的位置,则mid[po1][po2]=i
之后O(n^2)暴力累加调整高度的花费。
/*by SilverN*/ #include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<vector> using namespace std; const int mxn=1010; int read(){ int x=0,f=1;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; } int pre[mxn],id[mxn],m[mxn<<2]; int mid[mxn][mxn]; int a[mxn]; int n,Q; int main(){ n=read();Q=read(); int i,j; for(i=1;i<=n;i++){a[i]=read();} for(i=1;i<=n;i++){ memset(id,0,sizeof id); memset(m,-1,sizeof m); memset(pre,0,sizeof pre); int x=0,d=0,cnt=1; for(j=i;j;j--){ if(a[j]>a[i])d++; else x++; id[cnt]=j; pre[cnt]=m[d-x+mxn]; m[d-x+mxn]=cnt++; } d=0;x=-1; for(j=i;j<=n;j++){ if(a[j]>a[i])d++; else x++; for(int k=m[x-d+mxn];k!=-1;k=pre[k]){ if( (j-id[k]+1)%2==0 )mid[id[k]][j]=a[i]; } for(int k=m[x-d-1+mxn];k!=-1;k=pre[k]){ if( (j-id[k])%2==0 )mid[id[k]][j]=a[i]; } } } int st,ed; long long ans=0; while(Q--){ st=read();ed=read(); long long res=0; // printf("mid:%d\n",mid[st][ed]); for(i=st;i<=ed;i++)res+=abs(a[i]-mid[st][ed]); // printf("%d\n",res); ans+=res; } printf("%lld\n",ans); return 0; }
相关文章推荐
- [vijos1459]车展(splay)
- 【Vijos1459】车展
- Vijos1459 车展 (treap)
- Vijos1459 车展
- 【原创】【组合数学】vijos-1629 八(容斥原理+最小公倍数)
- [NOIP2009][vijos1814]细胞分裂(数学相关)
- [Vijos 1137] 组合数 · 数学
- 【数学规律】Vijos P1582 笨笨的L阵游戏
- vijos 1459 treap
- Vijos 1943-上学路上【组合数学】
- 车展(vijos P1459)
- vijos P1459车展
- Vijos 连续数之和 (组合数学)
- 1882石阶上的砖——数学大法vijos
- Vijos P1459 车展 treap求任意区间中位数
- [30] Vijos P1465 进制转换(数学,vector)
- Vijos P1131 最小公倍数和最大公约数问题【数学推理】
- 【数学相关、规律】Vijos P1582 笨笨的L阵游戏
- NOIP 2011 提高组 选择客栈(vijos 1737)(方法:队列,数学)
- vijos p1768 数学