题意:在x轴\([1,X]\)内的上空分布有n个占据空间\([L_i,R_i]\),高度\(D_i\)的线段,射中线段的得分为其高度,每次询问从x轴的\(x\)往上空射的最近k个线段的总得分,具体得分制看题

按高度对线段进行排序,那么如果我们能\(O(logn)\)内查询到某一时间段的占据\(x\)的线段个数,那么由占据\(x\)的个数的单调性就能在\(O(log^2n)\)内找到符合的最近k个线段

而某一时间段占据某位置的线段个数那就对应于主席树,二分对应于某一历史版本的根

注意由于查询必然经过叶子,那么我们就可以实现lazy不下传,只要打到它最后要覆盖的节点即可

还有空间要乘64,乘32的话直接T(?)

  1. #include<bits/stdc++.h>
  2. #define rep(i,j,k) for(int i=j;i<=k;i++)
  3. #define rrep(i,j,k) for(int i=j;i>=k;i--)
  4. #define erep(i,u) for(int i=head[u];~i;i=nxt[i])
  5. #define print(a) printf("%lld",(ll)(a))
  6. #define printbk(a) printf("%lld ",(ll)(a))
  7. #define println(a) printf("%lld\n",(ll)(a))
  8. using namespace std;
  9. const int MAXN = 1e5+11;
  10. const int MAXM = 2e6+11;
  11. typedef long long ll;
  12. ll read(){
  13. ll x=0,f=1;register char ch=getchar();
  14. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  15. while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
  16. return x*f;
  17. }
  18. struct LINE{
  19. int l,r,d;
  20. bool operator < (const LINE &rhs) const{
  21. return d<rhs.d;
  22. }
  23. }line[MAXN];
  24. typedef pair<ll,ll> P;
  25. struct FST{
  26. ll val[MAXN<<6];
  27. int cnt[MAXN<<6];
  28. int lc[MAXN<<6],rc[MAXN<<6];
  29. int T[MAXN],tot;
  30. void init(){tot=0;}
  31. int build(int l,int r){
  32. int cur=++tot;
  33. cnt[cur]=val[cur]=lc[cur]=rc[cur]=0;
  34. if(l==r) return cur;
  35. int mid=l+r>>1;
  36. lc[cur]=build(l,mid);
  37. rc[cur]=build(mid+1,r);
  38. return cur;
  39. }
  40. inline void copy(int cur,int old){
  41. lc[cur]=lc[old];
  42. rc[cur]=rc[old];
  43. cnt[cur]=cnt[old];
  44. val[cur]=val[old];
  45. }
  46. int update(int old,int l,int r,int L,int R,ll v){
  47. int cur=++tot;
  48. copy(cur,old);
  49. //cnt[cur]++;
  50. if(L<=l&&r<=R){
  51. val[cur]+=v;
  52. cnt[cur]++;
  53. return cur;
  54. }
  55. int mid=l+r>>1;
  56. if(L<=mid) lc[cur]=update(lc[old],l,mid,L,R,v);
  57. if(R>mid) rc[cur]=update(rc[old],mid+1,r,L,R,v);
  58. return cur;
  59. }
  60. P query(int cur,int l,int r,int k){
  61. P p=P(cnt[cur],val[cur]);
  62. if(l==r) return p;
  63. int mid=l+r>>1;
  64. if(k<=mid){
  65. P t=query(lc[cur],l,mid,k);
  66. return P(p.first+t.first,p.second+t.second);
  67. }
  68. else{
  69. P t=query(rc[cur],mid+1,r,k);
  70. return P(p.first+t.first,p.second+t.second);
  71. }
  72. }
  73. }fst;
  74. int n,m,X,PP;
  75. int main(){
  76. while(cin>>n>>m>>X>>PP){
  77. rep(i,1,n){
  78. line[i].l=read();
  79. line[i].r=read();
  80. line[i].d=read();
  81. }
  82. sort(line+1,line+1+n);
  83. fst.init(); fst.T[0]=fst.build(1,X);
  84. rep(i,1,n) fst.T[i]=fst.update(fst.T[i-1],1,X,line[i].l,line[i].r,line[i].d);
  85. ll pre=1;
  86. rep(i,1,m){
  87. ll x=read();
  88. ll a=read();
  89. ll b=read();
  90. ll c=read();
  91. int lo=0,hi=n,mid;
  92. ll k=(a*pre+b)%c;
  93. P p;
  94. while(lo<hi){
  95. mid=lo+(hi-lo)/2;
  96. p=fst.query(fst.T[mid],1,X,x);
  97. if(p.first>=k) hi=mid;
  98. else lo=mid+1;
  99. }
  100. P res=fst.query(fst.T[lo],1,X,x);
  101. if(pre>PP) res.second<<=1;
  102. pre=res.second;
  103. println(res.second);
  104. }
  105. }
  106. return 0;
  107. }

HDU - 4866 主席树 二分的更多相关文章

  1. HDU6621 K-th Closest Distance HDU2019多校训练第四场 1008(主席树+二分)

    HDU6621 K-th Closest Distance HDU2019多校训练第四场 1008(主席树+二分) 传送门:http://acm.hdu.edu.cn/showproblem.php? ...

  2. hdu 5919 主席树(区间不同数的个数 + 区间第k大)

    Sequence II Time Limit: 9000/4500 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Tot ...

  3. 2018湘潭邀请赛C题(主席树+二分)

    题目地址:https://www.icpc.camp/contests/6CP5W4knRaIRgU 比赛的时候知道这题是用主席树+二分,可是当时没有学主席树,就连有模板都不敢套,因为代码实在是太长了 ...

  4. BZOJ.1926.[SDOI2010]粟粟的书架(前缀和 主席树 二分)

    题目链接 题意: 在给定矩形区域内找出最少的数,满足和>=k.输出数的个数.两种数据范围. 0~50 注意到(真没注意到...)P[i,j]<=1000,我们可以利用前缀和预处理. num ...

  5. 计蒜客 38229.Distance on the tree-1.树链剖分(边权)+可持久化线段树(区间小于等于k的数的个数)+离散化+离线处理 or 2.树上第k大(主席树)+二分+离散化+在线查询 (The Preliminary Contest for ICPC China Nanchang National Invitational 南昌邀请赛网络赛)

    Distance on the tree DSM(Data Structure Master) once learned about tree when he was preparing for NO ...

  6. POJ 6621: K-th Closest Distance(主席树 + 二分)

    K-th Closest Distance Time Limit: 20000/15000 MS (Java/Others)    Memory Limit: 524288/524288 K (Jav ...

  7. Super Mario HDU 4417 主席树区间查询

    Super Mario HDU 4417 主席树区间查询 题意 给你n个数(编号从0开始),然后查询区间内小于k的数的个数. 解题思路 这个可以使用主席树来处理,因为这个很类似查询区间内的第k小的问题 ...

  8. HDU 6278 主席树(区间第k大)+二分

    Just h-index Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others)To ...

  9. HDU - 6621 K-th Closest Distance 主席树+二分答案

    K-th Closest Distance 主席树第二波~ 题意 给你\(n\)个数\(m\)个询问,问\(i\in [l,r]\)计算每一个\(|a_{i}-p|\)求出第\(k\)小 题目要求强制 ...

随机推荐

  1. u盘安装Linux系统详细教程

    2012-05-06 02:30:44 分类: LINUX 想不想体验一下Linux下呢?刻盘太浪费钱,而U盘却可以多次利用.本文就是要介绍如何通过U盘安装Linux系统的.只要用Universal- ...

  2. windows server2012如何开启mysql远程登录

    开发的首要任务就是要搭建起自己的服务器,下面主要是我这搭建记录下 我的各种环境 服务器为Windows server2012  安装的MySQL数据的版本是5.6.10 ,64位.当然了版本对于安装没 ...

  3. windows安装MongoDB进度条卡住,window安装mongo系统错误 2,系统错误5的解决办法(转载)

    windows安装MongoDB进度条卡住,window安装mongo系统错误 2,系统错误5的解决办法 转自:https://www.cnblogs.com/sufferingStriver/p/m ...

  4. JS Closure 闭包

    /*一.变量的作用域要理解闭包,首先必须理解Javascript特殊的变量作用域.变量的作用域无非就是两种:全局变量和局部变量.Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量. ...

  5. Android测试入门篇

    Android本身是一套软件堆叠(Software Stack),或者成为软件叠层架构,叠层主要分成三层:操作系统.中间件和应用程序. Android构架 1. Application 应用程序层:用 ...

  6. Ubuntu重复循环启动的快速解决方法

    如果因为在配置java或者adb环境变量时修改profile文件导致的在登录界面输入密码后重复循环启动的问题,下面总结网上和实践找到快速解决的方法啦! 1.在登录界面按下ctrl+alt+F1进入命令 ...

  7. 玄虚出品Delphi教程的前言 good

    VCL是基于系统的,根本在于系统API,FMX是基于绘图的,根本在于渲染引擎  VCL的发展受制于系统,(你在VCL的代码里面可以看到Borland对M$的妥协),而FMX的发展仅仅受制于硬件 VCL ...

  8. 20145233《网络对抗》Exp7 DNS网络欺诈技术防范

    20145233<网络对抗>Exp7 DNS网络欺诈技术防范 实验问题思考 通常在什么场景下容易受到DNS spoof攻击 公共的无线局域网中,容易受到攻击者的攻击,因为这样就会连入局域网 ...

  9. 基于JSP+Servlet开发高校社团管理系统(前台+后台) 源码

    基于JSP+Servlet开发高校社团管理系统(前台+后台): 开发环境:    Windows操作系统 开发工具:Eclipse/MyEclipse+Jdk+Tomcat+MYSQL数据库 运行效果 ...

  10. Oracle数据表转换为Shapefile(一)

    严格来说,文章标题中的“转换”并不完全合适.本文的主要内容是基于Oracle数据表的数据来生产出Shapefile文件.进行该工作的一个前提条件是:Oracle数据表中包含坐标数值字段,一般来说就是x ...