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查 ...
随机推荐
- 3、设置jsp上的类容自动更新
1.run->edit configurations进入下面的界面,并修改 On ‘Update’ action 为 Redeploy. On frame deactivation 为 ...
- java里getter和setter的作用(转载)
[java]类中使用getter和setter的优势 http://www.importnew.com/9716.html java有三大特性:封装,继承还有多态. 而今天,我来讲一下其中最重要的特性 ...
- js数字串传参时变科学计数法
例1:onclick=channel_info_listFt(\"'+val.gid+'\",'+val.deviceIdOwner+','+val.gname+') 当长度过长的 ...
- Sublime Text 3删除插件
Ctrl+Shift+P调出命令窗口,输入remove: 选择第二个Remove Package,会看到如下界面: 里面列出了你已经安装的插件,之后选择你想要卸载的就好了.
- NB-IoT有三种部署方式及特点【转】
转自:http://blog.sina.com.cn/s/blog_13ddf053f0102wcbz.html NB-IoT有三种运营模式,一种是独立的在运营商的网络外面重做:第二种是在LTE的保护 ...
- 【R】资源整理
1.25本Python电子书 http://python.jobbole.com/29281/ Think Stats Dive Into Python A Byte Of Python Think ...
- MySQL之CONCAT()的用法
mysql CONCAT()函数用于将多个字符串连接成一个字符串,是最重要的mysql函数之一,下面就将为您详细介绍mysql CONCAT()函数,供您参考 mysql CONCAT(str1,st ...
- Mysql 反向解析 导致远程访问慢
在云端部署了mysql后,发现远程连接的响应速度非常慢(3-10s) 但是在本地访问数据库却没有问题 经过一番google这才知道原来mysql默认会进行反向解析,即通过ip地址反向向ISP申请获取域 ...
- oracle INS-13001 环境不满足最低要求
使用windows10等系统安装oracle 11g等版本的数据库时,经常会发现开始安装时弹出[INS-13001 环境不满足最低要求]的提示,此时可以点击[是]继续安装. 也可以点击[否]结束安装, ...
- xr报表调整
xr报表调整,此乃为软件应用层调整,非后端数据库调整. 主单付款方式为AR支票300元 应收账务AR支票预付款 3000元录入调整 -300 AR支票付款录入收入 300 现金付款核销掉,报表现金多出 ...