제출 #1047427

#제출 시각아이디문제언어결과실행 시간메모리
1047427NotLinuxArranging Shoes (IOI19_shoes)C++17
65 / 100
42 ms6644 KiB
#include <bits/stdc++.h> #include "shoes.h" using namespace std; #define sz(x) (int)x.size() #define all(x) x.begin(),x.end() const long long inf = 1e18 + 7; struct SEGT{ vector < int > t; int tree_size; const int identity_element = 0; int merge(int x , int y){ return x + y; } void init(int x){ tree_size = x+3; t.assign(2*tree_size , identity_element); } void modify(int p, int value) { // set value at position p for (t[p += tree_size] = value; p > 1; p >>= 1){ t[p>>1] = merge(t[p] , t[p^1]); } } int query(int l, int r) { // sum on interval [l, r] int res = identity_element; for (r+=1 , l += tree_size, r += tree_size; l < r; l >>= 1, r >>= 1) { if (l&1) res = merge(res , t[l++]); if (r&1) res = merge(res , t[--r]); } return res; } }; long long count_swaps(vector<int> s) { int n = sz(s) / 2; long long ans; // cout << "n : " << n << endl; // for(auto itr : s)cout << itr << " ";cout << endl; if(n == 1){// 10 pts - n = 1 ans = 0; if(s[0] > 0)ans++; return ans; } if(n <= 8){// 20 pts - n <= 8 ans = inf; vector < int > shoes; for(auto itr : s)if(itr > 0)shoes.push_back(itr); vector < int > perm(n); iota(all(perm) , 0); do{ vector < int > tmp = s; long long locans = 0; vector < int > news; for(auto itr : perm){ news.push_back(-shoes[itr]); news.push_back(shoes[itr]); } for(int i = 0;i<2*n;i++){ int cur = i; while(tmp[cur] != news[i] and cur < (2 * n))cur++; assert(cur != (2*n)); locans += cur - i; int tmp_val = tmp[cur]; for(int j = cur;j>i;j--){ tmp[j] = tmp[j-1]; } tmp[i] = tmp_val; } ans = min(ans , locans); } while(next_permutation(all(perm))); return ans; } set < int > ste; for(auto itr : s){ ste.insert(abs(itr)); } if(sz(ste) == 1){// 20 pts - all shoe sizes are same ans = 0; SEGT segt; segt.init(2 * n + 5); int sayac0 = 1 , sayac1 = 2; for(int i = 0;i<2*n;i++){ if(s[i] < 0){ ans += segt.query(sayac0 , 2*n); segt.modify(sayac0 , 1); sayac0+=2; } else{ ans += segt.query(sayac1 , 2*n); segt.modify(sayac1 , 1); sayac1+=2; } } return ans; } else{// 15 pts - first n are left , rest are right and i = i+n ans = 0; for(int i = 0;i<n;i++){ ans += i; } return ans; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...