题目链接:https://ac.nowcoder.com/acm/contest/887/E

题意:给出L[i],R[i],每次添加L[i]...R[i],求出此时的中位数。

思路:因为添加的数范围为1e9,首先想到要用离散化,这里是用一个点来表示一个区间。

将右区间加一的主要目的是优化处理,将区间最后一个元素并入到前面,自己模拟一下就能明白啦。

然后用线段树维护每个节点所包含的元素个数,用懒惰标记laz表示加的次数,然后每次查询时若左子树的元素个数足够则在左子树查询,否则在右子树查询。

详见代码:

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<vector>
  4. using namespace std;
  5.  
  6. typedef long long LL;
  7. const int maxn=4e5+;
  8.  
  9. struct node{
  10. int l,r,laz;
  11. LL sz;
  12. }tr[maxn<<];
  13.  
  14. int n;
  15. LL X[maxn],Y[maxn],A1,A2,B1,B2,C1,C2,M1,M2;
  16. vector<int> vc;
  17.  
  18. void build(int v,int l,int r){
  19. tr[v].l=l,tr[v].r=r;
  20. if(l==r){
  21. return;
  22. }
  23. int mid=(l+r)>>;
  24. build(v<<,l,mid);
  25. build(v<<|,mid+,r);
  26. }
  27.  
  28. void pushdown(int v){
  29. tr[v<<].sz+=(vc[tr[v<<].r+]-vc[tr[v<<].l])*tr[v].laz;
  30. tr[v<<].laz+=tr[v].laz;
  31. tr[v<<|].sz+=(vc[tr[v<<|].r+]-vc[tr[v<<|].l])*tr[v].laz;
  32. tr[v<<|].laz+=tr[v].laz;
  33. tr[v].laz=;
  34. }
  35.  
  36. void update(int v,int l,int r){
  37. if(l<=tr[v].l&&r>=tr[v].r){
  38. tr[v].sz+=(vc[tr[v].r+]-vc[tr[v].l]);
  39. tr[v].laz+=;
  40. return;
  41. }
  42. if(tr[v].laz) pushdown(v);
  43. int mid=(tr[v].l+tr[v].r)>>;
  44. if(l<=mid) update(v<<,l,r);
  45. if(r>mid) update(v<<|,l,r);
  46. tr[v].sz=tr[v<<].sz+tr[v<<|].sz;
  47. }
  48.  
  49. int query(int v,LL k){
  50. if(tr[v].l==tr[v].r){
  51. int tmp=tr[v].sz/(vc[tr[v].l+]-vc[tr[v].l]);
  52. return vc[tr[v].l]+(k-)/tmp;
  53. }
  54. if(tr[v].laz) pushdown(v);
  55. if(k<=tr[v<<].sz) return query(v<<,k);
  56. else return query(v<<|,k-tr[v<<].sz);
  57. }
  58.  
  59. int main(){
  60. scanf("%d",&n);
  61. scanf("%lld%lld%lld%lld%lld%lld",&X[],&X[],&A1,&B1,&C1,&M1);
  62. scanf("%lld%lld%lld%lld%lld%lld",&Y[],&Y[],&A2,&B2,&C2,&M2);
  63. for(int i=;i<=n;++i){
  64. X[i]=(A1*X[i-]%M1+B1*X[i-]%M1+C1)%M1;
  65. Y[i]=(A2*Y[i-]%M2+B2*Y[i-]%M2+C2)%M2;
  66. }
  67. for(int i=;i<=n;++i){
  68. ++X[i],++Y[i];
  69. if(X[i]>Y[i]) swap(X[i],Y[i]);
  70. vc.push_back(X[i]),vc.push_back(Y[i]+);
  71. }
  72. sort(vc.begin(),vc.end());
  73. vc.erase(unique(vc.begin(),vc.end()),vc.end());
  74. LL sum=;
  75. int cnt=vc.size();
  76. build(,,cnt-);
  77. for(int i=;i<=n;++i){
  78. sum+=Y[i]-X[i]+;
  79. int x,y;
  80. x=lower_bound(vc.begin(),vc.end(),X[i])-vc.begin();
  81. y=lower_bound(vc.begin(),vc.end(),Y[i]+)-vc.begin();
  82. update(,x,y-);
  83. printf("%d\n",query(,(sum+)>>));
  84. }
  85. return ;
  86. }

2019牛客暑期多校训练营(第七场)-E Find the median (线段树+离散化 区间为点)的更多相关文章

  1. 2019牛客暑期多校训练营(第九场)A:Power of Fibonacci(斐波拉契幂次和)

    题意:求Σfi^m%p. zoj上p是1e9+7,牛客是1e9:  对于这两个,分别有不同的做法. 前者利用公式,公式里面有sqrt(5),我们只需要二次剩余求即可.     后者mod=1e9,5才 ...

  2. 2019牛客暑期多校训练营(第一场)A题【单调栈】(补题)

    链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 题目描述 Two arrays u and v each with m distinct elem ...

  3. 2019牛客暑期多校训练营(第一场) B Integration (数学)

    链接:https://ac.nowcoder.com/acm/contest/881/B 来源:牛客网 Integration 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 5242 ...

  4. 2019牛客暑期多校训练营(第一场) A Equivalent Prefixes ( st 表 + 二分+分治)

    链接:https://ac.nowcoder.com/acm/contest/881/A 来源:牛客网 Equivalent Prefixes 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/ ...

  5. 2019牛客暑期多校训练营(第二场)F.Partition problem

    链接:https://ac.nowcoder.com/acm/contest/882/F来源:牛客网 Given 2N people, you need to assign each of them ...

  6. 2019牛客暑期多校训练营(第一场)A Equivalent Prefixes(单调栈/二分+分治)

    链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 Two arrays u and v each with m distinct elements ...

  7. [状态压缩,折半搜索] 2019牛客暑期多校训练营(第九场)Knapsack Cryptosystem

    链接:https://ac.nowcoder.com/acm/contest/889/D来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言52428 ...

  8. 2019牛客暑期多校训练营(第二场)J-Subarray(思维)

    >传送门< 前言 这题我前前后后看了三遍,每次都是把网上相关的博客和通过代码认真看了再思考,然并卵,最后终于第三遍也就是现在终于看懂了,其实懂了之后发现其实没有那么难,但是的的确确需要思维 ...

  9. 2019牛客暑期多校训练营(第一场)-A (单调栈)

    题目链接:https://ac.nowcoder.com/acm/contest/881/A 题意:给定两个长度均为n的数组a和b,求最大的p使得(a1,ap)和(b1,bp)等价,等价的定义为其任意 ...

  10. 2019牛客暑期多校训练营(第一场)A - Equivalent Prefixes(单调栈)

    题意 给定两个$n$个元素的数组$a,b$,它们的前$p$个元素构成的数组是"等价"的,求$p$的最大值."等价"的意思是在其任意一个子区间内的最小值相同. $ ...

随机推荐

  1. ila核数据输出

    在Tcl Console中输入以下命令(其中dataxxxx表示文件名,hw_ila_2则为ila窗口名): write_hw_ila_data -csv_file -force dataxxxx [ ...

  2. siblings([expr])

    siblings([expr]) 概述 取得一个包含匹配的元素集合中每一个元素的所有唯一同辈元素的元素集合.可以用可选的表达式进行筛选.大理石平台维修   参数 exprStringV1.0 用于筛选 ...

  3. 部分易错JS知识点整理(缓慢填坑)

    主要还是各地搜刮来的,本人对于这方面的总结还是8彳亍,给各位大佬磕头了砰砰砰 1. 2.JS闭包和匿名对象以及作用域 js在执行之前,会将所有带var和function的进行提前定义和声明.(带var ...

  4. Connect AS400 through firewall(JDBC will require ports: 449, 8470, 8471, and 8476)

    What TCP ports are used by ODBC to connect to the DB2/400?  8471/9471 http://search400.techtarget.co ...

  5. UVALive 7308 Tom and Jerry 猫抓老鼠 物理题

    题目链接: 就是一个老鼠在环上一速度v开始绕环走,一只猫从圆心出发,任意时刻圆心,猫,老鼠三者在一条直线上,且速度也是v,求多久后猫抓到老鼠. #include <cstdio> #inc ...

  6. 学数据分析到底要不要掌握Linux-Python基础前传(2)

    使用Python的数据分析师到底要不要掌握Linux? 对于上面的问题,大部分的答案是Python数据分析在windows的环境下跑跑就可以了,没有必要再花时间来学习Linux; 这里jacky有一个 ...

  7. node.js获取ip及mac

    ; (function (win) { var os = require('os'); var ifaces = os.networkInterfaces(); function NetworkUti ...

  8. RHEL 7.6系统安装配置图解教程

  9. 解决:安装jenkins时web界面出现jenkins实例似乎已离线问题

    https://blog.51cto.com/8593714/2318144?tdsourcetag=s_pctim_aiomsg Windows下环境也可以解决:

  10. linux系统空间不足,不重启进程,清理僵尸文件。

    问题:通过lsof |grep delete命令可以看到状态为delete的进程文件占用了较多的空间,导致系统磁盘空间不足,而du 命令看到的磁盘空间占用没那么高. 得到僵尸文件名称:catalina ...