P4559 [JSOI2018]列队 主席树
时间:2019-09-21
本文章向大家介绍P4559 [JSOI2018]列队 主席树,主要包括P4559 [JSOI2018]列队 主席树使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题意: 有n个人 每个人有其一开始所在的位置 有m个询问 l r k 问编号为l到r的人填满区间 k----k+r-l 需要的最少距离
很容易发现按照原来的相对位置来填k开始的位置肯定是一种最优解
lr的编号区间很容易想到主席树
所以问题转化为如何优化主席树的询问
1、如果遍历每个人 然后累和每个人的距离 肯定会超时 复杂度接近on
2、可以分三种情况讨论
如果所有的人都在 应到位置的左边 那么贡献为
如果所有的人都在 应到位置的右边 那么贡献为
否则的话递归到子树继续进行分类
学会了主席树一种新的查询方式!!!
#include<bits/stdc++.h> using namespace std; #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define repp(i,a,b) for(int i=(a);i>=(b);--i) #define ll long long #define see(x) (cerr<<(#x)<<'='<<(x)<<endl) #define pb push_back #define inf 0x3f3f3f3f #define CLR(A,v) memset(A,v,sizeof A) typedef pair<int,int>pii; ////////////////////////////////// const int N=1e6+10; int T[N],lson[N<<5],rson[N<<5],ncnt,n,m; ll t[N<<5],sum[N<<5]; void upnode(int x,int l,int r,int pre,int &pos) { pos=++ncnt; lson[pos]=lson[pre];rson[pos]=rson[pre]; t[pos]=t[pre]+1; sum[pos]=sum[pre]+x; int m=(l+r)>>1; if(l==r)return ; if(x<=m)upnode(x,l,m,lson[pre],lson[pos]); else upnode(x,m+1,r,rson[pre],rson[pos]); } ll qsum(int L,int R,int l,int r,int pre,int pos) { if(L>R)return 0; if(r<=L)return 1ll*(L+R)*(R-L+1)/2-(sum[pos]-sum[pre]); if(l>=R)return (sum[pos]-sum[pre])-1ll*(L+R)*(R-L+1)/2; if(l==r)return 0;int m=(l+r)>>1; int peo=t[lson[pos]]-t[lson[pre]]; return qsum(L,L+peo-1,l,m,lson[pre],lson[pos])+qsum(L+peo,R,m+1,r,rson[pre],rson[pos]); } int main() { scanf("%d%d",&n,&m);int x; rep(i,1,n)scanf("%d",&x),upnode(x,1,1e6,T[i-1],T[i]); int l,r,k; while(m--) { scanf("%d%d%d",&l,&r,&k); printf("%lld\n",qsum(k,k+r-l,1,1e6,T[l-1],T[r])); } return 0; }
原文地址:https://www.cnblogs.com/bxd123/p/11562975.html
- linux下join命令的用法
- [编程经验] 我是如何半自动抓取素材公社图片的
- linux 便捷使用防火墙控制端口访问
- 洛谷 P3802 小魔女帕琪
- 【前沿】见人识面,TensorFlow实现人脸性别/年龄识别
- TensorFlow从0到1 - 1 - Hello, TensorFlow!
- iOS自动布局——Masonry详解
- BZOJ 3450: Tyvj1952 Easy
- [编程经验] TensorFlow实现线性支持向量机SVM
- TensorFlow从0到1 - 2 - TensorFlow核心编程
- BZOJ 4318: OSU!
- 讨厌算法的程序员 5 - 合并算法
- 洛谷 P2679 子串
- [编程经验] CVPR2017论文全集下载代码脚本分享
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android实现选项菜单子菜单
- Android scrollview如何监听滑动状态
- android 自定义圆角button效果的实例代码(自定义view Demo)
- Android开发简易音乐播放器
- Android 自定义ListView实现QQ空间界面(说说内包含图片、视频、点赞、评论、转发功能)
- Android自定义View实现自动吸附功能
- Qt音视频开发35-Onvif图片参数
- alpine安装openssl
- iOS14中的PHPicker
- Android 如何实现动态申请权限
- Android录屏的三种解决方案
- Android 实现将Bitmap 保存到本地
- Android Gradle依赖管理、去除重复依赖、忽略的方式
- Andriod Studio实现保存QQ密码功能(案例代码详解)
- Android Studio编写微信页面提交功能