[JSOI2018]军训列队】的更多相关文章

[JSOI2018]军训列队 题目大意: \(n(n\le5\times10^5)\)个学生排成一排,第\(i\)个学生的位置为\(a_i\).\(m(m\le5\times10^5)\)次命令,每次将编号在\([l,r]\)之间的学生移动到\([k,k+r-l]\)位置上,每个位置站一个人,顺序自定(无需考虑原来在\([k,k+r-l]\)位置上的人).每次的代价为每个人移动距离之和.求每次操作的最小代价. 思路: 建立主席树,维护每个区间内人数和与坐标和. 考虑所有人都在区间\([k,k+r…
BZOJ5319: [Jsoi2018]军训列队 https://lydsy.com/JudgeOnline/problem.php?id=5319 分析: 易知把所有人按原本的顺序放到\([K,K+len-1]\)这些位置上是最优的. 我们只需要求一个\(mid\), 满足从\(mid\)以后的人都是向左移动. 这个可以用二分+主席树在\(O(nlog^2)\)的时间内解决, 然后过不去. 变成直接在主席树上二分就好了,需要一点小技巧. 即二分走的区间不一定包含答案点,但可能是答案点减\(1​…
LOJ BZOJ 洛谷 看错了,果然不是\(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,m…
题目传送门:洛谷 P4559. 题意简述: 有 \(n\) 个学生,编号为 \(i\) 的学生有一个位置 \(a_i\). 有 \(m\) 个询问,每次询问编号在 \([l,r]\) 区间内的学生跑到区间 \([k,k+r-l]\) 中的位置花费的距离总和的最小值. 每个学生的初始位置互不相同,最终到达的位置也必须互不相同. 题解: 不难证明,学生跑到最终的位置时,他们的相对位置不改变至少是最优解之一,这可以脑补一下. 所以我们只需要求最终相对位置不变时的答案即可. 因为学生两两位置不同,所以最…
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&…
https://www.lydsy.com/JudgeOnline/problem.php?id=5319 https://www.luogu.org/problemnew/show/P4559 https://loj.ac/problem/2551 题面见上. 40pts: 不难想到询问应当在主席树上做. [l,r]为我们询问的这些人所在位置的坐标区间,[l1,r1]为这些人最终要去这个区间里站着. 我们维护主席树节点代表的区间的人数,则设当前节点左子树人数为ls,则可以递归处理[l,mid]…
[BZOJ5319]军训列队(主席树) 题面 BZOJ 洛谷 题解 一眼题既视感... 首先很明显,每次询问的结果显然是做一次离散. 然后直接上主席树就好了... 查询答案的方式也很简单 考虑一下那个绝对值是个什么东西 如果所有的点都在目标区间以左 则直接区间和去算一下. 如果所有的点都在目标区间以右 好像和在左边一样的. 否则,把区间隔开计算就好了. #include<iostream> #include<cstdio> #include<cstdlib> #incl…
问题描述 作为一名大学生,九条可怜在去年参加了她人生中的最后一次军训. 军训中的一个重要项目是练习列队,为了训练学生,教官给每一个学生分配了一个休息位置.每次训练开始前,所有学生都在各自的休息位置休息,但是当教官发出集合命令后,被点到的学生必须要到指定位置集合. 为了简化问题,我们把休息位置和集合位置抽象成一根数轴.一共有 \(n\) 个学生,第 \(i\) 个学生的休息位置是 \(a_i\).每一次命令,教官会指定一个区间 \([l,r]\) 和集合点 \(K\) ,所有编号在 \([l,r]…
题目:https://loj.ac/problem/2551 答案是排序后依次走到 K ~ K+r-l . 想维护一个区间排序后的结果,使得可以在上面二分.求和:二分可以知道贡献是正还是负. 于是想用树套树维护一段区间的元素减去从0开始的等差数列的值.为了二分,维护 fr , sc 表示权值区间里第一个/最后一个权值. 时间空间都是 nlog2n 的,空间连 70 分的范围都开不下.而且对拍1000以内的数据还有错误,交上去 TLE 得只能得 70 分. #include<cstdio> #i…
题解 老年选手一道裸的主席树都要看好久才看出来 首先熟练的把这个区间建成\(n\)个主席树 然后对于一个询问,我们相当于在主席树上二分一个mid,使得\(mid - K + 1\)正好和\([l,r]\)区间中坐标在\([1,mid]\)的人数一样就好 (居然代码只有2.2K,似乎比平均码长低啊,开心) 代码 #include <bits/stdc++.h> #define fi first #define se second #define pii pair<int,int> #…