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,mid]\)中,右边的人都被排到\([mid+1,k+t-1]\)中。而且代价很好算,就是需要求一个等差数列的和,以及左边所有人的坐标和。

考虑如何找这个\(mid\)。显然有\(mid\)左边人的数量等于\(mid-k+1\),所以可以二分+主席树,但是是\(\log^2\)的。

注意到查的区间是个前缀,所以可以直接在主席树上二分。

那么复杂度就是\(O(n\log n)\)啦。

莫名想写指针

为啥我的主席树这么慢_(:з」∠)_


  1. //210300kb 12428ms
  2. #include <cstdio>
  3. #include <cctype>
  4. #include <algorithm>
  5. #define F(l,r) (1ll*((r)-(l)+1)*(l+r)>>1)//n(a1+an)/2... l<=r+1
  6. #define gc() getchar()
  7. #define MAXIN 500000
  8. //#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
  9. typedef long long LL;
  10. const int N=5e5+5;
  11. int A[N],root[N];
  12. char IN[MAXIN],*SS=IN,*TT=IN;
  13. struct Segment_Tree
  14. {
  15. #define ls son[x][0]
  16. #define rs son[x][1]
  17. #define lson ls,l,m,
  18. #define rson rs,m+1,r
  19. #define lson2 ls,son[y][0],l,m
  20. #define rson2 rs,son[y][1],m+1,r
  21. #define S N*21
  22. int tot,son[S][2],sz[S];
  23. LL lsum,rsum,sum[S];
  24. #undef S
  25. void Insert(int &x,int y,int l,int r,int p)
  26. {
  27. sz[x=++tot]=sz[y]+1, sum[x]=sum[y]+p;
  28. if(l==r) return;
  29. int m=l+r>>1;
  30. p<=m?(rs=son[y][1],Insert(lson2,p)):(ls=son[y][0],Insert(rson2,p));
  31. }
  32. int Query(int x,int y,int l,int r,int K)//y-x
  33. {
  34. if(l==r) return lsum+=sum[y]-sum[x],l;//mid=k-1 -> lsum=sum[now]=0
  35. int m=l+r>>1,t=sz[son[y][0]]-sz[ls];
  36. 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));
  37. }
  38. }T;
  39. inline int read()
  40. {
  41. int now=0;register char c=gc();
  42. for(;!isdigit(c);c=gc());
  43. for(;isdigit(c);now=now*10+c-48,c=gc());
  44. return now;
  45. }
  46. int main()
  47. {
  48. int n=read(),Q=read(),mx=0,mn=N;
  49. for(int *s=A+1,*ed=A+1+n; s!=ed; ++s) mx=std::max(mx,*s=read()), mn=std::min(mn,*s);
  50. for(int i=1; i<=n; ++i) T.Insert(root[i],root[i-1],mn,mx,A[i]);
  51. for(int l,r,ql,qr; Q--; )
  52. {
  53. l=read(),r=read(),ql=read(),qr=ql+r-l;
  54. if(ql<=mn||qr>=mx) printf("%lld\n",std::abs(T.sum[root[r]]-T.sum[root[l-1]]-F(ql,qr)));
  55. else
  56. {
  57. T.lsum=0, T.rsum=0;
  58. int mid=T.Query(root[l-1],root[r],mn,mx,ql);
  59. printf("%lld\n",F(ql,mid)-T.lsum+T.rsum-F(mid+1,qr));
  60. }
  61. }
  62. return 0;
  63. }

BZOJ.5319.[JSOI2018]军训列队(主席树)的更多相关文章

  1. 洛谷 P4559: bzoj 5319: [JSOI2018]军训列队

    题目传送门:洛谷 P4559. 题意简述: 有 \(n\) 个学生,编号为 \(i\) 的学生有一个位置 \(a_i\). 有 \(m\) 个询问,每次询问编号在 \([l,r]\) 区间内的学生跑到 ...

  2. bzoj 5319: [Jsoi2018]军训列队

    Description Solution 最优情况可以是所有人按位置从小到大排序之后依次占到自己 \(K+\) 排名的位置上去 因为每一个休息位置不同,那么一定递增,所以一定存在一个分界点,左边的是往 ...

  3. LOJ 2551 「JSOI2018」列队——主席树+二分

    题目:https://loj.ac/problem/2551 答案是排序后依次走到 K ~ K+r-l . 想维护一个区间排序后的结果,使得可以在上面二分.求和:二分可以知道贡献是正还是负. 于是想用 ...

  4. BZOJ5319: [Jsoi2018]军训列队

    BZOJ5319: [Jsoi2018]军训列队 https://lydsy.com/JudgeOnline/problem.php?id=5319 分析: 易知把所有人按原本的顺序放到\([K,K+ ...

  5. [JSOI2018]军训列队

    [JSOI2018]军训列队 题目大意: \(n(n\le5\times10^5)\)个学生排成一排,第\(i\)个学生的位置为\(a_i\).\(m(m\le5\times10^5)\)次命令,每次 ...

  6. [BZOJ 2989]数列(二进制分组+主席树)

    [BZOJ 2989]数列(二进制分组+主席树) 题面 给定一个长度为n的正整数数列a[i]. 定义2个位置的graze值为两者位置差与数值差的和,即graze(x,y)=|x-y|+|a[x]-a[ ...

  7. BZOJ5319 & 洛谷4559 & LOJ2551:[JSOI2018]军训列队——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=5319 https://www.luogu.org/problemnew/show/P4559 ht ...

  8. BZOJ 2223 [Coci 2009]PATULJCI | 主席树练习 (好像是个权限题啊)

    题目: 给个序列,问[l,r]区间内是否存在x>(r-l+1)>>1 题解: 好像大家都觉得这个题比较简单,没人写题解啊 先说BZOJ样例的格式应该是,第二个数是序列中数的范围(就是 ...

  9. bzoj 4448 [Scoi2015]情报传递(主席树,LCA)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4448 [题意] 给定一颗树,询问一条路径上权值小于t-c的点数. [思路] 将一个2查 ...

随机推荐

  1. Java 集合系列03之 ArrayList详细介绍

    ArrayList做为List接口中最常用的实现类,必须掌握. 一.ArrayList简介 与Java中的数组相比ArrayList的容量可以动态增加.它继承与AbstractList,实现了List ...

  2. Solr配置步骤

    1. 配置步骤说明 (1)配置Solr服务器. (2)配置SolrHome.(Solr服务的主目录,磁盘) (3)在Solr服务器中加载SolrHome. (4)java程序访问Solr服务器,实现全 ...

  3. C#使用RabbitMQ(转)

      1. 说明 在企业应用系统领域,会面对不同系统之间的通信.集成与整合,尤其当面临异构系统时,这种分布式的调用与通信变得越发重要.其次,系统中一般会有很多对实时性要求不高的但是执行起来比较较耗时的地 ...

  4. dos.orm的事务处理

    dos.orm也包含事务处理,没有太多封装,这里有几个简单的示例代码. using (DbTrans trans = DbSession.Default.BeginTransaction()) { D ...

  5. day16——函数式编程和内置函数

    编程的方法论 面向过程:找到问题的 函数式:不可变.不用变量保存状态.不修改变量 面向对象: 高阶函数: 满足俩个特性任意一个即为高阶函数 1.函数的传入参数是一个函数名 2.函数的返回值是一个函数名 ...

  6. form表单中button按钮返回上一页解决办法

    解决Form中button按钮不好用的问题解决办法. 方法一: 1.在Form表单标签中国增加一个属性,如下图,红框处 2.返回按钮样式 3.onclick方法需要跳转的页面,遮挡处为需要返回的页面 ...

  7. docker简单介绍---部署私有docker仓库Registry

    1. 关于Registry 官方的Docker hub是一个用于管理公共镜像的好地方,我们可以在上面找到我们想要的镜像,也可以把我们自己的镜像推送上去.但是,有时候,我们的使用场景需要我们拥有一个私有 ...

  8. js 获取 时间戳的三种方法

    new Date() *1 自动数据类型转换为数字 new Date().getTime() Date.now();

  9. F - JDG HDU - 2112 (最短路)&& E - IGNB HDU - 1242 (dfs)

    经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强.这时候,XHD夫妇也退居了二线,并在风景秀美的诸暨市浬 ...

  10. anacoda报错No module named 'sklearn.cross_validation'

    在目前的snacoda里集成的sklearn已经不存在cross_validation模块了 使用以下模块 from  sklearn.model_selection  import train_te ...