2019牛客暑期多校训练营(第七场)-E Find the median (线段树+离散化 区间为点)
题目链接:https://ac.nowcoder.com/acm/contest/887/E
题意:给出L[i],R[i],每次添加L[i]...R[i],求出此时的中位数。
思路:因为添加的数范围为1e9,首先想到要用离散化,这里是用一个点来表示一个区间。
将右区间加一的主要目的是优化处理,将区间最后一个元素并入到前面,自己模拟一下就能明白啦。
然后用线段树维护每个节点所包含的元素个数,用懒惰标记laz表示加的次数,然后每次查询时若左子树的元素个数足够则在左子树查询,否则在右子树查询。
详见代码:
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std; typedef long long LL;
const int maxn=4e5+; struct node{
int l,r,laz;
LL sz;
}tr[maxn<<]; int n;
LL X[maxn],Y[maxn],A1,A2,B1,B2,C1,C2,M1,M2;
vector<int> vc; void build(int v,int l,int r){
tr[v].l=l,tr[v].r=r;
if(l==r){
return;
}
int mid=(l+r)>>;
build(v<<,l,mid);
build(v<<|,mid+,r);
} void pushdown(int v){
tr[v<<].sz+=(vc[tr[v<<].r+]-vc[tr[v<<].l])*tr[v].laz;
tr[v<<].laz+=tr[v].laz;
tr[v<<|].sz+=(vc[tr[v<<|].r+]-vc[tr[v<<|].l])*tr[v].laz;
tr[v<<|].laz+=tr[v].laz;
tr[v].laz=;
} void update(int v,int l,int r){
if(l<=tr[v].l&&r>=tr[v].r){
tr[v].sz+=(vc[tr[v].r+]-vc[tr[v].l]);
tr[v].laz+=;
return;
}
if(tr[v].laz) pushdown(v);
int mid=(tr[v].l+tr[v].r)>>;
if(l<=mid) update(v<<,l,r);
if(r>mid) update(v<<|,l,r);
tr[v].sz=tr[v<<].sz+tr[v<<|].sz;
} int query(int v,LL k){
if(tr[v].l==tr[v].r){
int tmp=tr[v].sz/(vc[tr[v].l+]-vc[tr[v].l]);
return vc[tr[v].l]+(k-)/tmp;
}
if(tr[v].laz) pushdown(v);
if(k<=tr[v<<].sz) return query(v<<,k);
else return query(v<<|,k-tr[v<<].sz);
} int main(){
scanf("%d",&n);
scanf("%lld%lld%lld%lld%lld%lld",&X[],&X[],&A1,&B1,&C1,&M1);
scanf("%lld%lld%lld%lld%lld%lld",&Y[],&Y[],&A2,&B2,&C2,&M2);
for(int i=;i<=n;++i){
X[i]=(A1*X[i-]%M1+B1*X[i-]%M1+C1)%M1;
Y[i]=(A2*Y[i-]%M2+B2*Y[i-]%M2+C2)%M2;
}
for(int i=;i<=n;++i){
++X[i],++Y[i];
if(X[i]>Y[i]) swap(X[i],Y[i]);
vc.push_back(X[i]),vc.push_back(Y[i]+);
}
sort(vc.begin(),vc.end());
vc.erase(unique(vc.begin(),vc.end()),vc.end());
LL sum=;
int cnt=vc.size();
build(,,cnt-);
for(int i=;i<=n;++i){
sum+=Y[i]-X[i]+;
int x,y;
x=lower_bound(vc.begin(),vc.end(),X[i])-vc.begin();
y=lower_bound(vc.begin(),vc.end(),Y[i]+)-vc.begin();
update(,x,y-);
printf("%d\n",query(,(sum+)>>));
}
return ;
}
2019牛客暑期多校训练营(第七场)-E Find the median (线段树+离散化 区间为点)的更多相关文章
- 2019牛客暑期多校训练营(第九场)A:Power of Fibonacci(斐波拉契幂次和)
题意:求Σfi^m%p. zoj上p是1e9+7,牛客是1e9: 对于这两个,分别有不同的做法. 前者利用公式,公式里面有sqrt(5),我们只需要二次剩余求即可. 后者mod=1e9,5才 ...
- 2019牛客暑期多校训练营(第一场)A题【单调栈】(补题)
链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 题目描述 Two arrays u and v each with m distinct elem ...
- 2019牛客暑期多校训练营(第一场) B Integration (数学)
链接:https://ac.nowcoder.com/acm/contest/881/B 来源:牛客网 Integration 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 5242 ...
- 2019牛客暑期多校训练营(第一场) A Equivalent Prefixes ( st 表 + 二分+分治)
链接:https://ac.nowcoder.com/acm/contest/881/A 来源:牛客网 Equivalent Prefixes 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/ ...
- 2019牛客暑期多校训练营(第二场)F.Partition problem
链接:https://ac.nowcoder.com/acm/contest/882/F来源:牛客网 Given 2N people, you need to assign each of them ...
- 2019牛客暑期多校训练营(第一场)A Equivalent Prefixes(单调栈/二分+分治)
链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 Two arrays u and v each with m distinct elements ...
- [状态压缩,折半搜索] 2019牛客暑期多校训练营(第九场)Knapsack Cryptosystem
链接:https://ac.nowcoder.com/acm/contest/889/D来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言52428 ...
- 2019牛客暑期多校训练营(第二场)J-Subarray(思维)
>传送门< 前言 这题我前前后后看了三遍,每次都是把网上相关的博客和通过代码认真看了再思考,然并卵,最后终于第三遍也就是现在终于看懂了,其实懂了之后发现其实没有那么难,但是的的确确需要思维 ...
- 2019牛客暑期多校训练营(第一场)-A (单调栈)
题目链接:https://ac.nowcoder.com/acm/contest/881/A 题意:给定两个长度均为n的数组a和b,求最大的p使得(a1,ap)和(b1,bp)等价,等价的定义为其任意 ...
- 2019牛客暑期多校训练营(第一场)A - Equivalent Prefixes(单调栈)
题意 给定两个$n$个元素的数组$a,b$,它们的前$p$个元素构成的数组是"等价"的,求$p$的最大值."等价"的意思是在其任意一个子区间内的最小值相同. $ ...
随机推荐
- is(expr|obj|ele|fn)
is(expr|obj|ele|fn) 概述 根据选择器.DOM元素或 jQuery 对象来检测匹配元素集合,如果其中至少有一个元素符合这个给定的表达式就返回true.大理石平台支架 如果没有元素符合 ...
- Sysinternals
http://baike.baidu.com/link?url=LwEFVIcB4h8WaS6sVVH2toBJ0GZUA28yymm1sLsGpDrzF3G2BCZenlHwIsYZdVJZQExE ...
- java+上传后的文件展示
文件夹结构支持 大文件上传控件6支持向服务器上传整个文件夹,并且在服务端保存时与本地目录结构完全保持一致,同时在数据库中也保留文件夹的层级结构.开发人员可以借助于数据库中的层级信息方便的管理文件,管理 ...
- CISCO实验记录五:静态路由与RIP动态路由
一.实验要求 1.创建设备间静态路由 2.检查三层连通性 3.清空路由,使用RIP创建动态路由 4.检查路由表 二.实验操作 1.创建设备静态路由 #iip route 192.168.1.0 255 ...
- Linux设备驱动程序 之 休眠
休眠简介 当一个进程被置入休眠时,它会被标记为一种特殊状态,并从调度器的运行队列中移走:直到某些情况下修改了这个状态,进程才会在任意cpu上调度,即运行该进程:休眠中的进程会被搁置在一边,等待将来的某 ...
- Linux设备驱动程序 之 open和release
open方法 open方法提供给驱动程序以初始化的能力,在大部分驱动程序汇总,open应该完成以下工作: 1. 检查特定设备的错误,如设备为准备就绪或者硬件问题: 2. 如果设备是首次打开,则对其进行 ...
- Java中的<< 和 >> 和 >>> 分析理解
Java中的<< 和 >> 和 >>> 详细分析 <<表示左移移,不分正负数,低位补0: 注:以下数据类型默认为byte-8位 左移时不管正负,低 ...
- tensorflow训练中出现nan
问题暂记: 之后看 https://blog.csdn.net/qq_23142123/article/details/80526931 https://www.zhihu.com/question/ ...
- Python中调用shell
1 简单调用shell命令 os.system(command) 在一个子shell中运行command命令, 并返回command命令执行完毕后的退出状态. 这实际上是使用C标准库函数system( ...
- 黑马vue---17、vue中通过属性绑定绑定style行内样式
黑马vue---17.vue中通过属性绑定绑定style行内样式 一.总结 一句话总结: 如果属性名中带有短线必须加引号,比如: h1StyleObj: { color: 'red', 'font-s ...