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 1
2 2
1 2
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...