HDU - 4866 主席树 二分
题意:在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 主席树 二分的更多相关文章
- HDU6621 K-th Closest Distance HDU2019多校训练第四场 1008(主席树+二分)
HDU6621 K-th Closest Distance HDU2019多校训练第四场 1008(主席树+二分) 传送门:http://acm.hdu.edu.cn/showproblem.php? ...
- hdu 5919 主席树(区间不同数的个数 + 区间第k大)
Sequence II Time Limit: 9000/4500 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Tot ...
- 2018湘潭邀请赛C题(主席树+二分)
题目地址:https://www.icpc.camp/contests/6CP5W4knRaIRgU 比赛的时候知道这题是用主席树+二分,可是当时没有学主席树,就连有模板都不敢套,因为代码实在是太长了 ...
- BZOJ.1926.[SDOI2010]粟粟的书架(前缀和 主席树 二分)
题目链接 题意: 在给定矩形区域内找出最少的数,满足和>=k.输出数的个数.两种数据范围. 0~50 注意到(真没注意到...)P[i,j]<=1000,我们可以利用前缀和预处理. num ...
- 计蒜客 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 ...
- POJ 6621: K-th Closest Distance(主席树 + 二分)
K-th Closest Distance Time Limit: 20000/15000 MS (Java/Others) Memory Limit: 524288/524288 K (Jav ...
- Super Mario HDU 4417 主席树区间查询
Super Mario HDU 4417 主席树区间查询 题意 给你n个数(编号从0开始),然后查询区间内小于k的数的个数. 解题思路 这个可以使用主席树来处理,因为这个很类似查询区间内的第k小的问题 ...
- HDU 6278 主席树(区间第k大)+二分
Just h-index Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others)To ...
- HDU - 6621 K-th Closest Distance 主席树+二分答案
K-th Closest Distance 主席树第二波~ 题意 给你\(n\)个数\(m\)个询问,问\(i\in [l,r]\)计算每一个\(|a_{i}-p|\)求出第\(k\)小 题目要求强制 ...
随机推荐
- cakephp跳转到指定的错误页面
第一步:修改core.php 第二步:创建AppExceptionRender.php文件 参考:https://blog.jordanhopfner.com/2012/09/11/custom-40 ...
- vnpy自动化交易
c++ python 写的自动化交易平台 期货ctp
- matrix derivatives
来源:cs229 stanford Machine Learning Notes
- python 数据合并
1. 数据合并 前言 一.横向合并 1. 基本合并语句 2. 键值名不一样的合并 3. “两个数据列名字重复了”的合并 二.纵向堆叠 统计师的Python日记[第6天:数据合并] 前言 根据我的Pyt ...
- cef相关
chrome命令行参数:https://www.cnblogs.com/hushaojun/p/5981646.html cef启动调试,启动的命令行:--disable-web-security - ...
- RF和GBDT的区别
Random Forest 采用bagging思想,即利用bootstrap抽样,得到若干个数据集,每个数据集都训练一颗树. 构建决策树时,每次分类节点时,并不是考虑全部特征,而是从特征候选集中选取 ...
- ThinkPhp数据缓存技术
1.缓存初始化 在 ThinkPHP 中,有一个专门处理缓存的类:Cache.class.php(在Thinkphp/Library/Think/cache.class.php,其他的各种缓存类也在这 ...
- 编写高质量代码改善C#程序的157个建议——建议81:使用Parallel简化同步状态下Task的使用
建议81:使用Parallel简化同步状态下Task的使用 在命名空间System.Threading.Tasks中,有一个静态类Parallel简化了在同步状态下的Task的操作.Parallel主 ...
- Gym - 100971J ——DFS
Statements Vitaly works at the warehouse. The warehouse can be represented as a grid of n × mcells, ...
- Java中String、StringBuffer和StringBuilder之间的区别
String在Java中是字符串常量 例如 String str = "abc"; str = str + 1; System.out.println(str); 结果将是abc1 ...