大概題意:
就是求 1
'>1
到n'>
n 的排列中字典序最小的乙個滿足逆序對個數為m
'>
m的排列。
1'>n
'>m
'>分析:
首先我們要知道乙個排列能有的最多逆序對 n*(n-1)*/2 即當他為嚴格遞增序列時;而我們又知道逆序對越多該數列的字典序越大;因此可對題意這樣分析,很明顯從最小的數 ( i )開始考慮 如果除去該數 剩餘的數 ( n - i ) 依然能構成大於等於m的逆序對 (n-i)*(n-i-1)/2>=m;可將該數放在最前面,否則 將它放在末端,此時的數既可以做出最大的貢獻(構成了 n-i 個逆序對),更新m;
還有一點要注意啦!!!!!
因為資料是5e4,做乘法是會爆int 切記要 long long
詳細見**:
1 #include2using
namespace
std;
3#define ll long long
4const
int maxn=5e4+5;5
ll ma[maxn];
6int
main()717
else21}
22for(ll i=1;i<=n;i++)
2327
else30}
31 printf("\n"
);32
return0;
33 }
洛谷P1338(末日的傳說)
只要是參加jsoi活動的同學一定都聽說過hanoi塔的傳說 三根柱子上的金片每天被移動一次,當所有的金片都被移完之後,世界末日也就隨之降臨了。在古老東方的幻想鄉,人們都採用一種奇特的方式記錄日期 他們用一些特殊的符號來表示從1開始的連續整數,1表示最小而n表示最大。創世紀的第一天,日曆就被賦予了生命...
洛谷P1338 末日的傳說
qaq本來不是多難的題,然鵝我折騰了半天。看到乙個挺不錯的想法 我們知道,對於乙個長度為n的序列而言,其最大的逆序對的個數為n n 1 2,題目是要求乙個逆序數為m的字典序最小的序列。那我們不妨從1開始考慮每乙個數的排列,這樣每次考慮的都是當前最小的數 如果把這個數放在最前面,而剩下的數的排列的逆序...
洛谷P1338 末日的傳說
只要是參加jsoi活動的同學一定都聽說過hanoi塔的傳說 三根柱子上的金片每天被移動一次,當所有的金片都被移完之後,世界末日也就隨之降臨了。在古老東方的幻想鄉,人們都採用一種奇特的方式記錄日期 他們用一些特殊的符號來表示從1開始的連續整數,1表示最小而n表示最大。創世紀的第一天,日曆就被賦予了生命...