bzoj 5319: [Jsoi2018]军训列队
Description

Solution
最优情况可以是所有人按位置从小到大排序之后依次占到自己 \(K+\) 排名的位置上去
因为每一个休息位置不同,那么一定递增,所以一定存在一个分界点,左边的是往右走,右边的往左走
在主席树上二分出这个分界点即可
#include<bits/stdc++.h>
using namespace std;
template<class T>void gi(T &x){
int f;char c;
for(f=1,c=getchar();c<'0'||c>'9';c=getchar())if(c=='-')f=-1;
for(x=0;c<='9'&&c>='0';c=getchar())x=x*10+(c&15);x*=f;
}
typedef long long ll;
const int N=500010,inf=1e9;
int n,Q,a[N],rt[N],tt=0,m=0,K,c=0;ll sum[N];
struct data{
int ls,rs,w;ll s;
}tr[N*25];
inline void ins(int &x,int l,int r,int sa){
tr[++tt]=tr[x];x=tt;tr[x].w++;tr[x].s+=sa;
if(l==r)return ;
int mid=(l+r)>>1;
if(sa<=mid)ins(tr[x].ls,l,mid,sa);
else ins(tr[x].rs,mid+1,r,sa);
}
inline ll qry(int x,int y,int l,int r){
if(l==r){
if(tr[x].w-tr[y].w && l<=K){c++;return l;}
return 0;
}
int mid=(l+r)>>1,o=tr[tr[x].ls].w-tr[tr[y].ls].w;
if(!o || mid<=o+K-1){
c+=o;K+=o;
return qry(tr[x].rs,tr[y].rs,mid+1,r)+tr[tr[x].ls].s-tr[tr[y].ls].s;
}
return qry(tr[x].ls,tr[y].ls,l,mid);
}
int main(){
freopen("pp.in","r",stdin);
freopen("pp.out","w",stdout);
cin>>n>>Q;
for(int i=1;i<=n;i++)gi(a[i]),m=max(m,a[i]),sum[i]=sum[i-1]+a[i];
for(int i=1;i<=n;i++)rt[i]=rt[i-1],ins(rt[i],1,m,a[i]);
int l,r,k;
while(Q--){
gi(l);gi(r);gi(k);K=k;c=0;
ll tot=qry(rt[r],rt[l-1],1,m);
ll ans=(1ll*c*(2*k+c-1)>>1)-tot+
sum[r]-sum[l-1]-tot-(1ll*(c+2*k+r-l)*(r-l+1-c)>>1);
printf("%lld\n",ans);
}
return 0;
}
bzoj 5319: [Jsoi2018]军训列队的更多相关文章
- BZOJ.5319.[JSOI2018]军训列队(主席树)
LOJ BZOJ 洛谷 看错了,果然不是\(ZJOI\)..\(jry\)给\(JSOI\)出这么水的题做T3么= = 感觉说的有点乱,不要看我写的惹=-= 对于询问\(l,r,k\),设\(t=r- ...
- 洛谷 P4559: bzoj 5319: [JSOI2018]军训列队
题目传送门:洛谷 P4559. 题意简述: 有 \(n\) 个学生,编号为 \(i\) 的学生有一个位置 \(a_i\). 有 \(m\) 个询问,每次询问编号在 \([l,r]\) 区间内的学生跑到 ...
- BZOJ5319: [Jsoi2018]军训列队
BZOJ5319: [Jsoi2018]军训列队 https://lydsy.com/JudgeOnline/problem.php?id=5319 分析: 易知把所有人按原本的顺序放到\([K,K+ ...
- [JSOI2018]军训列队
[JSOI2018]军训列队 题目大意: \(n(n\le5\times10^5)\)个学生排成一排,第\(i\)个学生的位置为\(a_i\).\(m(m\le5\times10^5)\)次命令,每次 ...
- BZOJ5319 & 洛谷4559 & LOJ2551:[JSOI2018]军训列队——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5319 https://www.luogu.org/problemnew/show/P4559 ht ...
- 【BZOJ5319】军训列队(主席树)
[BZOJ5319]军训列队(主席树) 题面 BZOJ 洛谷 题解 一眼题既视感... 首先很明显,每次询问的结果显然是做一次离散. 然后直接上主席树就好了... 查询答案的方式也很简单 考虑一下那个 ...
- BZOJ5319/LOJ2551「JSOI2018」列队
问题描述 作为一名大学生,九条可怜在去年参加了她人生中的最后一次军训. 军训中的一个重要项目是练习列队,为了训练学生,教官给每一个学生分配了一个休息位置.每次训练开始前,所有学生都在各自的休息位置休息 ...
- BZOJ 2720: [Violet 5]列队春游
2720: [Violet 5]列队春游 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 189 Solved: 133[Submit][Status] ...
- LOJ 2551 「JSOI2018」列队——主席树+二分
题目:https://loj.ac/problem/2551 答案是排序后依次走到 K ~ K+r-l . 想维护一个区间排序后的结果,使得可以在上面二分.求和:二分可以知道贡献是正还是负. 于是想用 ...
随机推荐
- Python【 模块】
module模块:一个py文件就是一个模块 好处: 提高代码的可维护性 可重用 使用模块可以避免函数名和变量名冲突 分类: 标准库模块 第三方模块 自定义模块 调用方法: import 模块 # .p ...
- nej+regular环境使用es6的低成本方案
本文来自 网易云社区 . 希望在生产环境中使用es6/7,babel应该是最普遍的选择.这是babel官网中,它对自己的定义: Babel 自带了一组 ES2015 语法转化器.这些转化器能让你现在就 ...
- 201621123012《Java程序设计》第八周学习总结
1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 2. 书面作业 1. ArrayList代码分析 1.1 解释ArrayList的contains源代码 答:如果为空的时候 ...
- 蛋疼的Action.c (141): undeclared identifier `LAST'异常
之前这个脚本运行了很久都没有问题,今天突然在场景运行不了: Action.c (141): undeclared identifier `LAST' 害的老子一直在纠结,这个关联函数没有问题啊,怎么一 ...
- 在Java中如何优雅地判空
判空灾难 作为搬砖党的一族们,我们对判空一定再熟悉不过了,不要跟我说你很少进行判空,除非你喜欢NullPointerException. 不过NullPointerException对于很多猿们来 ...
- [ActionScript 3.0] 如何控制加载swf动画的播放与暂停
此方法适用于用as 1.0或者as2.0以及as3.0编译的swf,因为as1.0和as2.0编译的swf是AVM1Movie类型,因此需要通过类ForcibleLoader.as将其转换为versi ...
- 外网域名映射内网Ip 内网使用外网域名的https证书
用nslookup www.baidu.com nslookup www.qq.com 15.64.64.53 测试了内网的dns可以解析外网域名 那么我买个外网域名,再对这个外网域名买个证书,然后外 ...
- JavaScript中setInterval的用法总结
setInterval动作的作用是在播放动画的时,每隔一定时间就调用函数,方法或对象.可以使用本动作更新来自数据库的变量或更新时间显示. setInterval动作的语法格式如下:setInterva ...
- dbproxy-user/pwd
dbproxy 的账号是统一的, 即连接dbproxy,连接主mysql ,连接从mysql 的账号必须一样, 为了隔离 即使用dbproxy的人感知不到mysql, 需要分离 配置文件 #dbpro ...
- 2016级算法第二次上机-E.AlvinZH的儿时梦想——运动员篇
862-AlvinZH的儿时梦想--运动员篇 思路 难题. 应该想到,不管给出的数据如何,每一个淘汰的人不会对最终答案产生任何影响,所以每次淘汰就把人除掉就可以了,最后剩下的两个人计算它们从开始到相遇 ...