BZOJ5319: [Jsoi2018]军训列队
BZOJ5319: [Jsoi2018]军训列队
https://lydsy.com/JudgeOnline/problem.php?id=5319
分析:
- 易知把所有人按原本的顺序放到\([K,K+len-1]\)这些位置上是最优的。
 - 我们只需要求一个\(mid\), 满足从\(mid\)以后的人都是向左移动。
 - 这个可以用二分+主席树在\(O(nlog^2)\)的时间内解决, 然后过不去。
 - 变成直接在主席树上二分就好了,需要一点小技巧。
 - 即二分走的区间不一定包含答案点,但可能是答案点减\(1\), 在叶子上特判即可。
 
代码:
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;
typedef long long ll;
#define N 500050
#define M 1500000
int n,m,a[N];
int siz[N*30],ls[N*30],rs[N*30],cnt,root[N];
ll sum[N*30];
void update(int l,int r,int x,int &p,int q) {
	p=++cnt; ls[p]=ls[q]; rs[p]=rs[q]; siz[p]=siz[q]+1; sum[p]=sum[q]+x;
	if(l==r) return ;
	int mid=(l+r)>>1;
	if(x<=mid) update(l,mid,x,ls[p],ls[q]);
	else update(mid+1,r,x,rs[p],rs[q]);
}
ll c,now,s[N];
ll S(ll l,ll r) {return (l+r)*(r-l+1)/2;}
ll query(int l,int r,int p,int q) {
	if(l==r) {
		if(siz[p]>siz[q]&&l<now) {c++; return l;}
		else return 0;
	}
	int mid=(l+r)>>1,sizls=siz[ls[p]]-siz[ls[q]];
	if(!sizls) return query(mid+1,r,rs[p],rs[q]);
	if(mid<=now+sizls-1) {
		c+=sizls, now+=sizls;
		return query(mid+1,r,rs[p],rs[q])+sum[ls[p]]-sum[ls[q]];
	}else return query(l,mid,ls[p],ls[q]);
}
int main() {
	scanf("%d%d",&n,&m);
	int i,l,r,k;
	for(i=1;i<=n;i++) scanf("%d",&a[i]),s[i]=s[i-1]+a[i],update(1,M,a[i],root[i],root[i-1]);
	while(m--) {
		scanf("%d%d%d",&l,&r,&k);
		now=k; c=0;
		ll tot=query(1,M,root[r],root[l-1]);
		ll ans=S(k,k+c-1)-tot  +  s[r]-s[l-1]-tot-S(k+c,k+r-l);
		printf("%lld\n",ans);
	}
}
												
											BZOJ5319: [Jsoi2018]军训列队的更多相关文章
- 【BZOJ5319】军训列队(主席树)
		
[BZOJ5319]军训列队(主席树) 题面 BZOJ 洛谷 题解 一眼题既视感... 首先很明显,每次询问的结果显然是做一次离散. 然后直接上主席树就好了... 查询答案的方式也很简单 考虑一下那个 ...
 - [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 ...
 - 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]\) 区间内的学生跑到 ...
 - bzoj 5319: [Jsoi2018]军训列队
		
Description Solution 最优情况可以是所有人按位置从小到大排序之后依次占到自己 \(K+\) 排名的位置上去 因为每一个休息位置不同,那么一定递增,所以一定存在一个分界点,左边的是往 ...
 - BZOJ5319/LOJ2551「JSOI2018」列队
		
问题描述 作为一名大学生,九条可怜在去年参加了她人生中的最后一次军训. 军训中的一个重要项目是练习列队,为了训练学生,教官给每一个学生分配了一个休息位置.每次训练开始前,所有学生都在各自的休息位置休息 ...
 - BZOJ5319 JSOI2018列队(主席树)
		
显然集合后相对位置不变最优.主席树上二分向左和向右的分界点即可.注意主席树的值域.我怎么天天就写点一眼题啊. #include<iostream> #include<cstdio&g ...
 - LOJ 2551 「JSOI2018」列队——主席树+二分
		
题目:https://loj.ac/problem/2551 答案是排序后依次走到 K ~ K+r-l . 想维护一个区间排序后的结果,使得可以在上面二分.求和:二分可以知道贡献是正还是负. 于是想用 ...
 
随机推荐
- selection   createTextRange  setSelectionRange
			
http://www.cnblogs.com/rainman/archive/2011/02/27/1966482.html http://www.zhangxinxu.com/wordpress/2 ...
 - Understanding When to use RabbitMQ or Apache Kafka
			
https://content.pivotal.io/rabbitmq/understanding-when-to-use-rabbitmq-or-apache-kafka How do humans ...
 - Adjust Linux Mint Mouse Scroll (Normal/Reverse)
			
Set Scroll Normal 1 echo "pointer = 1 2 3 4 5 6 7 8 9 10 11 12" > ~/.Xmodmap && ...
 - 写python中的装饰器
			
python中的装饰器主要用于在已有函数实现功能前附加需要输出的信息,下面将用实例展示我如何写装饰器. 首先分别尝试写装饰器装饰一个无参函数和一个有参函数(被装饰函数仅输出,无返回值情况下) def ...
 - 【leetcode刷题笔记】Interleaving String
			
Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2. For example,Given:s1 = ...
 - OPENGL ES2.0如何不使用glActiveTexture而显示多个图片
			
https://www.oschina.net/question/253717_72107 用opengl es 2.0显示多个图片的话,我只会一种方式,先将图片生成纹理,然后用下面的方式渲染 // ...
 - imx6solo wm8960始终没有声音输出
			
我尝试各种办法,wm8960始终不能得到声音输出.调试过程如下: 首先,打开电源使能脚: ret=gpio_request(SABRESD_CODEC_PWR_EN,"audio_pwr_e ...
 - Vue全家桶 vue + vue-router + vuex
			
Vue实例的生命周期钩子函数(8个) 1. beforeCreate data属性光声明没有赋值的时候 2. created ...
 - 字符串哈希小结(BKDR,RK)
			
前言 A:这么简单的东西,怎么现在才学?? B:别提了,还不是因为菜o(╥﹏╥)o A:那打算讲些什么东西 B:\(BKDRHash\).\(Rabin-karp\)以及简单应用 简洁 所谓字符串哈希 ...
 - centos 下安装python3.6.2
			
具体详情: http://www.cnblogs.com/vurtne-lu/p/7068521.html