題目:
題目鏈結
描述一年一度的廠裡田徑賽又開始了,hdw等nn位田徑高手(不是)踴躍報名參加
各就各位,預備備,pia
隨著號令槍響,hdw一馬當先的衝了出去,在跑步的過程中,hdw突然想到乙個問題
由於每個選手都有乙個編號ii,第i個選手身上有乙個能力值a_iai
,現在每個選手都想知道排在他前面的選手中,有多少個選手的能力值比他小
即對於所有的i\in n求j\in [1,i),a_j輸入
第一行輸入乙個數n(n\in[1,300000])n(n∈[1,300000])
第二行n個數,a_iai
表示第ii個人的能力值 a_i\in[1,300000]ai
∈[1,300000]
輸出輸出n行
第i行表示在第ii個人之前有多少個人能力值比a_iai
題解:原來這個題目就是樹狀陣列逆序對的裸題,但是這個又不是逆序對,可能是正序對吧,maybe,有兩個陣列 t,d,t陣列用來記錄t[x] = (1,x)內有幾個數字,d陣列用來讀資料,每次按序號add,然後sum(d[i] -1)這個就 是在區間(1,d[i]-1)的數字有幾個,即ans;
**如下:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define inf 0x3f3f3f3f
// memset 無窮大時可用;
#define maxn 50000
#define m 300005
intlowbit
(int x)
;void
add(
int x)
;int
sum(
int x)
;using
namespace std;
int d[m]
,t[m]
,n;int
lowbit
(int x)
/* i */
void
add(
int x)
}int
sum(
int x)
return res;
}int
main()
for(
int i =
1; i <= n;
++i)
return0;
}
周賽 廠裡田徑賽 題解(線段樹)
其實就是找前面有多少個比他小的數 顯然要用線段樹,是裸的線段樹,但是不知道為什麼自己卻一點思路都沒有。對於能力值建立一顆線段樹or 樹狀陣列,按編號從小到大列舉每個運動員,每次先查詢當前能力值在 1,a i 1 的人數 及第i個人的結果,然後再將這個人的能力值更新進去 讓能力值為a i 的人數 1 ...
資料結構應用 田徑賽的時間安排
假設某校的田徑選拔賽共設六個專案的比賽,即跳高 跳遠 標槍 鉛球 100公尺和200公尺短跑,規定每個選手至多參加三個專案的比賽。現有五名選手報名比賽,選手所選擇的專案如參賽選手比賽專案表所示。現在要求設計乙個競賽日程安排表,使得在盡可以短的時間內安排完比賽。1 為了能較好地解決這個問題,首先應該選...