NOIP2017提高組 列隊

2021-08-30 15:23:46 字數 2457 閱讀 4031

noip2017提高組 day2 t3

sylvia 是乙個熱愛學習的女孩子。

前段時間,sylvia 參加了學校的軍訓。眾所周知,軍訓的時候需要站方陣。sylvia 所在的方陣中有 n×m 名學生,方陣的行數為 n,列數為 m 。

為了便於管理,教官在訓練開始時,按照從前到後,從左到右的順序給方陣中的學生從 1 到 n×m 編上了號碼(參見後面的樣例)。即:初始時,第 i 行第 j 列的學生的編號是 (i-1)×m+j。

然而在練習方陣的時候,經常會有學生因為各種各樣的事情需要離隊。在一天中,一共發生了 q 件這樣的離隊事件。每一次離隊事件可以用數對 (x,y) (1≤x≤n,1≤y≤m)描述,表示第 x 行第 y 列的學生離隊。

在有學生離隊後,隊伍中出現了乙個空位。為了隊伍的整齊,教官會依次下達這樣的兩條指令:

1. 向左看齊。這時第一列保持不動,所有學生向左填補空缺。不難發現在這條指令之後,空位在第 x 行第 m 列。

2. 向前看齊。這時第一行保持不動,所有學生向前填補空缺。不難發現在這條指令之後,空位在第 n 行第 m 列。

教官規定不能有兩個或更多學生同時離隊。即在前乙個離隊的學生歸隊之後,下乙個學生才能離隊。因此在每乙個離隊的學生要歸隊時,隊伍中有且僅有第 n 行第 m  列乙個空位,這時這個學生會自然地填補到這個位置。

因為站方陣真的很無聊,所以 sylvia 想要計算每一次離隊事件中,離隊的同學的編號是多少。

注意:每乙個同學的編號不會隨著離隊事件的發生而改變,在發生離隊事件後方陣中同學的編號可能是亂序的。

輸入共 q+1 行。

第 1 行包含 3 個用空格分隔的正整數 n,m,q,表示方陣大小是 n 行 m 列,一共發生了 q 次事件。

接下來 q 行按照事件發生順序描述了 q 件事件。每一行是兩個整數 x,y,用乙個空格分隔,表示這個離隊事件中離隊的學生當時排在第 x 行第 y 列。

按照事件輸入的順序,每乙個事件輸出一行乙個整數,表示這個離隊事件中離隊學生的編號。

輸入

2 2 3

1 12 2

1 2

輸出

1 1

4

【輸入輸出樣例1說明】

列隊的過程如上圖所示,每一行描述了乙個事件。

在第乙個事件中,編號為1的同學離隊,這時空位在第一行第一列。接著所有同學向左標齊,這時編號為 2 的同學向左移動一步,空位移動到第一行第二列。然後所有同學向上標齊,這時編號為 4 的同學向上一步,這時空位移動到第二行第二列。最後編號為 1 的同學返回填補到空位中。

【資料規模與約定】

資料保證每乙個事件滿足 1≤x≤n;1≤y≤m。

解析:線段樹。

實現前30分直接模擬。

然後我們來看n=1的情況,只需要找出第k個數,將它移到隊尾即可,於是就可以愉快地 treap/splay 啦。

因為m不大,於是考慮用權值線段樹,每次找出第k個沒有使用的位置。

1.如果找到的數小等於m,將它標記為使用,加進 vector 中。

2.如果找道的數大於m,則實際值即為 vector 裡的第 num-m 個數。

對於100%的資料,我們仍可以使用以上做法,對每一行都建一顆權值線段樹。特別的,我們還要對最後一列建一顆權值線段樹。對於每個操作,分兩種情況:

1.該位置 (x,y) 中若 y2.該位置 (x,y) 中若 y<=m,則直接在最後一列線段樹上查詢和修改。

線段樹要動態開點,注意開。

分析一下時間與空間複雜度:

首先時間複雜度容易知道是:

其次空間複雜度,由於是動態開點,所以每次查詢q次,每次更新 logn 個節點,所以大致還是

**:

#pragma gcc optimize(3)

#include #define ll long long

using namespace std;

const int max=300005;

int n,m,q,sum,tot;

int tree[max*20],lc[max*20],rc[max*20],rt[max];

vectornum[max];

inline int get_int()

inline void print(ll x)

inline void add(int &now,int l,int r,int pos)

inline int q(int root,int l,int r,int k)

inline ll qr(int x,ll v)

inline ll ql(int x,int y)

int main()

return 0;

}

NOIp2017提高組 列隊

乙個 n times m n,m le3 times10 5 的方陣,每個格仔裡的人都有乙個編號。初始時第 i 行第 j 列的編號為 i 1 m j q q le3 times10 5 次事件,每次在 x,y 位置上的人離隊。剩下的人向左 向前填補空位,然後離隊的人在 n,m 處歸隊。求每次離隊事件...

Noip2017提高組 乳酪

noip 2017 提高組 不怎麼難啦 思路如下 首先先寫乙個函式判斷兩個洞是否相連,即兩洞之間距離是否小於等於球直徑 注意是直徑 struct dong dong p 1001 bool pd dong a,dong b 第二個難點在於如何判斷是否可以穿過乳酪,對此我們可以模擬老鼠鑽洞 run函式...

NOIP 2017 提高組 寶藏

傳送門 參與考古挖掘的小明得到了乙份藏寶圖,藏寶圖上標出了 n nn 個深埋在地下的寶藏屋,也給出了這 n nn 個寶藏屋之間可供開發的 m mm 條道路和它們的長度。小明決心親自前往挖掘所有寶藏屋中的寶藏。但是,每個寶藏屋距離地面都很遠,也就是說,從地面打通一條到某個寶藏屋的道路是很困難的,而開發...