题解:T103180 しろは的军训列队】的更多相关文章

题目链接 solution: 按题目随便假设找到了一个x,它的位置的ap,属性bp 看下图 $$$$$$$$$$$$$$$$|||||P &&&&&&&&&&&&&&& $:ap前,即ai<ap &:ap后,即ai>ap |:ap同,即ai==ap 显然要求解下面的式子 sigma 1~n (ai-x)*bi 前:(x-a1)*b1+(x-a2)*b2+(x-a3)*…
[BZOJ5319]军训列队(主席树) 题面 BZOJ 洛谷 题解 一眼题既视感... 首先很明显,每次询问的结果显然是做一次离散. 然后直接上主席树就好了... 查询答案的方式也很简单 考虑一下那个绝对值是个什么东西 如果所有的点都在目标区间以左 则直接区间和去算一下. 如果所有的点都在目标区间以右 好像和在左边一样的. 否则,把区间隔开计算就好了. #include<iostream> #include<cstdio> #include<cstdlib> #incl…
[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​…
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]…
题目传送门:洛谷 P4559. 题意简述: 有 \(n\) 个学生,编号为 \(i\) 的学生有一个位置 \(a_i\). 有 \(m\) 个询问,每次询问编号在 \([l,r]\) 区间内的学生跑到区间 \([k,k+r-l]\) 中的位置花费的距离总和的最小值. 每个学生的初始位置互不相同,最终到达的位置也必须互不相同. 题解: 不难证明,学生跑到最终的位置时,他们的相对位置不改变至少是最优解之一,这可以脑补一下. 所以我们只需要求最终相对位置不变时的答案即可. 因为学生两两位置不同,所以最…
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…
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&…
潜入行动 复杂度分析题. 定义状态fi,j,0/1,0/1f_{i,j,0/1,0/1}fi,j,0/1,0/1​表示以iii为根子树放jjj个机器iii这个放不放,iii这个是否已放来进行dpdpdp 可以通过分类讨论证明做树上背包的时间复杂度是O(nk)O(nk)O(nk)的. 代码: #include<bits/stdc++.h> #define ri register int using namespace std; inline int read(){ int ans=0; char…
D1T1:潜入行动 裸的树上DP.f[i][j][0/1][0/1]表示以i为根的子树放j个设备,根有没有放,根有没有被子树监听,的方案数.转移显然. #include<cstdio> #include<algorithm> #define rep(i,l,r) for (int i=(l); i<=(r); i++) typedef long long ll; using namespace std; ,mod=1e9+; ll tmp[][][]; ][][],h[N],…