Vijos P1459 车展 treap求任意区间中位数
描述
遥控车是在是太漂亮了,韵韵的好朋友都想来参观,所以游乐园决定举办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以内。
题解
用treap n^2logn预处理中位数参考hzwer
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int N = 1e5+, M = 1e3+, MOD = 1e9+, inf = 2e9;
typedef long long ll; struct data{int l,r,v,size,rnd,w;ll sum;}tr[N * ]; int n,siz ,m, a[N],root, ans[M][M] ,Sum,cnt,snt; void update(int k) {
tr[k].size = tr[tr[k].l].size+tr[tr[k].r].size + tr[k].w;
tr[k].sum = tr[tr[k].l].sum + tr[tr[k].r].sum + tr[k].w*tr[k].v;
}
void lturn(int &k) {
int t=tr[k].r;tr[k].r=tr[t].l;tr[t].l=k;update(k);update(t);k=t;
}
void rturn(int &k) {
int t=tr[k].l;tr[k].l=tr[t].r;tr[t].r=k;update(k);update(t);k=t;
}
void insert(int &k,int x) {
if(!k) {
k=++siz;
tr[k].w=tr[k].size=;
tr[k].v=tr[k].sum=x;
tr[k].rnd = rand();
tr[k].l = tr[k].r =;
return ;
}
tr[k].size++;tr[k].sum+=x;
if(tr[k].v==x) tr[k].w++;
else if(x>tr[k].v) {
insert(tr[k].r,x);
if(tr[tr[k].r].rnd<tr[k].rnd) lturn(k);
}else {
insert(tr[k].l,x);
if(tr[tr[k].l].rnd<tr[k].rnd) rturn(k);
}
}
int query(int k,int x) {
if(x<=tr[tr[k].l].size) return query(tr[k].l,x);
else if(x>tr[tr[k].l].size + tr[k].w) {
cnt+=tr[tr[k].l].size + tr[k].w;
snt+=tr[tr[k].l].sum+tr[k].w*tr[k].v;
return query(tr[k].r,x - tr[tr[k].l].size - tr[k].w);
}else {
cnt+=tr[tr[k].l].size;
snt+=tr[tr[k].l].sum;
return tr[k].v;
}
}
int main() {
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
for(int i=;i<=n;i++) {
root = siz = ;
Sum = ;
for(int j=i;j<=n;j++) {
Sum += a[j];
insert(root,a[j]);
cnt = snt = ;
int ave = query(root,(j-i+) / );
ans[i][j] = cnt*ave - snt + Sum - snt - (j-i+-cnt)*ave;
}
}
ll all = ;
while(m--) {
int l,r;
scanf("%d%d",&l,&r);
all+=ans[l][r];
}
cout<<all<<endl;
}
Vijos P1459 车展 treap求任意区间中位数的更多相关文章
- Vijos P1459 车展 (treap 任意区间中位数)
题面: 描述 遥控车是在是太漂亮了,韵韵的好朋友都想来参观,所以游乐园决定举办m次车展.车库里共有n辆车,从左到右依次编号为1,2,…,n,每辆车都有一个展台.刚开始每个展台都有一个唯一的高度h[i] ...
- vijos P1459 车展(Treap,中位数)
P1459车展 描述 遥控车是在是太漂亮了,韵韵的好朋友都想来参观,所以游乐园决定举办m次车展.车库里共有n辆车,从左到右依次编号为1,2,…,n,每辆车都有一个展台.刚开始每个展台都有一个唯一的 ...
- vijos P1459车展
P1459车展 Accepted 标签:数据结构 平衡树数据结构 堆重游SC theme Park 描述 遥控车是在是太漂亮了,韵韵的好朋友都想来参观,所以游乐园决定举办m次车展.车库里共有n ...
- 线段树 区间更新(更新区间[x,y]的值,再求任意区间[x,y]的和)
#1078 : 线段树的区间修改 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题 ...
- 【c++】用c++编写的求任意区间的素数的小程序
#include using namespace std; int main() { cout<<"*************************************** ...
- POJ 3468 区间更新(求任意区间和)A Simple Problem with Integers
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 163977 ...
- 询问任意区间的min,max,gcd,lcm,sum,xor,or,and
给我们n个数,然后有m个询问,每个询问为L,R,询问区间[L,R]的最大最小值,最小公约数,最大公约数,和,异或,或,且 这些问题通通可以用RMQ的思想来解决. 以下用xor来作为例子 设dp[i][ ...
- Hdu 4251 区间中位数(划分树)
题目链接 The Famous ICPC Team Again Time Limit: 30000/15000 MS (Java/Others) Memory Limit: 32768/3276 ...
- 求任意长度数组的最大值(整数类型)。利用params参数实现任意长度的改变。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
随机推荐
- C#读写SQL Server数据库图片
效果图: 下载链接: http://download.csdn.net/detail/u010312811/9492402 1.创建一个Winform窗体,窗体分为“数据上传”和“数据读取”两部分: ...
- poj 2524 (并查集)
http://poj.org/problem?id=2524 题意:在一所学校里面的人,都有宗教信仰,不过他们的宗教信仰有可能相同有可能不同,但你又不能直接去问他们,但你可以问他们和谁是同一个宗教.通 ...
- Bootstrap datepicker可配置网址
http://eternicode.github.io/bootstrap-datepicker/?markup=input&format=&weekStart=&startD ...
- python virtualenv环境运行django
python virtualenv环境运行django 安装前准备 检查pip版本与python版本是否一致 [root@localhost bin]# whereis pip pip: /usr/b ...
- jenkins gitlab整合注意事项
jenkins整合gitlab时,Source Code Management添加gitlab仓库路径无论怎么尝试都报如下两个异常: Failed to connect to repository : ...
- JS 判断图片尺寸大小,以便页面resize时,动态调整页面元素位置
){ clearInterval(global_timename4pool); } } //由于无法判断图片显示完整的时机,只好用定时器来做,计算完成后再关掉定时器. global_timename4 ...
- C#关于new的用法
1.运算符就是在实例化一个类的时候(运算符的用法) A a=new A(); 2.new 约束指定泛型类声明中的任何类型参数都必须有公共无参数构造函数.当泛型类创建类型的新实例时,将此约束应用于类型参 ...
- 【leetcode】Climbing Stairs (easy)
You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb ...
- python getopt.getopt 不能精确匹配的问题
代码:opts,argv = getopt.getopt(sys.argv[1:],('u:'),['ad','join','passwd=','domain=','dip=','test','ip= ...
- GridView如何合并同类项
/// <summary> /// 合并GridView中某列相同信息的行(单元格) /// </summary> /// <param name ...