Advertisement
FHVirus

Untitled

May 12th, 2021
297
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.69 KB | None | 0 0
  1. // Knapsack DP is harder than FFT.
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4. typedef long long ll; typedef pair<int,int> pii; typedef pair<ll,ll> pll;
  5. #define ff first
  6. #define ss second
  7. #define pb emplace_back
  8. #define AI(x) begin(x),end(x)
  9. template<class I>bool chmax(I&a,I b){return a<b?(a=b,true):false;}
  10. template<class I>bool chmin(I&a,I b){return b<a?(a=b,true):false;}
  11.  
  12. // 建議把 N 最大值這種常數設成一個 const
  13. const int N = 1e5 + 225;
  14.  
  15. ll num[N];
  16.  
  17. ll bit[N];
  18. ll suffix(ll x){
  19.     ll sum = 0;
  20.     for(ll i = x; i > 0; i -= i & -i)
  21.         sum += bit[i];
  22.     return sum;
  23. }
  24. // update() 沒有要回傳,
  25. // 記得用 void !
  26. void update(ll y){
  27.     // 反正都開滿了就跑滿也沒有差
  28.     // 不用特別維護 maxx
  29.     for(ll i = y; i < N; i += i & -i)
  30.         ++bit[i];
  31. }
  32.  
  33. signed main(){
  34.     ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
  35.     ll n, numOfTest = 1;
  36.     // 這裡用 && 比較保險
  37.     // 因為逗號只會回傳後面那一個
  38.     // 有時候沒有輸入成功還是會繼續執行喔
  39.     while(cin >> n && n){
  40.         fill(bit, bit + N, 0);
  41.         // num 因為有點大宣告在外面
  42.         for(ll i = 0; i < n; ++i){
  43.             // 盡量不要混用 cin cout 和 scanf printf
  44.             // 哪天出事了會死不瞑目
  45.             cin >> num[i];
  46.         }
  47.         map<ll, ll> mp;
  48.         set<ll> st;
  49.         ll rank = 1;
  50.         for(ll i = 0; i < n; ++i) st.insert(num[i]);
  51.         // 下面這行也可以指定型態喔
  52.         // 不一定要用 auto
  53.         for(ll x: st) mp[x] = rank++;
  54.         for(ll i = 0; i < n; ++i) num[i] = mp[num[i]];
  55.  
  56.         ll ans = 0;
  57.         for(ll i = 0; i < n; ++i){
  58.             ans += i - suffix(num[i]);
  59.             update(num[i]);
  60.         }
  61.  
  62.         // 注意輸出格式!
  63.         cout << "Case #" << numOfTest++ << ": " << ans << '\n';
  64.     }
  65.     return 0;
  66. }
  67.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement