NOIp2017D2T3 列隊(線段樹)

2021-08-22 08:18:16 字數 2392 閱讀 9646

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

前段時間,sylvia參加了學校的軍訓。眾所周知,軍訓的時候需要站方陣。

sylvia 所在的方陣中有 n×mn \times mn×m 名學生,方陣的行數為 nnn ,列數為 mmm 。

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

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

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

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

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

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

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

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

輸入格式:

輸入共 q+1q+1q+1 行。

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

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

輸出格式:

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

輸入樣例#1:複製

2 2 3 

1 1

2 2

1 2

輸出樣例#1:複製

1

14

【資料規模與約定】

題目分析

我不會平衡樹啊qaq

考慮對每一行都構建一顆線段樹。由於空間限制只能考慮動態開點。

同時對每次回到隊尾的點再開一顆線段樹(n+1)

查詢操作:

1、y!=m

若當前查詢的點還沒有在最後一列,就直接輸出(x-1)*m+pos

若在最後一列,則輸出第x個線段樹的pos-m

最後將這個

2、y==m 基本同上

刪除操作:

則此時的區間個數為區間大小-sum

這樣的話若要查的數<=區間大小-sum 的話就去左兒子

否則先將其減去(區間大小-sum)再在右兒子去查詢

**

#include#include#include#include#include#includeusing namespace std;

const int maxn=300100;

struct nodes[maxn*20];

int q,maxx,root[maxn],tot=0,n,m;

vectortree[maxn];

void update(int &x,int l,int r,int size)

s[x].sum++;

if (l>=r) return;

int mid=(l+r)>>1;

if (size<=mid) update(s[x].ls,l,mid,size);

else update(s[x].rs,mid+1,r,size);

}int query(int k,int l,int r,int size)

long long work1(int x,long long y)

long long work2(int x,int y)

int main()

return 0;

}

NOIP2017d2t3 列隊 動態開點線段樹

有乙個n m的矩陣,一開始位置 x,y 上的元素為 x 1 m y。接下來有q個操作 每次操作為 x,y 表示先輸出位置 x,y 上的值,設t為 x,y 上的值,然後把第x行 y 1 m 上的每個數往前移一位,把最後一列 x 1 n 上的每個數往前移一位,最後把t放到位置 n,m n,m,q 300...

NOIP2017提高組正式賽 D2T3列隊

sylvia 是乙個熱愛學習的女孩子。前段時間,sylvia 參加了學校的軍訓。眾所周知,軍訓的時候需要站方陣。sylvia所在的方陣中有n m名學生,方陣的行數為 n,列數為 m。為了便於管理,教官在訓練開始時,按照從前到後,從左到右的順序給方陣中從 1 到 n m 編上了號碼 參見後面的樣例 即...

NOIP2017 列隊(樹狀陣列)

定義第i行為所有的點 i,j 0 可以發現,每一行是相對獨立的,每一次操作只會影響到當前行和最後一列 考慮每一行和最後一列各開乙個樹狀陣列,但這樣顯然會爆空間 實際上,對於沒有離隊過的點是沒必要儲存的,可以直接算出編號,因此只要用vector儲存每一行和最後一列後加入的點即可 還需要預處理乙個陣列d...