제출 #465346

#제출 시각아이디문제언어결과실행 시간메모리
465346markoArranging Shoes (IOI19_shoes)C++17
100 / 100
437 ms202068 KiB
#include <bits/stdc++.h> using namespace std; struct Seg { vector<int> arr{}; vector<int> a{}; int m; Seg(vector<int> a) :a{a} { const int n=a.size(); m=1; do { m*=2; } while (m<n); arr.resize(2*m); build(1, 0, m-1); } void build (int index, int l, int r) { if (l==r) { arr[index]=(index-m<a.size())?a[index-m]: 0; return; } const int mid=(l+r)/2; build(2*index, l, mid); build(2*index+1, mid+1, r); arr[index]=arr[2*index]+arr[2*index+1]; } int query_helper(int index, int l, int r, int cover_l, int cover_r) { if (r<cover_l) return 0; if (l>cover_r) return 0; if (l<=cover_l&&r>=cover_r) return arr[index]; const int mid=(cover_l+cover_r)/2; return query_helper(2*index, l,r, cover_l, mid)+ query_helper(2*index+1, l,r,mid+1, cover_r); } int query (int l, int r) { return query_helper(1, l, r, 0, m-1); } void update_helper(int index, int i, int x, int cover_l, int cover_r) { if (cover_l==cover_r) { arr[index]+=x; return; } auto mid=(cover_l+cover_r)/2; if (i<=mid) { update_helper(2*index, i, x, cover_l, mid); } else { update_helper(2*index+1, i, x, mid+1, cover_r); } arr[index]=arr[2*index]+arr[2*index+1]; } void update(int i, int x) { update_helper(1, i, x, 0, m-1); } }; int64_t count_swaps(vector<int> arr) { const int n=arr.size(); vector<int> for_seg(n, 1); Seg seg{for_seg}; unordered_map<int, deque<int>> indices{}; int64_t ans{}; for (auto i=0;i<arr.size();i++) { auto num=arr[i]; auto opp=-num; if (indices[opp].empty()) { indices[num].push_front(i); continue; }; auto j=indices[opp].back(); indices[opp].pop_back(); auto between=(i==j+1)?0:seg.query(j+1,i-1); ans+=between; if (num<0) ans++; seg.update(i, -1); seg.update(j, 1); } return ans; }

컴파일 시 표준 에러 (stderr) 메시지

shoes.cpp: In member function 'void Seg::build(int, int, int)':
shoes.cpp:23:32: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   23 |             arr[index]=(index-m<a.size())?a[index-m]: 0;
      |                         ~~~~~~~^~~~~~~~~
shoes.cpp: In function 'int64_t count_swaps(std::vector<int>)':
shoes.cpp:76:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   76 |     for (auto i=0;i<arr.size();i++) {
      |                   ~^~~~~~~~~~~
#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...