2023年1月23日山師訓練賽2

2021-10-02 13:01:39 字數 1772 閱讀 4258

題目鏈結

題意:有 n 個人,每個人會且僅會一種語言.

有 m 個電影,電影語言分為 音訊語言 和 字幕語言,且同場電影的音訊語言和字幕語言不同.

當人**電影時,如果他會該電影的音訊語言,他會非常高興.

當人**電影時,如果他會該電影的字幕語言,他會比較高興.

現要求選擇一場電影,使得非常高興的人數最多,若解不唯一,則選擇比較高興人數最多,輸出該電影的編號.

對於:給出的資料:(1 ≤ n ≤ 200 000)(1 ≤ m ≤ 200 000) 每個人掌握的語言(1 ≤ ai ≤ 109) 對應電影的音訊語言

(1 ≤ bj ≤ 109) 對應電影的字母語言 (1 ≤cj ≤ 109)

解法:如果直接寫的話發現編譯會出錯,原因是 ai, bi, ci 的資料範圍太大,陣列開不下,我們的目的只是根據大小對ai,bi,ci來排序,只需要他們的相對大小,據此來重新編號,需要用到乙個方法離散化,離散化的步驟如下:

將資料寫到乙個陣列 d 中

將陣列 d 進行排序(sort())

排序後對陣列 d 進行去重(unique())

當詢問元素的相對大小時,由於資料有序,我們可以採用二分查詢的方式查詢元素 x 的位置.

**:

#include

#include

#include

#include

const

int maxn=

2e5+10;

typedef

long

long ll;

ll a[maxn]

,b[maxn]

,c[maxn]

,d[3

*maxn+10]

,num[maxn]

,len,n,m;

using

namespace std;

voidf(

)intw(

int x)

//二分查詢x在d中的位置

intmain()

} cout<}

解法:若是每塗一次就迴圈一次,太複雜會超時,所以需要用到差分陣列(字首和的逆運算),為此我看了一下大佬的差分陣列講解,數陣列a[i]即為所求氣球塗顏色的次數,那麼我們就用差分陣列的方法去求,假如現在對數列中區間[l,r]上的數加上x,第乙個受影響的差分陣列中的元素為a[l],即令a[l]+=x,那麼後面數列元素在計算過程中都會加上x;最後乙個受影響的差分陣列中的元素為a[r],所以令a[r+1]-=x,即可保證不會影響到r以後數列元素的計算。這樣我們不必對區間內每乙個數進行處理,只需處理兩個差分後的數即可.;

**:

#include

#include

#include

using

namespace std;

const

int maxn=

100010

;int

main()

,k;while

(scanf

("%d"

,&n)!=0

)for

(int i=

2;i<=k;i++

)for

(int i=

1;i<=k;i++)

cout<<<

' ';

cout<}}

山師訓練賽1 21補題

乙個機場有若干架飛機,從t 1時刻開始起飛,但現在由於一些原因,必須從k 1開始重新安排飛機班次,每架飛機延誤都有乙個損失值,要使得每架飛機的損失值乘以延遲時間的和最小。一道貪心的題目,貪心策略是k 1之後的航班全部都按原時間起飛,k 1時刻損失最大的起飛,然後按除開按原時間起飛的航班,其他按從大到...

訓練賽 2023年1月16日訓練賽總結

訓練賽位址 rank 3 總結一下訓練賽的情況,53分鐘出6道水題以後暫列第一,手速其實還可以,狀態也不錯,不過之後可能就浮躁了,然後看題目也看不全,寫 也是缺三漏四。c題錯在沒有初始化陣列。wa1。d題沒有看資料範圍一看題就以為是最長上公升子串行,然後t了,然後重新看題目,才發現是每次上公升1的子...

1月21日訓練賽

把m個同樣的蘋果放在n個同樣的盤子裡,允許有的盤子空著不放,問共有多少種不同的分法?用k表示 5,1,1和1,5,1 是同一種分法。input 第一行是測試資料的數目t 0 t 20 以下每行均包含二個整數m和n,以空格分開。1 m,n 10。output 對輸入的每組資料m和n,用一行輸出相應的k...