2019牛客多校第七场E Find the median 权值线段树+离散化

Find the median

题目链接:

https://ac.nowcoder.com/acm/contest/887/E

题目描述

Let median of some array be the number which would stand in the middle of this array if it was sorted beforehand. If the array has even length let median be smallest of of two middle elements. For example, median of the array \([10,3,2,3,2]\) is 3 (i.e. \([2,2,\underline{3},3,10]\)). Median of the array [1,5,8,1] is 1 (i.e. \([1,\underline{1},5,8]\)).

At first, you're given an empty sequence. There are N operations. The i-th operation contains two integers \(L_i\) and \(R_i\). This means that adding \(R_i-L_i+1\) integers \(L_i, L_i+1, ... , R_i\) into the sequence. After each operation, you need to find the median of the sequence.

输入描述:

The first line of the input contains an integer \(N\ (1 \leq N \leq 400000)\) as described above.

The next two lines each contains six integers in the following format, respectively:

  • \(X_1\ X_2\ A_1\ B_1\ C_1\ M_1\)
  • \(Y_1\ Y_2\ A_2\ B_2\ C_2\ M_2\)

These values are used to generate \(L_i, R_i\) as follows:

We define:

  • \(X_i = (A_1 \times X_{i-1} + B_1 \times X_{i-2} + C_1)\ module\ M_1\), for \(i= 3\ to\ N\)
  • \(Y_i = (A_2 \times Y_{i-1} + B_2 \times Y_{i-2} + C_2)\ module\ M_2\), for \(i = 3\ to\ N\)

We also define:

  • \(L_i = min(X_i, Y_i) + 1\), for \(i = 1\ to\ N\).
  • \(R_i = max(X_i, Y_i) + 1\), for \(i = 1\ to\ N\).

Limits:
\(1 \leq N \leq 400000\)
\(0 \leq A_1 < M_1\)
\(0 \leq A_2 < M_2\)
\(0 \leq B_1 < M_1\)
\(0 \leq B_2 < M_2\)
\(0 \leq C_1 < M_1\)
\(0 \leq C_2 < M_2\)
\(0 \leq X_1 < M_1\)
\(0 \leq X_2 < M_1\)
\(0 \leq Y_1 < M_2\)
\(0 \leq Y_2 < M_2\)
\(1 \leq M_1 \leq 10^9\)
\(1 \leq M_2 \leq 10^9\)

输出描述:

You should output lines. Each line contains an integer means 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]

题意

给你一个空序列,\(n\)条指令,每次给你\(l,r\) ,表示向序列中加入\(l,l+1,\cdots,r\) 总共\(r-l+1\)个元素,每条指令后输入序列的中位数。

\(n\)条指令按题目所给的方法生成。

题解

这题如果不用离散的话,直接上权值线段树,这里着重讲一下离散的问题。

离散时我开始觉得很不能理解的地方:

  1. 什么时候左闭右开

  2. 什么时候右端点+1

  3. 什么时候右端点-1

我们不妨先来想一组数据:插入\((1,1) \ \ (1,5) \ \ (5,5)\)

如果按照普通离散是不是离散后就是\((1,1) \ \ (1,2) \ \ (2,2)\)

再用普通线段树,那么会发现\((1,1)+(2,2)\)\((1,2)\)效果一样,也就是中间的点没了,为什么呢?

就是因为离散后我们没法判断某个点是左端点还是右端点还是中间点,导致两点间隙无法判断。

我的处理方法:

  1. 将离散的点连起来变成求线段长度,比如求\((1,5)\)改成求\((1,6)\)这条线段的长度\((\)都是\(5)\)
  2. 线段树每个节点\((l,r)\),实际管理区间是\((l,r+1)\)
  3. 加入线段时,记得右端-1,因为线段树会往右多管理一个点

这样\((1,1) \ \ (1,5) \ \ (5,5)\) 就变成了\((1,2)\ \ (1,6)\ \ (5,6)\),离散后再变成\((1,2)\ \ (1,4) \ \ (3,4)\),记得加入时右端点-1,即\((1,1)\ \ (1,3)\ \ (3,3)\)这几个区间权值+1。

\(ps:\) 这种区间覆盖问题很多都是要考虑端点的问题。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define INF 0x7f7f7f7f
#define N 800050
template<typename T>void read(T&x)
{ll k=0; char c=getchar();x=0;while(!isdigit(c)&&c!=EOF)k^=c=='-',c=getchar();if (c==EOF)exit(0);while(isdigit(c))x=x*10+c-'0',c=getchar();x=k?-x:x;
}
void read_char(char &c)
{while(!isalpha(c=getchar())&&c!=EOF);}
ll n,num;
ll X[N],Y[N],kth[N];
struct Query{ll l,r;}que[N];
struct Tree{ll l,r,lazy,sum;}tr[N<<2];
void push_up(ll x)
{ll len=kth[tr[x].r+1]-kth[tr[x].l];if (tr[x].l==tr[x].r)tr[x].sum=0;else tr[x].sum=tr[x<<1].sum+tr[x<<1|1].sum;tr[x].sum+=tr[x].lazy*len;
}
void push_down(ll x)
{Tree &a=tr[x<<1],&b=tr[x<<1|1];a.lazy+=tr[x].lazy;b.lazy+=tr[x].lazy;tr[x].lazy=0;push_up(x<<1);push_up(x<<1|1);
}
void bt(ll x,ll l,ll r)
{tr[x].lazy=tr[x].sum=0; tr[x].l=l; tr[x].r=r; if (l==r)return;ll mid=(l+r)>>1;bt(x<<1,l,mid);bt(x<<1|1,mid+1,r);
}
void change(ll x,ll l,ll r)
{if (l<=tr[x].l&&tr[x].r<=r){tr[x].lazy++;push_up(x);return;}ll mid=(tr[x].l+tr[x].r)>>1;if (l<=mid)change(x<<1,l,r);if (mid<r)change(x<<1|1,l,r);push_up(x);
}
ll query(ll x,ll k)
{if (tr[x].l==tr[x].r)return kth[tr[x].l]+(k-1)/tr[x].lazy;push_down(x);ll ls=tr[x<<1].sum;if (ls<k)return query(x<<1|1,k-ls);else return query(x<<1,k);
}
void work()
{ll A1,B1,C1,A2,B2,C2,M1,M2,sum=0;read(n);read(X[1]); read(X[2]); read(A1); read(B1); read(C1); read(M1);read(Y[1]); read(Y[2]); read(A2); read(B2); read(C2); read(M2);for(ll i=3;i<=n;i++)X[i]=(A1*X[i-1]+B1*X[i-2]+C1)%M1;for(ll i=3;i<=n;i++)Y[i]=(A2*Y[i-1]+B2*Y[i-2]+C2)%M2;for(ll i=1;i<=n;i++){que[i].l=min(X[i],Y[i])+1;que[i].r=max(X[i],Y[i])+2;kth[++num]=que[i].l;kth[++num]=que[i].r;}sort(kth+1,kth+num+1);num=unique(kth+1,kth+num+1)-kth-1;bt(1,1,num);for(ll i=1;i<=n;i++){ll l=lower_bound(kth+1,kth+num+1,que[i].l)-kth;ll r=lower_bound(kth+1,kth+num+1,que[i].r)-kth;sum+=que[i].r-que[i].l;change(1,l,r-1);printf("%lld\n",query(1,(sum+1)/2));}}
signed main()
{
#ifndef ONLINE_JUDGEfreopen("aa.in","r",stdin);
#endifwork();
}

转载于:https://www.cnblogs.com/mmmqqdd/p/11514991.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/447819.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

男人肾虚的8大表现

导语&#xff1a;肾虚是一种常见的现象。尤其是男人&#xff0c;最害怕的就是肾虚。男人的了肾虚怎么办&#xff0c;肾虚主要都有哪些症状。下面专家给大家介绍一下男人肾虚的几种表现&#xff1a; 一、畏寒肢冷 “畏寒”指有怕冷而且怕风吹的感觉。“肢冷”指四肢手足冰冷&…

更改 nginx 默认端口 ( ubuntu、linux )

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 我想让一个demo 站点直接域名访问&#xff0c;不带端口&#xff0c;所以想用 80 端口启动对应前端工程。 发现 80 被 nginx 占用&a…

怎么更改Rstudio中的默认目录

方法一、 每次启动Rstudio之后&#xff0c;执行代码 setwd("F:/R/R_data")默认目录就会修改为双引号内的位置路径。 方法二、 对Rstudio进行设置一次即可。 ①点击Tools&#xff0c;打开Global Options. ②将位置设置完毕&#xff0c;点击 Apply 确认即可。 ③Rstudi…

职场十个方法 让专业气质成为你的符号!

1、任何时候都要准时。   上班或是开会的时候迟到&#xff0c;都会给别人一种你对工作不够认真的印象。所以请一定要多多注意时间的问题。当然你要注意的不仅仅是开始的时间&#xff0c;还有午休结束的时间&#xff0c;可不要贪图几分钟的自由&#xff0c;弃你的专业气质于不…

docker 虚悬镜像 ( 悬空镜像 ) :镜像没有仓库名或没有标签

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 我们在build镜像的过程中&#xff0c;可能会产生一些临时的不具有名称也没有作用的镜像他们的名称一般都是<none>, 我们可以执…

R-apply()函数

创建一个列表变量&#xff0c;它的第一个元素包含所有从0到9的平方数&#xff0c;第二个元素为10到19之内的所有平方数&#xff0c;依此类推&#xff0c;最后一个元素为90到99之内的平方数。没有平方数的元素也应该被包含在内&#xff01; 学习网友的解题思路&#xff0c;用的是…

编程兴趣真的是由“热情”驱动的吗?

当我告诉人们我以写代码为生时&#xff0c;他们翻着白眼问我编程是不是特无聊&#xff1f;有许多编程博客告诉我们&#xff0c;如果你想要精于编程&#xff0c;那么就必须先热爱编程。那么&#xff0c;这是不是意味着如果没有激情&#xff0c;那你就写不出一行代码&#xff1f;…

心生想往 ... ...

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 连日里的忙碌 ... 终又忍不住开始想往 ... 听着歌儿 放纵篇篇翻飞思绪 ... 抛下纷繁的朝九晚六和所有加班&#xff0c;于每一日&#…

C# 打开文件/跳转链接

mark一下~ 打开文件 1.打开文件夹&#xff1a; System.Diagnostics.Process.Start(FolderPath);-- 打开文件夹 System.Diagnostics.Process.Start(FolderPath"/"FileName); -- 打开文件夹中某个文件 2.用IE打开文件: System.Diagnostics.Process.Start("Explore…

身体曲线如何反映出健康

站在镜子前&#xff0c;看看自己的身材&#xff0c;是否匀称优美?身体曲线不仅是美和丑的象征&#xff0c;同时还能够反映出你的健康状况。 1.腿细 有些人四肢纤细或运动后易酸痛&#xff0c;可能意味着肌肉少、力量弱。多项研究表明&#xff0c;肌肉与健康状况及寿命都存在…

路的尽头 ...

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 一直一直的 想要有一个只属于自己的地方&#xff0c;或许可以说不只是一个地方&#xff0c;我想要的是一个叫作家的地方... 每每看到温…

R 数据框的操作

1.插入一列 根据自带数据集beaver 进行操作&#xff0c;比如插入一列id。 > colnames(beaver1) [1] "day" "time" "temp" "activ" > nrow(beaver1) [1] 114 方法1&#xff1a; new_beaver1$id rep(1,114)方法2 new_beaver1…

Docker 下载 JDK 镜像(docker search 、docker pull)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 我有一个dockerfile 中要引用 jdk。 运行脚本发现 居然没有JDK 原始镜像。早期是下载过的&#xff0c;不记得什么时候清掉了。 于是重新…

入夏多吃这些“杀菌菜”

天气逐渐变热&#xff0c;病原菌滋生快&#xff0c;肝炎、急性胃炎、急性肠炎、痢疾、霍乱等消化道疾病容易爆发。此时多吃“杀菌蔬菜”有杀灭和抑制细菌病毒的作用&#xff0c;有时甚至光靠这些杀菌菜就可以治疗疾病。 专家建议&#xff0c;在炎热的夏季为了保证胃肠道的健康&…

R 读取excel的方法

1.加载 readxl 包&#xff0c;利用 reade_excel() 函数 install.packages("readxl") library(readxl) data read_excel("22_data.xlsx",sheet 1) read_excel函数的参数设置&#xff1a; 用法&#xff1a;read.xlsx(xlsxFile, sheet 1, startRow 1, co…

数据结构与算法-ADT-Array

Array ADT 一维数组是连续元素的集合&#xff0c;其中的每个元素都可以通过唯一的整数下标来存取。数组的大小在创建后不能修改。 ADT 定义&#xff1a; Array(size): 创建一个长度为 size 的一维数组&#xff0c;并且将每个元素初始化成 Nonelength(): 返回数组中的元素个数ge…

前端VUE工程不占用80端口,浏览器不带端口访问VUE项目的实现

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1.需求&#xff1a;直接域名访问项目&#xff0c;不用IP&#xff0c;也不带端口号。 1&#xff09;访问项目方法通常是 IP&#xff1a;…

新驾考科目三有四个地方易犯错 多名教练提供对策

驾考科目三 四个地方易犯错 多名驾校教练为学员分析原因提供对策 “现在电子评判&#xff0c;比起原来人工评判&#xff0c;更客观&#xff0c;更公平。”有驾校教练把自己这两天当安全员参加考试的经验拿出来与学员们分享。 18分钟来得及 “考试时间完全够用!”20日安康达驾校…

个人看过的动漫、动画电影推荐

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 我看过的不多&#xff0c;反正我觉得都挺好看的。 个人比较喜欢看电影版本的&#xff0c;不偏好多集的正宗动漫&#xff0c; 一集一集太…

广州科目三路考经历与注意事项分享

在百度找不到具体的广州本地车考考路面的流程,本人上周五刚刚考过了路面,觉得应该将过程写出来,以便后面的朋友或者想百度谷歌广州本地车考考路面情况的网友们做个参考.首先,广州本地考绝对没有其它省市路考的那么复杂,举例:1.下车检查前后轮-广州的路考不必;2.上车前喊报告什么…