博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[POI2008]砖块Klo
阅读量:5240 次
发布时间:2019-06-14

本文共 2402 字,大约阅读时间需要 8 分钟。

题目

爆炸\(OJ\)机子太慢了吧实在不想打平衡树了

做法

烂大街的一个概念:求中位数

然后求前缀差和后缀差,主席树模板题

注意\(int\)\(long long\)

My complete code

#include
#pragma GCC optimize (2)#pragma G++ optimize (2)using namespace std;typedef long long LL;inline LL Read(){ LL x(0),f(1); char c=getchar(); while(c<'0' || c>'9'){ if(c=='-')f=-1; c=getchar(); } while(c>='0' && c<='9') x=(x<<3)+(x<<1)+c-'0', c=getchar(); return x*f;}const int inf=0x3f3f3f3f,maxn=1e7+9;int n,k,nod;int size[maxn],son[maxn][2],a[maxn],root[maxn],b[maxn],id[maxn];LL sum[maxn];void Update(int &now,int pre,int l,int r,int x,int val){ now=++nod; size[now]=size[pre]+1; sum[now]=sum[pre]+(LL)val; if(l==r) return; int mid(l+r>>1); if(x<=mid){ Update(son[now][0],son[pre][0],l,mid,x,val); son[now][1]=son[pre][1]; }else{ Update(son[now][1],son[pre][1],mid+1,r,x,val); son[now][0]=son[pre][0]; }}int Qkth(int now,int pre,int l,int r,int k){ if(l==r) return b[l]; int ret(size[son[now][0]]-size[son[pre][0]]); int mid(l+r>>1); if(k>ret) return Qkth(son[now][1],son[pre][1],mid+1,r,k-ret); else return Qkth(son[now][0],son[pre][0],l,mid,k);}LL Qll(int now,int pre,int l,int r,int x,int val){ if(l==r) return (LL)val-b[l]; int mid(l+r>>1); if(x<=mid) return Qll(son[now][0],son[pre][0],l,mid,x,val); else return (LL)(size[son[now][0]]-size[son[pre][0]])*val-(sum[son[now][0]]-sum[son[pre][0]])+Qll(son[now][1],son[pre][1],mid+1,r,x,val);}LL Qbg(int now,int pre,int l,int r,int x,int val){ if(l==r) return b[l]-val; int mid(l+r>>1); if(x<=mid) return Qbg(son[now][0],son[pre][0],l,mid,x,val)+(sum[son[now][1]]-sum[son[pre][1]])-(LL)(size[son[now][1]]-size[son[pre][1]])*val; else return Qbg(son[now][1],son[pre][1],mid+1,r,x,val);}int main(){ n=Read(); k=Read(); for(int i=1;i<=n;++i) a[i]=b[i]=Read(); sort(b+1,b+1+n); int cnt=unique(b+1,b+1+n)-b-1; for(int i=1;i<=n;++i){ id[i]=lower_bound(b+1,b+1+cnt,a[i])-b; Update(root[i],root[i-1],1,cnt,id[i],a[i]); } int mid(k+1>>1),fir,mi; LL ans(1e18); for(int l=1;l+k-1<=n;++l){ int r(l+k-1); LL ret(0); int zw=Qkth(root[r],root[l-1],1,cnt,mid); int x=lower_bound(b+1,b+1+cnt,zw)-b; ret+=Qll(root[r],root[l-1],1,cnt,x,zw); ret+=Qbg(root[r],root[l-1],1,cnt,x,zw); if(ret

转载于:https://www.cnblogs.com/y2823774827y/p/10479123.html

你可能感兴趣的文章
poj 1331 Multiply
查看>>
严重: 文档无效: 找不到语法。 at (null:2:19)
查看>>
tomcat7的数据库连接池tomcatjdbc的25个优势
查看>>
Html 小插件5 百度搜索代码2
查看>>
nodejs-Path模块
查看>>
P1107 最大整数
查看>>
EasyDarwin开源手机直播方案:EasyPusher手机直播推送,EasyDarwin流媒体服务器,EasyPlayer手机播放器...
查看>>
监控CPU和内存的使用
查看>>
Ubuntu14.04设置开机自启动程序
查看>>
ios app 单元测试 自动化测试
查看>>
年薪二十万
查看>>
强连通tarjan模版
查看>>
javascript_09-数组
查看>>
多进程与多线程的区别
查看>>
PAT 1145 1078| hashing哈希表 平方探测法
查看>>
Ubuntu(虚拟机)下安装Qt5.5.1
查看>>
Linux第七周学习总结——可执行程序的装载
查看>>
java.io.IOException: read failed, socket might closed or timeout, read ret: -1
查看>>
细说php(二) 变量和常量
查看>>
iOS开发网络篇之Web Service和XML数据解析
查看>>