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.pswp.cn/news/447819.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/447819.shtml
英文地址,請注明出處:http://en.pswp.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.上車前喊報告什么…