【問題背景】
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的最長上公升子串行:
1program
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...