題目描述
排排坐,吃果果,生果甜嗦嗦,大家笑呵呵。你乙個,我乙個,大的分給你,小的留給我,吃完果果唱支歌,大家樂和和。
紅星幼兒園的小朋友們排起了長長地隊伍,準備吃果果。不過因為小朋友們的身高有所區別,排成的隊伍高低錯亂,極不美觀。設第 ii 個小朋友的身高為 h_ihi
。幼兒園阿姨每次會選出兩個小朋友,交換他們的位置,請你幫忙計算出每次交換後,序列的逆序對數。為方便幼兒園阿姨統計,在未進行任何交換操作時,你也應該輸出該序列的逆序對數。
輸入格式
第一行為乙個正整數 nn,表示小朋友的數量;
第二行包含 nn 個由空格分隔的正整數 h_1,h_2,\dots,h_nh1
,h2 ,…,hn
,依次表示初始佇列中小朋友的身高;
第三行為乙個正整數 mm,表示交換操作的次數;
以下m行每行包含兩個正整數 a_i,b_iai
,bi ,表示交換位置 a_iai
和 b_ibi
的小朋友。
輸出格式
輸出檔案共 m+1m+1 行,第 ii 行乙個正整數表示交換操作 ii 結束後,序列的逆序對數。
輸入輸出樣例
輸入 #1複製
3130 150 140
22 3
1 3輸出 #1複製10
3說明/提示
【樣例說明】
未進行任何操作時,(2,3)(2,3) 為逆序對;
操作一結束後,序列為 130 \ 140 \ 150130 140 150,不存在逆序對;
操作二結束後,序列為 150 \ 140 \ 130150 140 130,(1,2),(1,3),(2,3)(1,2),(1,3),(2,3) 共 33 個逆序對。
【資料範圍】
對於 15%15 的資料,n,m \le 15n,m≤15;
對於 30%30 的資料,n,m \le 200n,m≤200;
另有 15%15% 的資料,h_ihi
各不相同;
另有 15%15% 的資料,110 \le h_i \le 160110≤hi
≤160;
以上兩類資料交集為空。
對於100%的資料,1 \le m \le 2\times 10^31≤m≤2×10
3,1 \le n \le 2 \times 10^41≤n≤2×10
4,1 \le h_i \le 10^91≤hi
≤109
,a_i \ne b_iai
=bi
,1 \le a_i,b_i \le n1≤ai
,bi ≤n。
觀察發現,由於這道題的資料較小,其實可以用歸併排序+暴力找逆序數對就行了,總複雜度為o(nlogn + nm),首先先用歸併排序求出初始狀態的逆序數對,然後在當交換兩個數時暴力查詢兩數之間有多少逆序數對,進行減去或加上,然後直接輸出答案。
#include
using
namespace std;
int i,n,q,h[
100002
],o[
100002
],p[
100002
],ans,a,b;
intsolve
(int x,
int y)
else
}while
(j<=mid)
while
(k<=y)
for(i=x;i<=y;i++
) o[i]
=p[i]
;return0;
}int
main()
if(h[b]
>h[a]
) ans++
;else
if(h[b]
) ans--
;for
(j=a+
1;j<=b-
1;j++
) j=h[a]
; h[a]
=h[b]
; h[b]
=j;printf
("%d\n"
,ans);}
return0;
}
Luogu 1975 國家集訓隊 排隊
luogu 1975 題意 給出乙個長度為n的數列以及m個交換兩個數的操作,問每次操作後逆序對數量 時間,下標和數的大小三維偏序,把交換操作看成是減去兩個數再加上兩個數,套板子就好了 發現這種計數型別的cdq一般有兩種寫法 感覺應該都差不多,但有些題目用兩種方式寫也有一些優劣之分,比如這道題,用第二...
Luogu P1975 國家集訓隊 排隊
luogu 1975 國家集訓隊 排隊 quad 很明顯交換後能增加或減少的逆序對的個數只和這兩個數和這兩個數中間的數有關。quad 於是我們需要乙個資料結構能夠快速求出乙個區間內比乙個特定數值大 小的個數。quad 這個資料結構可以是分塊,這在分塊九講裡面有提到過,這裡就不再闡述具體操作過程了。q...
國家集訓隊 旅遊
題目背景 ray 樂忠於旅遊,這次他來到了 t 城。t 城是乙個水上城市,一共有 nn 個景點,有些景點之間會用一座橋連線。為了方便遊客到達每個景點但又為了節約成本,t 城的任意兩個景點之間有且只有一條路徑。換句話說,t 城中只有 n 1n 1 座橋。ray 發現,有些橋上可以看到美麗的景色,讓人心...