传送门

文章目录

  • 题意:
  • 思路:

题意:

给你nnn个学生以及其位置,mmm个询问,每次询问[l,r][l,r][l,r]的学生跑到[k,k+r−l][k,k+r-l][k,k+r−l]的位置的最小总的移动距离。当然不同的学生不能站在同一位置。
n,m≤5e5,1≤ai,k≤1e6n,m\le5e5,1\le a_i,k\le1e6n,m≤5e5,1≤ai​,k≤1e6。

思路:

首先[l,r][l,r][l,r]的学生相对位置不变一定是最优的,所以一定在[k,k+r−l][k,k+r-l][k,k+r−l]之间有一个分界点,左边的人都往右跑,右边的往左跑是最优的,我们发现这个是可以在主席树上二分找的。
首先在主席树上拿出来[l,r][l,r][l,r]的学生的位置以及个数,分以下四种情况:
(1)(1)(1)如果当前区间没有人,直接返回。
(2)(2)(2)如果当前区间的人都应该往左跑,那么直接计算学生总位置和−-−应该到的位置。
(3)(3)(3)如果当前区间的人都应该往右跑,那么直接计算应该到的位置−-−学生总位置和。
(4)(4)(4)不能确定学生方向,那么递归子树处理。
上面计算应该到的位置就是利用等差数列求和公式cnt∗(st+st+cnt−1)/2cnt*(st+st+cnt-1)/2cnt∗(st+st+cnt−1)/2即可。
复杂度有人证明过是O(nlogn)O(nlogn)O(nlogn)的。

// Problem: P4559 [JSOI2018]列队
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P4559
// Memory Limit: 500 MB
// Time Limit: 3000 ms
//
// Powered by CP Editor (https://cpeditor.org)//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid (tr[u].l+tr[u].r>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=1000010,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;int n,m;
int root[N],tot;
struct Node {int l,r;int cnt;LL sum;
}tr[N*40];void insert(int p,int &q,int l,int r,int pos) {q=++tot; tr[q]=tr[p];tr[q].cnt++; tr[q].sum+=pos;if(l==r) return;int mid=(l+r)>>1;if(pos<=mid) insert(tr[p].l,tr[q].l,l,mid,pos);else insert(tr[p].r,tr[q].r,mid+1,r,pos);
}LL query(int p,int q,int l,int r,int add,int k) {if(tr[q].cnt-tr[p].cnt==0) return 0ll;int cnt=tr[q].cnt-tr[p].cnt; LL sum=tr[q].sum-tr[p].sum;if(l>=k+add) return sum-(1ll*k*2+add*2+cnt-1)*cnt/2;if(r<=k+add+cnt-1) return (1ll*k*2+add*2+cnt-1)*cnt/2-sum;cnt=tr[tr[q].l].cnt-tr[tr[p].l].cnt;int mid=(l+r)>>1;return query(tr[p].l,tr[q].l,l,mid,add,k)+query(tr[p].r,tr[q].r,mid+1,r,add+cnt,k);
}int main()
{//  ios::sync_with_stdio(false);
//  cin.tie(0);scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) {int x; scanf("%d",&x);insert(root[i-1],root[i],1,1000000,x);}while(m--) {int l,r,k; scanf("%d%d%d",&l,&r,&k);printf("%lld\n",query(root[l-1],root[r],1,1000000,0,k));}return 0;
}
/**/

P4559 [JSOI2018]列队 主席树相关推荐

  1. 洛谷P4559 [JSOI2018]列队 【70分二分 + 主席树】

    题目链接 洛谷P4559 题解 只会做\(70\)分的\(O(nlog^2n)\) 如果本来就在区间内的人是不用动的,区间右边的人往区间最右的那些空位跑,区间左边的人往区间最左的那些空位跑 找到这些空 ...

  2. [Jsoi2018]军训列队 主席树

    Description 一共有nnn个学生,第iii个学生的休息位置是a[i]a[i]a[i].每一次命令,教官会指定一个区间[l,r][l, r][l,r]和集合点kkk,所有编号在[l,r][l, ...

  3. hdu 2665(主席树查询区间k大值)

    先贴我自己写的代码做模板虽然跟原博主没什么两样.(一开始空间开的4*maxn,交到hdu上一直TLE很奇怪) #include<bits/stdc++.h> using namespace ...

  4. P3168 [CQOI2015]任务查询系统 差分+主席树

    链接在这~:https://www.luogu.org/problem/P3168 主席静态区间修改,单点查询 区间(L,R)加1可以通过差分以后转换为L位置加1,R+1位置减1 我们只需要记录一下, ...

  5. 洛谷 P3302 [SDOI2013]森林 主席树+启发式合并

    click here~:https://www.luogu.org/problem/P3302 emmm这个题是真的烦 一看题发现这题不是count on a tree的升级版么 如果一点思路没有的话 ...

  6. 洛谷 P2468 粟粟的书架 二分(主席树+前缀和)

    传送~:https://www.luogu.org/problem/P2468 看了一下数据也发现是两道题,后边当他是一个序列(n==1)的时候直接主席树二分区间前k大和就行了 但是有一个细节我觉得就 ...

  7. R19436221 区间第k小 主席树

    主席树模板题,记录一下. #include<bits/stdc++.h> using namespace std; const int maxn=2e5+5; int root[maxn] ...

  8. LuoguP2617 Dynamic Rankings (动态主席树学习理解)

    题目地址 题目链接 题解 动态主席树的板子题.动态主席树其实和静态的有很大差别,虽然同样是n个根,但是节点并不能共用,每个根节点表示bit上的一段区间. 所以其实是个树套树的东西来着,外层是bit,内 ...

  9. 可持久化线段树(主席树)【舰娘系列】【自编题】

    [pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=60083619 向大(hei)佬(e)势力学(di ...

最新文章

  1. 快学习使用Linux吧,避免勒索病毒大肆入侵
  2. 三点提升关键词排名的写作技巧
  3. 新的旅程:NodeJS - 环境篇
  4. 差分法c语言源程序,差分法求数据压缩
  5. 监控程序崩溃重启_Bug 10 重启和正常输入的抉择记录
  6. 分享MYSQL中的各种高可用技术(源自姜承尧大牛)
  7. 引入方式之行内样式表(CSS、HTML)
  8. 没有与这些操作数【】匹配的运算符_Maxima软件-7运算符(翻译)
  9. oracle审计功能启动关闭
  10. 博途v14电脑要求_博图TIA V14版本完整体验加测试
  11. 2021多校第二场F 简单计算几何模板(球体相交体积)
  12. 知识点:vs2017 git 操作重置、还原、挑拣对比
  13. 职场上做“独狼”注定失败
  14. 小白学 Python 数据分析(4):Pandas——数据导入
  15. JavaScript数组内置方法-知识
  16. 今天的我又来到阳台上的玩耍
  17. 上架APPStore 截图尺寸要求
  18. Hive 热门数据分析笔试题(干货满满,持续更新中...)
  19. 02 MSC类设备-基础篇(二)
  20. manjaro 开机启动项_Re:从零开始的Manjaro配置

热门文章

  1. java ecc 加密_java-信息安全(十一)-非对称加密算法002-ECC,签名003-ECDSA签名
  2. 159个故事串起三千年大历史!这套“儿童版史记”太无敌了!
  3. 人工智能会让工作环境变得更公平,还是更压抑?
  4. mysql 调用未定义函数_php – Wierd和Annoying错误:调用未定义的函数mysql_query()[复制]...
  5. 华夫饼为什么不松软_掌握这2个关键点,5个小细节,3个小技巧,保证烙饼松软又好吃...
  6. mysql 1117_1117Mysql prepare预处理语句
  7. linux创建目录目录文件,Linux创建目录和文件管理教程
  8. linux accept过程,Linux协议栈accept和syn队列问题
  9. win10+tomcat+php+配置环境变量配置,Win10系统Tomcat环境变量配置方法
  10. 信号转化java_Java基础知识回顾-7