제출 #1293122

#제출 시각아이디문제언어결과실행 시간메모리
1293122trandaihao5555Arranging Shoes (IOI19_shoes)C++20
100 / 100
132 ms66168 KiB
#include <bits/stdc++.h> #include "shoes.h" #define int long long #define debug cout << "ok\n"; #define SQR(x) (1LL * ((x) * (x))) #define MASK(i) (1LL << (i)) #define BIT(x, i) (((x) >> (i)) & 1) #define fi first #define se second #define pb push_back #define mp make_pair #define pii pair<int,int> #define pli pair<ll,int> #define vi vector<int> #define FAST ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); typedef long long ll; typedef unsigned long long ull; typedef long double ld; typedef unsigned int ui; using namespace std; const int M = 1e9 + 7; const int INF = 1e9 + 7; const ll INFLL = (ll)2e18 + 7LL; const ld PI = acos(-1); const int dx[] = {1, -1, 0, 0, -1, 1, 1, -1}; const int dy[] = {0, 0, 1, -1, -1, -1, 1, 1}; template<class _, class __> bool minimize(_ &x, const __ y){ if(x > y){ x = y; return true; } else return false; } template<class _, class __> bool maximize(_ &x, const __ y){ if(x < y){ x = y; return true; } else return false; } template<class _,class __> void Add(_ &x, const __ y) { x += y; if (x >= M) { x -= M; } return; } template<class _,class __> void Diff(_ &x, const __ y) { x -= y; if (x < 0) { x += M; } return; } //-------------------------------------------------------------- const int MaxN = 5e5+7; vi nen; multiset<int> lis[MaxN][2]; bool ch[MaxN]; struct FenwickTree { int Tr[MaxN]; void Upd(int u,int v) { u++; for (; u < MaxN; u += u&-u) { Tr[u]+=v; } return; } int Get(int u) { u++; if (u < 0) return 0; int res = 0; for (; u; u -= u&-u) { res += Tr[u]; } return res; } } Fw; int count_swaps(vector<int32_t> s) { vi S; for (int x : s) S.pb((int)x); for (int x : S) nen.pb(abs(x)); sort(nen.begin(),nen.end()); nen.erase(unique(nen.begin(),nen.end()),nen.end()); for (int i=0;i<S.size();i++) { int & x = S[i]; int tmp = x / abs(x); if (tmp == -1) tmp = 0; x = lower_bound(nen.begin(),nen.end(),abs(x)) - nen.begin() + 1; lis[x][tmp].insert(i); } vi res; for (int i=0;i<S.size();i++) { if (ch[i]) continue; res.pb(*lis[S[i]][0].begin()); res.pb(*lis[S[i]][1].begin()); ch[*lis[S[i]][0].begin()] = true; ch[*lis[S[i]][1].begin()] = true; lis[S[i]][0].erase(lis[S[i]][0].begin()); lis[S[i]][1].erase(lis[S[i]][1].begin()); } reverse(res.begin(),res.end()); ll ans = 0; for (int x : res) { ans += Fw.Get(x); Fw.Upd(x,1); } 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...