题目出处:Find the median

示例:

输入:

5
3 1 4 1 5 9
2 7 1 8 2 9

输出:3 4 5 4 5

说明:L = [3, 2 ,4, 1, 7],R = [4, 8, 8, 3, 9]

题意:每次插入[l[i],r[i]][l[i],r[i]],询问中位数

题解:线段树模版题+离散化(不懂或忘了这些的先补充下知识)。线段树的区间操作。但是由于范围太大,需要离散化,所以就出现了连续性的问题。所以只能用线段树维护 左闭右开 即:[w[l],w[r])。

code:

#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int maxx=8e6+;
LL summ[maxx],w[maxx],lz[maxx];
void pushdown(int l,int r,int root)
{
if(lz[root]){
int mid=(l+r)>>;
summ[root<<]+=(w[mid]-w[l])*lz[root];
summ[root<<|]+=(w[r]-w[mid])*lz[root];
lz[root<<]+=lz[root],lz[root<<|]+=lz[root];
lz[root]=;
}
}
void update(int l,int r,int root,int L,int R)
{
if(L<=l&&r-<=R){//更新区间[w[l],w[r]]
lz[root]++;//将一大段加入每个点加入的数储存,未用的不下放
summ[root]+=w[r]-w[l];
return ;
}
pushdown(l,r,root);//下放lz标记储存的数
int mid=(l+r)>>;
if(L<mid)update(l,mid,root<<,L,R);
if(R>=mid)update(mid,r,root<<|,L,R);
summ[root]=summ[root<<]+summ[root<<|];
}
LL query(int l,int r,int root,LL k)
{
if(l+==r){//当l+1=r时,表示当前最小的一段区间,该区间的数的个数一定相等
LL lo=summ[root]/(w[r]-w[l]);
return w[l]+(k-)/lo;
}
pushdown(l,r,root);//下发lz标记储存的数
int mid=(l+r)>>;
if(summ[root<<]>=k)return query(l,mid,root<<,k);
else return query(mid,r,root<<|,k-summ[root<<]);
}
LL n,tot=,A1,A2,B1,B2,C1,C2,M1,M2;
LL x[maxx],y[maxx],_l[maxx],_r[maxx];
int main()
{
scanf("%lld",&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++)//按题意算出xi、yi的值
x[i]=(A1*x[i-]+B1*x[i-]+C1)%M1,y[i]=(A2*y[i-]+B2*y[i-]+C2)%M2;
for(int i=;i<=n;i++){//按题意处理左右区域和储存所有点以便后面离散化
_l[i]=min(x[i],y[i])+,_r[i]=max(x[i],y[i])+;//为了得到一个较好的操作区间
w[tot++]=_l[i],w[tot++]=_r[i];
}
sort(w+,w+tot);//排序
tot=unique(w+,w+tot)-w;//离散化去除重复点
LL sum=;//统计第几次加入点后点的总数
for(int i=;i<=n;i++){
int l=lower_bound(w+,w+tot,_l[i])-w;//
int r=lower_bound(w+,w+tot,_r[i])-w;
update(,tot,,l,r-);//在线段树中加入一段新的数据
sum+=w[r]-w[l];
printf("%lld\n",query(,tot,,(sum+)/));//查询第i段数据加入后的中位数
}
return ;
}

Find the median(线段树+离散化)(2019牛客暑期多校训练营(第七场))的更多相关文章

  1. 2019牛客暑期多校训练营(第一场)I dp+线段树

    题意 给出n个点,每个点有a,b两个属性,让你从左下角到右上角划一条线,线的左边每个点的贡献是\(a_i\),线的右边每个点的贡献是\(b_i\),使得两部分的总和最大. 分析 找一条折线将点分割开, ...

  2. DP+线段树维护矩阵(2019牛客暑期多校训练营(第二场))--MAZE

    题意:https://ac.nowcoder.com/acm/contest/882/E 给你01矩阵,有两种操作:1是把一个位置0变1.1变0,2是问你从第一行i开始,到最后一行j有几种走法.你只能 ...

  3. Points Division(线段树+DP)2019牛客暑期多校训练营(第一场)

    题意:https://ac.nowcoder.com/acm/contest/881/I 给你n个平面上的点,每个点有a.b两个权值,现在让你划分成两个区域(要求所有A集合里的点不能在任何B集合里的点 ...

  4. 2019牛客暑期多校训练营(第二场)E 线段树维护dp转移矩阵

    题意 给一个\(n\times m\)的01矩阵,1代表有墙,否则没有,每一步可以从\(b[i][j]\)走到\(b[i+1][j]\),\(b[i][j-1]\),\(b[i][j+1]\),有两种 ...

  5. 2019牛客暑期多校训练营(第九场)H Cutting Bamboos(主席树+二分)

    题意:n个竹子,有高度,q次询问,询问之间是独立的,每次查询输入l,r,x,y代表砍区间[l,r]]内的竹子砍y次,最后一次要砍成0,每次砍掉的总长度相同,问第x次砍的高度是多少. 既然每次要求砍掉的 ...

  6. 2019牛客暑期多校训练营(第二场)-E MAZE

    题目链接:https://ac.nowcoder.com/acm/contest/882/E 题意:n×m的矩阵,0表示可以走,1表示墙,不能通过.有q中操作,一种是改变坐标(x,y)的状态,一种是询 ...

  7. 2019牛客暑期多校训练营(第九场)A:Power of Fibonacci(斐波拉契幂次和)

    题意:求Σfi^m%p. zoj上p是1e9+7,牛客是1e9:  对于这两个,分别有不同的做法. 前者利用公式,公式里面有sqrt(5),我们只需要二次剩余求即可.     后者mod=1e9,5才 ...

  8. 2019牛客暑期多校训练营(第一场)A题【单调栈】(补题)

    链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 题目描述 Two arrays u and v each with m distinct elem ...

  9. 2019牛客暑期多校训练营(第一场) B Integration (数学)

    链接:https://ac.nowcoder.com/acm/contest/881/B 来源:牛客网 Integration 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 5242 ...

  10. 2019牛客暑期多校训练营(第一场) A Equivalent Prefixes ( st 表 + 二分+分治)

    链接:https://ac.nowcoder.com/acm/contest/881/A 来源:牛客网 Equivalent Prefixes 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/ ...

随机推荐

  1. Plist文件编辑工具PlistEdit Pro 1.9.1动态调试分析

    0x00:简介     PlistEdit Pro是为macOS平台最优秀的属性列表和JSON编辑器.Mac和iOS开发人员在开发应用程序时必须编辑各种属性列表和JSON文件.PlistEdit Pr ...

  2. python 使用xpath解析含有命名空间(xmlns)的xml

    解决办法: from lxml import etree xml = etree.parse("./cee.xml") root = xml.getroot() print(roo ...

  3. 钟长者P71解题报告

    T1 [题目描述] 给你N个字符串,你每次可以选择其中一个字符串的一段前缀进行翻转,但是你必须保证这个前缀的长度是偶数.你可以进行无限次这样的操作,并且如果两个字符串变得相同的时候,你就可以把这两个字 ...

  4. B. Heaters ( Codeforces Round #515 (Div. 3) )

    题解:对于每个点 i 来说,从 j = i + r - 1 开始往前找,如果找到一个 a [ j ] 是 1 ,那么就把它选上,但是我们需要判断交界处,也就是如果前面选的那个可以让这个点变温暖,就不用 ...

  5. beforeDestroy的使用

    beforeDestroy ---实例销毁之前调用 需求是这样的: important:下面截图数据都是测试数据 日期在我点击查询的时候要存储,刷新就读内存,但是我点击其他页面再进来的时候,这个内存要 ...

  6. 【Excel】多条件查找

    例如下图:要求在单元格从C10中根据分类与名称找出相应的数量 1.VLOOKUP函数(数组公式) {=VLOOKUP(A10&B10,IF({1,0},A2:A6&B2:B6,C2:C ...

  7. fastq 转换为 fasta

    使用 awk awk '{if(NR%4 == 1){print ">" substr($0, 2)}}{if(NR%4 == 2){print}}' XXX.fastq & ...

  8. Hadoop(五)—— HDFS NameNode、DataNode工作机制

    一.NN与2NN工作机制 NameNode(NN) 1.当HDFS启动时,会加载日志(edits)和镜像文件(fsImage)到内存中. 2-4.当元数据的增删改查请求进来时,NameNode会先将操 ...

  9. CTF PHP反序列化

    目录 php反序列化 一.序列化 二.魔术方法 1.构造函数和析构函数 2.__sleep()和__wakeup() 3.__toString() 4.__set(), __get(), __isse ...

  10. Linux配置crontab

    1. 添加任务(每分钟执行一次)crontab -e* * * * * /home/lings/logRotate.sh 2. 查看日志Jun 5 20:25:01 localhost CROND[8 ...