제출 #709977

#제출 시각아이디문제언어결과실행 시간메모리
709977alvingogoRoad Construction (JOI21_road_construction)C++14
컴파일 에러
0 ms0 KiB
#include <bits/stdc++.h> #pragma GCC optimize("Ofast") #define AquA cin.tie(0);ios_base::sync_with_stdio(0); #define fs first #define sc second #define p_q priority_queue #define int long long using namespace std; /* never did before, write down here we want to find out the minimum k mahhaton dist transform the (x, y) into (x+y, x-y) so that |x-a|+|y-b| = max(|x'-a'|,|y'-b'|) and binary search the k, find how many pair of points dis <= k actually, it's like: maintain a single-point-modify-range-query-sum DS scan one axis, the DS is for another axis, when we want to cal all points whose x' = z just add the Y to the DS, and count the amount of [Y-k, Y+k], wow, not that hard, right? we need to find the 1st to kth smallest distance find the k-th smallest distance, let it be x for all dist<x, the sum is small enough so we can iterate all of it let's go */ struct BIT{ int n; vector<int> bt; void init(int x){ n=x; bt.resize(x+1); } void update(int x,int y){ x++; for(;x<=n;x+=(x&-x)){ bt[x]+=y; } } int query(int x){ int ans=0; x++; for(;x>0;x-=(x&-x)){ ans+=bt[x]; } return ans; } int ask(int l,int r){ return query(r)-query(l-1); } }bt; signed main(){ AquA; int n,m; cin >> n >> m; vector<pair<int,int> > v; vector<int> g; for(int i=0;i<n;i++){ int a,b; cin >> a >> b; v.push_back({a+b,a-b}); g.push_back(a-b); } sort(v.begin(),v.end()); sort(g.begin(),g.end()); g.erase(unique(g.begin(),g.end()),g.end()); auto lis=[&](int x){ return lower_bound(g.begin(),g.end(),x)-g.begin(); }; bt.init(g.size()); for(auto &h:v){ h.sc=lis(h.sc); } auto cal=[&](int k){ int z=0; int ans=0; for(int i=0;i<n;i++){ while(z<i && v[z].fs+k<v[i].fs){ bt.update(v[z].sc,-1); z++; } int l=lis(g[v[i].sc]-k),r=upper_bound(g.begin(),g.end(),g[v[i].sc]+k)-g.begin()-1; ans+=bt.ask(l,r); bt.update(v[i].sc,1); } while(z<n){ bt.update(v[z].sc,-1); z++; } return ans; }; int l=0,r=3e9+7; while(r>l){ int mid=(l+r+1)/2; if(cal(mid)>m){ r=mid-1; } else{ l=mid; } } vector<int> ret; set<pair<int,int> > s; int z=0; for(int i=0;i<n;i++){ while(z<i && v[z].fs+l<v[i].fs){ s.erase({g[v[z].sc],v[z].fs}); z++; } for(auto h=s.lower_bound({g[v[i].sc]-l,-3e10});h!=s.end() && ((*h).fs-l<=g[v[i].sc]);h=next(h)){ assert((abs(g[v[i]].sc-(*h).fs))<=l && v[i].fs-(*h).sc<=l); ret.push_back(max(v[i].fs-(*h).sc,abs(g[v[i].sc]-(*h).fs))); } s.insert({g[v[i].sc],v[i].fs}); } sort(ret.begin(),ret.end()); assert(ret.size()==cal(l)); while(ret.size()<m){ ret.push_back(l+1); } for(auto h:ret){ cout << h << '\n'; } return 0; }

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

In file included from /usr/include/c++/10/cassert:44,
                 from /usr/include/x86_64-linux-gnu/c++/10/bits/stdc++.h:33,
                 from road_construction.cpp:1:
road_construction.cpp: In function 'int main()':
road_construction.cpp:121:26: error: no match for 'operator[]' (operand types are 'std::vector<long long int>' and '__gnu_cxx::__alloc_traits<std::allocator<std::pair<long long int, long long int> >, std::pair<long long int, long long int> >::value_type' {aka 'std::pair<long long int, long long int>'})
  121 |             assert((abs(g[v[i]].sc-(*h).fs))<=l && v[i].fs-(*h).sc<=l);
      |                          ^
In file included from /usr/include/c++/10/vector:67,
                 from /usr/include/c++/10/queue:61,
                 from /usr/include/x86_64-linux-gnu/c++/10/bits/stdc++.h:86,
                 from road_construction.cpp:1:
/usr/include/c++/10/bits/stl_vector.h:1043:7: note: candidate: 'std::vector<_Tp, _Alloc>::reference std::vector<_Tp, _Alloc>::operator[](std::vector<_Tp, _Alloc>::size_type) [with _Tp = long long int; _Alloc = std::allocator<long long int>; std::vector<_Tp, _Alloc>::reference = long long int&; std::vector<_Tp, _Alloc>::size_type = long unsigned int]'
 1043 |       operator[](size_type __n) _GLIBCXX_NOEXCEPT
      |       ^~~~~~~~
/usr/include/c++/10/bits/stl_vector.h:1043:28: note:   no known conversion for argument 1 from '__gnu_cxx::__alloc_traits<std::allocator<std::pair<long long int, long long int> >, std::pair<long long int, long long int> >::value_type' {aka 'std::pair<long long int, long long int>'} to 'std::vector<long long int>::size_type' {aka 'long unsigned int'}
 1043 |       operator[](size_type __n) _GLIBCXX_NOEXCEPT
      |                  ~~~~~~~~~~^~~
/usr/include/c++/10/bits/stl_vector.h:1061:7: note: candidate: 'std::vector<_Tp, _Alloc>::const_reference std::vector<_Tp, _Alloc>::operator[](std::vector<_Tp, _Alloc>::size_type) const [with _Tp = long long int; _Alloc = std::allocator<long long int>; std::vector<_Tp, _Alloc>::const_reference = const long long int&; std::vector<_Tp, _Alloc>::size_type = long unsigned int]'
 1061 |       operator[](size_type __n) const _GLIBCXX_NOEXCEPT
      |       ^~~~~~~~
/usr/include/c++/10/bits/stl_vector.h:1061:28: note:   no known conversion for argument 1 from '__gnu_cxx::__alloc_traits<std::allocator<std::pair<long long int, long long int> >, std::pair<long long int, long long int> >::value_type' {aka 'std::pair<long long int, long long int>'} to 'std::vector<long long int>::size_type' {aka 'long unsigned int'}
 1061 |       operator[](size_type __n) const _GLIBCXX_NOEXCEPT
      |                  ~~~~~~~~~~^~~
In file included from /usr/include/c++/10/cassert:44,
                 from /usr/include/x86_64-linux-gnu/c++/10/bits/stdc++.h:33,
                 from road_construction.cpp:1:
road_construction.cpp:127:22: warning: comparison of integer expressions of different signedness: 'std::vector<long long int>::size_type' {aka 'long unsigned int'} and 'long long int' [-Wsign-compare]
  127 |     assert(ret.size()==cal(l));
      |            ~~~~~~~~~~^~~~~~~~
road_construction.cpp:128:21: warning: comparison of integer expressions of different signedness: 'std::vector<long long int>::size_type' {aka 'long unsigned int'} and 'long long int' [-Wsign-compare]
  128 |     while(ret.size()<m){
      |           ~~~~~~~~~~^~