description
休息的時候,可以放鬆放鬆渾身的肌肉,打掃打掃衛生,感覺很舒服。在某一天,某lmz 開始整理他那書架。已知他的書有n 本,從左到右按順序排列。他想把書從矮到高排好序,而每一本書都有乙個獨一無二的高度hi。他排序的方法是:每一次將所有的書劃分為盡量少的連續部分,使得每一部分的書的高度都是單調下降,然後將其中所有不少於2 本書的區間全部翻轉。重複執行以上操作,最後使得書的高度全部單調上公升。可是畢竟是休息時間,lmz 不想花太多時間在給書排序這種事上面。因此他劃分並翻轉完第一次書之後,他想計算,他一共執行了多少次翻轉操作才能把所有的書排好序。lmz 驚奇地發現,第一次排序之前,他第一次劃分出來的所有區間的長度都是偶數。
input
第一行乙個正整數n, 為書的總數。
接下來一行n個數,第i個正整數hi,為第i 本書的高度。
output
僅乙個整數,為lmz 需要做的翻轉操作的次數。
sample input
65 3 2 1 6 4
sample output
3【樣例解釋】
第一次劃分之後,翻轉(5,3,2,1),(6,4)。之後,書的高度為1 2 3 5 4 6,然後便是翻轉(5,4)即可。
data constraint
對於10%的資料:n<=50
對於40%的資料:n<=3000
對於100%的資料:1<=n<=100000, 1<=hi<=n
. .
. . .分析
找出所有連續的單調下降序列,把它們全部翻轉過來,每翻轉乙個序列,ans++,做完後,此為第一次交換。
第一次交換後,剩下的就只能兩兩交換,所以只要求逆序對就好了。
. .
. .
.程式:
#include
#include
using
namespace
std;
long
long a[100001],b[100001],n,w,t[100001],ans=0;
void merge(long
long a,int l,int r)
else
t[p++]=a[i++];
}while(i<=mid) t[p++]=a[i++];
while(j<=r) t[p++]=a[j++];
for(i=l;i<=r;i++)
a[i]=t[i];
}void kp(int l,int r)
}while (i<=j);
}int check()
return0;}
int main()
}tot++;
b[tot]=n;
for (int i=2;i<=tot;i++)
merge(a,1,n);
cout
<}
NOIP2013模擬聯考5 軍訓
hysbz 開學了!今年hysbz 有n 個男生來上學,學號為1 n,每個學生都必須參加軍訓。在這種比較墮落的學校裡,每個男生都會有gi 個女朋友,而且每個人都會有乙個欠扁值hi。學校為了保證軍訓時教官不會因為學生們都是人生贏家或者是太欠扁而發生打架事故,所以要把學生們分班,並做出了如下要求 1.分...
NOIP2013模擬聯考6 選課 select
description 你真的認為選課是那麼容易的事嗎?hysbz的zy同志告訴你,原來選課也會讓人產生一種想要回到火星的感覺。假設你的一周有n天,那麼zy編寫的選課系統就會給你n堂課。但是該系統不允許在星期i和星期i 1的時候選第i堂課,也不允許你在星期n和星期一的時候選第n堂課。然後連你自己也搞...
NOIP2013模擬聯考14 隱藏指令
要想回到原點,走乙個方向後必定會再走乙個相反的方向。先算算 d 1 的情況,有 2 n 個位置,選 n 個放正方向,其餘為負方向,方案數為 tbinom 同理可得 d 2 時,方案數為 tbinom tbinom tbinom d 3 時,方案數為 tbinom tbinom tbinom tbin...