BZOJ1112[POI2008]砖块Klo——非旋转treap
题目描述
N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖,放到另一柱.仓库无限大. 现在希望用最小次数的动作完成任务.
输入
第一行给出N,K. (1 ≤ k ≤ n ≤ 100000), 下面N行,每行代表这柱砖的高度.0 ≤ hi ≤ 1000000
输出
最小的动作次数
样例输入
3
9
2
3
1
样例输出
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<cstdio>
#include<bitset>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
ll ans;
int n,k;
int s[100010];
struct treap
{treap *ls,*rs;int size;int val;int rnd;ll sum;treap(){}treap(treap *son,int v){ls=rs=son;size=1;val=v;sum=1ll*v;rnd=rand();}void pushup(){sum=ls->sum+rs->sum+val;size=ls->size+rs->size+1;}
}tr[100010],nil;
typedef treap* node;
node root,null,cnt;
node a,b,c;
inline void init()
{nil=treap(NULL,0);null=&nil;null->ls=null->rs=null;null->size=0;root=null;cnt=tr;
}
inline node build(int v)
{*cnt=treap(null,v);return cnt++;
}
inline node merge(node x,node y)
{if(x==null){return y;}if(y==null){return x;}if(x->rnd<y->rnd){x->rs=merge(x->rs,y);x->pushup();return x;}else{y->ls=merge(x,y->ls);y->pushup();return y;}
}
inline void split1(node rt,node &x,node &y,int k)
{if(rt==null){x=y=null;return ;}if(rt->ls->size>=k){y=rt;split1(rt->ls,x,y->ls,k);}else{x=rt;split1(rt->rs,x->rs,y,k-1-rt->ls->size);}rt->pushup();
}
inline void split2(node rt,node &x,node &y,int k)
{if(rt==null){x=y=null;return ;}if(rt->val>=k){y=rt;split2(rt->ls,x,y->ls,k);}else{x=rt;split2(rt->rs,x->rs,y,k);}rt->pushup();
}
inline void query()
{split1(root,a,b,k/2);split1(b,b,c,1);ll res=1ll*a->size*b->val-a->sum;res+=c->sum-1ll*c->size*b->val;ans=min(res,ans);root=merge(merge(a,b),c);
}
int main()
{srand(12378);scanf("%d%d",&n,&k);ans=1ll<<60;init();for(int i=1;i<=n;i++){scanf("%d",&s[i]);}for(int i=1;i<=k;i++){split2(root,a,b,s[i]);root=merge(merge(a,build(s[i])),b);}query();for(int i=k+1;i<=n;i++){split2(root,a,b,s[i-k]);split1(b,b,c,1);root=merge(a,c);split2(root,a,b,s[i]);root=merge(merge(a,build(s[i])),b);query();}printf("%lld",ans);
}
转载于:https://www.cnblogs.com/Khada-Jhin/p/10731075.html
BZOJ1112[POI2008]砖块Klo——非旋转treap相关推荐
- bzoj1112[POI2008]砖块Klo*
bzoj1112[POI2008]砖块Klo 题意: N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:丢掉某柱砖的一块砖.给某柱加上一块砖,现在希望用最小次数的动作完成任务.N≤1 ...
- BZOJ1112 - [POI2008]砖块Klo
原题链接 题意简述 给出一个n(n≤105)n(n \leq 10^5)个数的序列a(max{a}≤106)a(max\{a\}\leq10^6),每次给一个数+1/-1.求使得序列中存在连续k(k≤ ...
- 【主席树】bzoj1112: [POI2008]砖块Klo
数据结构划一下水 Description N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖,放到另一柱.仓库无限大. ...
- BZOJ1112: [POI2008]砖块Klo(洛谷P3466)
平衡树 BZOJ题目传送门 洛谷题目传送门 动态维护中位数,平衡树上一发就好了. 代码: #include<cctype> #include<cstdio> #include& ...
- BZOJ1112: [POI2008]砖块Klo
Description N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖,放到另一柱.仓库无限大. 现在希望用最小次 ...
- bzoj1112: [POI2008]砖块Klo(splay)
题面在这里 做法 枚举每长度为 k k k 的段寻找中位数即可.splay维护. 代码 => 主要是想说这一点,由于计算的必要,相同的数不能合并到一个节点,否则之后调用 sum[ch[x][0] ...
- 4923: [Lydsy1706月赛]K小值查询 平衡树 非旋转Treap
国际惯例的题面: 这种维护排序序列,严格大于的进行操作的题都很套路...... 我们按照[0,k],(k,2k],(2k,inf)分类讨论一下就好. 显然第一个区间的不会变化,第二个区间的会被平移进第 ...
- [Codeforces702F]T-Shirts——非旋转treap+贪心
题目链接: Codeforces702F 题目大意:有$n$种T恤,每种有一个价格$c_{i}$和品质$q_{i}$且每种数量无限.现在有$m$个人,第$i$个人有$v_{i}$元,每人每次会买他能买 ...
- BZOJ3223文艺平衡树——非旋转treap
此为平衡树系列第二道:文艺平衡树您需要写一种数据结构,来维护一个有序数列,其中需要提供以下操作: 翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 ...
最新文章
- IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
- Windows Azure 如何学习Azure
- idea 生成sdk,如何安装独立的Android SDK,然后将其添加到Windows上的IntelliJ IDEA?
- css 语音,用css完成语音助手小动画
- android安卓机版市场,安卓各版本市场份额数据更新 安卓8.0暴增
- java学习(156):反序列化
- python数据结构的列表_Python自带数据结构 列表(list)
- 利用,ArrayList,HashMap,洗牌,发牌,看牌。
- Mozilla 的 Flash 杀手 'Shumway' 已经现身
- 20200327:最大矩形(leetcode85)
- Hack, Everything!
- Ruby on Rails,创建模型,附赠模型与表名不一致时的解决方法
- 【002:带参宏调试】
- 相机姿态估计(三)--P3P
- Java运行环境的配置(JDK和JRE)
- 地表温度数据、LST温度数据、地表反照率、NDVI数据、NPP数据、植被覆盖度、土地利用数据
- Atitit MATLAB 图像处理 经典书籍attilax总结
- aauto的listview(类似于C#的datagrid) 支持文件拖拽获取名单
- Jmeter接口压力测试
- 如何快速给多张图片添加边框,这招你一定要会