1. 程式人生 > >洛谷p1338末日的傳說(思維好題,數學)

洛谷p1338末日的傳說(思維好題,數學)

題目連結:https://www.luogu.org/problemnew/show/P1338

 

題目暴力全排列是肯定不行的。

比較難想啊,關鍵抓住字典序小也就是小的數儘量往前排,找剩餘的逆序對數!

 

思考逆序對數需要用到數學排列組合的知識,長度為n的序列最多有n(n-1)/2個逆序對,組合數知識一算就知道。

還需要long long才過= =

 1 #include <iostream>
 2 using namespace std;
 3 typedef long long ll;
 4 const int maxn=1e5+5;
 5 ll a[maxn];
6 ll n,m; 7 8 int main() 9 { 10 ios::sync_with_stdio(false); cin.tie(0); 11 12 cin>>n>>m; 13 14 ll last=n,first=1; 15 for(int i=1;i<=n;i++) 16 { 17 int t=(n-i)*(n-i-1)/2;//長度為n的序列最多有這麼多對 18 19 if(t>=m) a[first++]=i;//放開頭 20 else
21 { 22 a[last--]=i; 23 m=m-(last-first+1);//放最後 24 } 25 } 26 27 for(int i=1;i<=n-1;i++) cout<<a[i]<<' '; 28 cout<<a[n]<<endl; 29 30 return 0; 31 }

 

完。