题意:在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(?)

#include<bits/stdc++.h>
#define rep(i,j,k) for(int i=j;i<=k;i++)
#define rrep(i,j,k) for(int i=j;i>=k;i--)
#define erep(i,u) for(int i=head[u];~i;i=nxt[i])
#define print(a) printf("%lld",(ll)(a))
#define printbk(a) printf("%lld ",(ll)(a))
#define println(a) printf("%lld\n",(ll)(a))
using namespace std;
const int MAXN = 1e5+11;
const int MAXM = 2e6+11;
typedef long long ll;
ll read(){
ll x=0,f=1;register char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
struct LINE{
int l,r,d;
bool operator < (const LINE &rhs) const{
return d<rhs.d;
}
}line[MAXN];
typedef pair<ll,ll> P;
struct FST{
ll val[MAXN<<6];
int cnt[MAXN<<6];
int lc[MAXN<<6],rc[MAXN<<6];
int T[MAXN],tot;
void init(){tot=0;}
int build(int l,int r){
int cur=++tot;
cnt[cur]=val[cur]=lc[cur]=rc[cur]=0;
if(l==r) return cur;
int mid=l+r>>1;
lc[cur]=build(l,mid);
rc[cur]=build(mid+1,r);
return cur;
}
inline void copy(int cur,int old){
lc[cur]=lc[old];
rc[cur]=rc[old];
cnt[cur]=cnt[old];
val[cur]=val[old];
}
int update(int old,int l,int r,int L,int R,ll v){
int cur=++tot;
copy(cur,old);
//cnt[cur]++;
if(L<=l&&r<=R){
val[cur]+=v;
cnt[cur]++;
return cur;
}
int mid=l+r>>1;
if(L<=mid) lc[cur]=update(lc[old],l,mid,L,R,v);
if(R>mid) rc[cur]=update(rc[old],mid+1,r,L,R,v);
return cur;
}
P query(int cur,int l,int r,int k){
P p=P(cnt[cur],val[cur]);
if(l==r) return p;
int mid=l+r>>1;
if(k<=mid){
P t=query(lc[cur],l,mid,k);
return P(p.first+t.first,p.second+t.second);
}
else{
P t=query(rc[cur],mid+1,r,k);
return P(p.first+t.first,p.second+t.second);
}
}
}fst;
int n,m,X,PP;
int main(){
while(cin>>n>>m>>X>>PP){
rep(i,1,n){
line[i].l=read();
line[i].r=read();
line[i].d=read();
}
sort(line+1,line+1+n);
fst.init(); fst.T[0]=fst.build(1,X);
rep(i,1,n) fst.T[i]=fst.update(fst.T[i-1],1,X,line[i].l,line[i].r,line[i].d);
ll pre=1;
rep(i,1,m){
ll x=read();
ll a=read();
ll b=read();
ll c=read();
int lo=0,hi=n,mid;
ll k=(a*pre+b)%c;
P p;
while(lo<hi){
mid=lo+(hi-lo)/2;
p=fst.query(fst.T[mid],1,X,x);
if(p.first>=k) hi=mid;
else lo=mid+1;
}
P res=fst.query(fst.T[lo],1,X,x);
if(pre>PP) res.second<<=1;
pre=res.second;
println(res.second);
}
}
return 0;
}

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. 去除json数据的某些键值对

    假如现在要处理的原始数据是字符串.形式如下: var vJson = { name: "张三", class: "软件工程一班" ,other:"无效 ...

  2. Perl 学习笔记-正则表达式处理文本

    1.使用正则表达式替换文本  s///  s/<pattern>;/<replacement>;/ 如果匹配失败, 则什么也不会发生, 变量也不受影响. 返回布尔值, 替换成功 ...

  3. CTE递归限制次数

    CTE可以用来取递归,网上资料很多,这里就不再叙述了,今天遇到的需求是要限制只取2级,然后加了个临时的lev with tree as(select [CustomerID],[CustomerNam ...

  4. [GO]结构体成员的使用:指针变量

    package main import "fmt" func main() { type student struct { id int name string sex byte ...

  5. ArcGIS中地图导出格式比较(转)

    转自:http://blog.sina.com.cn/s/blog_6438c8360101eqfx.html   有人问过这样的问题,用于出挂图的地图格式应该怎么选择?熟悉ArcGIS的用户都知道, ...

  6. (3)WePHP控制器与模型

    MVC的先进理念就是程序流程 数据库操作 模板制作三个流程分离 大M函数会把模型引入到当前控制器的方法中,注意这个"excel"对应M文件夹的excel.php 同时也是整个exc ...

  7. HDU 4714 Tree2cycle (树形DP)

    题意:给定一棵树,断开一条边或者接上一条边都要花费 1,问你花费最少把这棵树就成一个环. 析:树形DP,想一想,要想把一棵树变成一个环,那么就要把一些枝枝叶叶都换掉,对于一个分叉是大于等于2的我们一定 ...

  8. Hadoop-2.4.0分布式安装手册

    目录 目录 1 1. 前言 2 2. 部署 2 2.1. 机器列表 2 2.2. 主机名 2 2.2.1. 临时修改主机名 3 2.2.2. 永久修改主机名 3 2.3. 免密码登录范围 4 3. 约 ...

  9. 第05章 管理ElasticSearch

    本章内容 如何选择正确的目录实现,使得ElasticSearch能够以高效的方式访问底层I/O系统. 如何配置发现模块来避免潜在的问题. 如何配置网关模块以适应我们的需求. 恢复模块能带来什么,以及如 ...

  10. Postgresql导出指定的数据表

    两对双引号"\"\""是用于解决:pg_dump: no matching tables were found 问题. pg_dump -h localhost ...