BZOJ.5319.[JSOI2018]军训列队(主席树)
看错了,果然不是\(ZJOI\)。。\(jry\)给\(JSOI\)出这么水的题做T3么= =
感觉说的有点乱,不要看我写的惹=-=
对于询问\(l,r,k\),设\(t=r-l+1\)。对于指定区间\([k,k+t-1]\),显然\(k\)左边的人都要从\(k\)开始依次排列,\(k+t-1\)右边的人要从\(k+t-1\)往左依次排列。区间中的比较麻烦。
也比较显然的是存在一个点\(mid\in[k-1,k+t-1]\),使得\(mid\)左边的人都被排在\([k,mid]\)中,右边的人都被排到\([mid+1,k+t-1]\)中。而且代价很好算,就是需要求一个等差数列的和,以及左边所有人的坐标和。
考虑如何找这个\(mid\)。显然有\(mid\)左边人的数量等于\(mid-k+1\),所以可以二分+主席树,但是是\(\log^2\)的。
注意到查的区间是个前缀,所以可以直接在主席树上二分。
那么复杂度就是\(O(n\log n)\)啦。
莫名想写指针
为啥我的主席树这么慢_(:з」∠)_
//210300kb 12428ms
#include <cstdio>
#include <cctype>
#include <algorithm>
#define F(l,r) (1ll*((r)-(l)+1)*(l+r)>>1)//n(a1+an)/2... l<=r+1
#define gc() getchar()
#define MAXIN 500000
//#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
typedef long long LL;
const int N=5e5+5;
int A[N],root[N];
char IN[MAXIN],*SS=IN,*TT=IN;
struct Segment_Tree
{
#define ls son[x][0]
#define rs son[x][1]
#define lson ls,l,m,
#define rson rs,m+1,r
#define lson2 ls,son[y][0],l,m
#define rson2 rs,son[y][1],m+1,r
#define S N*21
int tot,son[S][2],sz[S];
LL lsum,rsum,sum[S];
#undef S
void Insert(int &x,int y,int l,int r,int p)
{
sz[x=++tot]=sz[y]+1, sum[x]=sum[y]+p;
if(l==r) return;
int m=l+r>>1;
p<=m?(rs=son[y][1],Insert(lson2,p)):(ls=son[y][0],Insert(rson2,p));
}
int Query(int x,int y,int l,int r,int K)//y-x
{
if(l==r) return lsum+=sum[y]-sum[x],l;//mid=k-1 -> lsum=sum[now]=0
int m=l+r>>1,t=sz[son[y][0]]-sz[ls];
return m-K+1>=t?(rsum+=sum[son[y][1]]-sum[rs],Query(lson2,K)):(lsum+=sum[son[y][0]]-sum[ls],Query(rson2,K+t));
}
}T;
inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-48,c=gc());
return now;
}
int main()
{
int n=read(),Q=read(),mx=0,mn=N;
for(int *s=A+1,*ed=A+1+n; s!=ed; ++s) mx=std::max(mx,*s=read()), mn=std::min(mn,*s);
for(int i=1; i<=n; ++i) T.Insert(root[i],root[i-1],mn,mx,A[i]);
for(int l,r,ql,qr; Q--; )
{
l=read(),r=read(),ql=read(),qr=ql+r-l;
if(ql<=mn||qr>=mx) printf("%lld\n",std::abs(T.sum[root[r]]-T.sum[root[l-1]]-F(ql,qr)));
else
{
T.lsum=0, T.rsum=0;
int mid=T.Query(root[l-1],root[r],mn,mx,ql);
printf("%lld\n",F(ql,mid)-T.lsum+T.rsum-F(mid+1,qr));
}
}
return 0;
}
BZOJ.5319.[JSOI2018]军训列队(主席树)的更多相关文章
- 洛谷 P4559: bzoj 5319: [JSOI2018]军训列队
题目传送门:洛谷 P4559. 题意简述: 有 \(n\) 个学生,编号为 \(i\) 的学生有一个位置 \(a_i\). 有 \(m\) 个询问,每次询问编号在 \([l,r]\) 区间内的学生跑到 ...
- bzoj 5319: [Jsoi2018]军训列队
Description Solution 最优情况可以是所有人按位置从小到大排序之后依次占到自己 \(K+\) 排名的位置上去 因为每一个休息位置不同,那么一定递增,所以一定存在一个分界点,左边的是往 ...
- LOJ 2551 「JSOI2018」列队——主席树+二分
题目:https://loj.ac/problem/2551 答案是排序后依次走到 K ~ K+r-l . 想维护一个区间排序后的结果,使得可以在上面二分.求和:二分可以知道贡献是正还是负. 于是想用 ...
- 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)\)次命令,每次 ...
- [BZOJ 2989]数列(二进制分组+主席树)
[BZOJ 2989]数列(二进制分组+主席树) 题面 给定一个长度为n的正整数数列a[i]. 定义2个位置的graze值为两者位置差与数值差的和,即graze(x,y)=|x-y|+|a[x]-a[ ...
- BZOJ5319 & 洛谷4559 & LOJ2551:[JSOI2018]军训列队——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5319 https://www.luogu.org/problemnew/show/P4559 ht ...
- BZOJ 2223 [Coci 2009]PATULJCI | 主席树练习 (好像是个权限题啊)
题目: 给个序列,问[l,r]区间内是否存在x>(r-l+1)>>1 题解: 好像大家都觉得这个题比较简单,没人写题解啊 先说BZOJ样例的格式应该是,第二个数是序列中数的范围(就是 ...
- bzoj 4448 [Scoi2015]情报传递(主席树,LCA)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4448 [题意] 给定一颗树,询问一条路径上权值小于t-c的点数. [思路] 将一个2查 ...
随机推荐
- 散列(C++实现)
散列的构成:散列函数,散列表的存储方式,散列表的冲突解决方法. 1.散列函数 较常用的散列函数有除留余数法,数字分析法,平方取中法,折叠法. 2.散列表的存储方式 闭散列法(开地址法),用数组存储:开 ...
- IIS部署项目
控制面板\所有控制面板项\管理工具-->Internet 信息服务(IIS)管理器 随便填个名称,项目的路径,选择一个新的端口.
- 标准库类型string
定义和初始化string对象 初始化string对象方式: string s1;//默认初始化,s1是一个字符串 string s2(s1);//s2是s1的副本 string s2 = s1;//等 ...
- C# - 设计模式 - 虚模式
虚模式 问题场景 子类从抽象派生是为了解耦,但为了适应新的变化,可能需要向抽象类添加新功能,假如在添加新功能之前已经有100个子类实现了抽象,那么接下来你得在100个子类中去重写向抽象添加的新功能. ...
- 两个MMCM共享时钟输入时的严重警告和错误
情景描述: 芯片:zynq7020 问题: 设计从FPGA的U19引脚上的开发板板接收时钟输入125M,并将其送到两个MMCM.使用软件:vivado2015.4在Vivado中打开合成设计后,我得到 ...
- 2019 icpc南昌全国邀请赛-网络选拔赛J题 树链剖分+离线询问
链接:https://nanti.jisuanke.com/t/38229 题意: 给一棵树,多次查询,每次查询两点之间权值<=k的边个数 题解: 离线询问,树链剖分后bit维护有贡献的位置即可 ...
- webpack的三种用法
1.直接命令行使用. 2.node.js API的使用方式. 3.webpack / webpack--config webpack. dev.config.js //根目录创建 webpack.co ...
- 洛谷P4770 [NOI2018]你的名字 [后缀自动机,线段树合并]
传送门 思路 按照套路,直接上后缀自动机. 部分分:\(l=1,r=|S|\) 首先把\(S\)和\(T\)的后缀自动机都建出来. 考虑枚举\(T\)中的右端点\(r\),查询以\(r\)结尾的串最长 ...
- 关于Java中static关键字的用法以及从内存角度解析
在Java中,static可以用来修饰成员变量和成员方法. 修饰成员变量,称为静态成员方法 修饰静态方法,称为静态成员方法 搞清楚用法和区别之前,先搞清static声明的变量和普通非静态变量在内存的分 ...
- 七 Git版本控制
把环境准备 主机名 node1 ip地址10.0.0.11 node2 10.0.0.12 node3 ...