题目链接: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 (线段树+离散化 区间为点)的更多相关文章

  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. ege图形库之动画排序

    老师布置了一个学习ege图形库来做动画排序的小动画程序,这是我自己做的效果.由于个人水平有限,可能代码有些地方可以改进.不足之处敬请指出. 注:要运行该代码需要正确配置,连接好ege图形库的头文件,做 ...

  2. 【luoguP2675】《瞿葩的数字游戏》T3-三角圣地

    题目背景 国王1带大家到了数字王国的中心:三角圣地. 题目描述 不是说三角形是最稳定的图形嘛,数字王国的中心便是由一个倒三角构成.这个倒三角的顶端有一排数字,分别是1~N.1~N可以交换位置.之后的每 ...

  3. codeforces163D

    Large Refrigerator CodeForces - 163D 给定一个长方体的体积V,求出这个长方体的最小表面积. 输入 第一行有一个整数t (1 ≤ t ≤ 500) — 测试数据的组数 ...

  4. django 快速实现文件上传(四)

    继博客(三)实现的, 建两个字段,username 用户存放用户名,headImg 用户存放上传文件的路径. 重新同步数据库: 提示: 这个可能是之前已创建了表中的一条记录,之后模型中增加了一个非空的 ...

  5. Java项目服务器跨域设置

    引入jar包 cors-filter-2.6 :http://central.maven.org/maven2/com/thetransactioncompany/cors-filter/2.6/co ...

  6. 手把手教你在Linux系统下安装MongoDB

    1. 下载最新的stable版MongoDB [root@spirit-of-fire ~]# wget http://downloads.mongodb.org/linux/mongodb-linu ...

  7. 【零基础】斯坦福四足机器人DIY指引

    可以后空翻的机器狗 近日斯坦福开源了一个四足机器人项目“Stanford Doggo”,“只需”3000美金就可以DIY一个能跳一米高兼后空翻的电子小狗,一段时间研究后我们写了这篇简单的指引帮助大家快 ...

  8. Camera 采集图像的方法

    使用 Camera 采集图像, 实现步骤如下: 需要权限: android.permission.CAMERA android.permission.WRITE_EXTERNAL_STORAGE // ...

  9. HttpClient提交数据

    用代码模拟浏览器的行为 * 轻量级的开源的框架 * Android在6.0 23 以后移除了httpclient ,所以开发中用的少了 * 编写步骤: 1. 打开浏览器 2. 输入网址 3. 敲回车 ...

  10. java代码实现简体繁体转换

    汉字分为简体和繁体字,这是众所周知的,虽然繁体字中国大陆这边用的并不会太多,但时不时的还是会使用到.那么,如何做到简体字和繁体字的转换呢?其实很简单,这里附上一个java版本的简繁体转换,用网上找的接 ...