noip模擬題《序》sort

2022-05-31 08:42:12 字數 1960 閱讀 4388

【問題背景】

zhx 給他的妹子們排序。

【問題描述】

zhx有n個妹子,他對第i個妹子的好感度為ai, 且所有ai兩兩不相等。現在n個妹子隨意站成一

排,他要將她們根據好感度從小到大排序。 他使用的是氣泡排序演算法。如果排序過程中

好感度為ai的妹子和好感度為aj的妹子發生了交換, 那麼她們之間會發生一場口角。

現在 zhx 想知道, 給定妹子的初始排列, 在排序完成後, 最多存在多少個妹子, 她們任意兩

人之間沒發生過口角。

正式地, 考慮對陣列ai進行氣泡排序, 如果ai和aj在排序過程中發生交換,那麼在兩個元素之

間連一條邊。你需要求出,排序結束後,最多存在多少個元素,其中任意兩個元素之間不存在連邊。

【輸入格式】

第一行兩個整數 n, 表示妹子數量。

接下來一行 n 個整數ai,表示初始第 i 個妹子的好感度。

【輸出格式】

一行乙個整數, 表示最多滿足要求的妹子的個數。

【樣例輸入】

33 1 2

【樣例輸出】

2【樣例解釋】

。【資料規模與約定】

對於30%的資料, 1 ≤n≤ 16。

對於70%的資料, 1 ≤n≤ 5000。

對於100%的資料, 1 ≤n≤ 100000, 0 ≤ai

(當時看到實在不會做啊,還是qty_ytq神說這就是求最長上公升子串行長度,好勁啊)

就是i和j兩個妹子不交換,當且僅當ai

(然而當時我只會n2演算法70分,qty_ytq神寫了個線段樹維護a了,%%%)

正解是nlogn的最長上公升子串行:

1

program

sort(input,output);

2const

3 inf=123456789;4

var5 a,f,c:array[0..100010]of

longint;

6i,k,n:longint;

7function

min(a,b:longint):longint;

8begin

9if athen exit(a) else

exit(b);

10end;11

function

find(x:longint):longint;

12var

13l,r,mid:longint;

14begin

15if x1] then exit(0

);16 l:=1;r:=k;

17while l1

do18

begin

19 mid:=(l+r)>>1;20

if c[mid]>x then r:=mid-1

else l:=mid;

21end;22

if c[r]then exit(r) else

exit(l);

23end;24

begin

25 assign(input,'

sort.in

');assign(output,'

sort.out

');reset(input);rewrite(output);

26readln(n);

27for i:=1

to n do

read(a[i]);

28for i:=1

to n do c[i]:=inf;

29 k:=0;30

for i:=1

to n do

begin f[i]:=find(a[i])+1;if c[f[i]]=inf then inc(k);c[f[i]]:=min(c[f[i]],a[i]); end;31

write(k);

32close(input);close(output);

33end.

noip模擬賽 序

問題背景 zhx 給他的妹子們排序。問題描述 zhx 有 n 個妹子,他對第 i 個妹子的好感度為ai,且所有 ai兩兩不相等。現 在 n 個妹子隨意站成一排,他要將她們根據好感度從小到大排序。他使用的是 氣泡排序演算法 詳見下 如果排序過程中好感度為ai的妹子和aj的妹子發生了交換,那麼她們之間會...

NOIP模擬題 連通

給定乙個無向圖,請編寫乙個程式實現以下兩種操作 1 d x y,從原圖中刪除連線x和y頂點的邊。2 q x y,詢問x和y頂點是否連通。這也是連通問題,考慮用並查集解決。但是這是刪除的問題耶,怎麼辦?考慮將刪除變為連通,能不能將所有操作給反過來,從最後乙個操作開始處理。當然是可以的。include ...

Noip模擬題 山峰

description在n m的棋盤上不重複的填1到n m 如果乙個數字比周圍的八個數字大,那麼他就是乙個山峰。現在告訴你所有山峰的位置,問你填數的方案數mod 12345678 input 輸入第一行兩個數字 n m意義如題目描述。接下來n 行,每行 m個字元,表示非山峰,x 表示山峰。1 n 4...