답안 #386730

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
386730 2021-04-07T08:48:07 Z ogibogi2004 Road Construction (JOI21_road_construction) C++14
65 / 100
10000 ms 68316 KB
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int MAXN=250009;
const ll INF=4e9;
int n,k;
vector<ll>output;
struct point
{
	ll x,y;
	bool operator<(point const& other)const
	{
		return make_pair(x,y)<make_pair(other.x,other.y);
	}
};
struct BIT
{
	int t[MAXN];
	void init()
	{
		for(int i=0;i<MAXN;++i)t[i]=0;
	}
	void update(int idx,int val)
	{
		++idx;
		for(;idx<MAXN;idx+=idx&(-idx))
		{
			t[idx]+=val;
		}
	}
	int query(int idx)
	{
		++idx;
		int ret=0;
		for(;idx>0;idx-=idx&(-idx))
		{
			ret+=t[idx];
		}
		return ret;
	}
	int query(int l,int r)
	{
		return query(r)-query(l-1);
	}
}fen;
vector<point>v;
map<ll,int>compressed_y;
map<ll,int>compressed_x;
set<ll>xs;
set<ll>ys;
bool ok(ll d)
{
	fen.init();
	int last_deleted=-1;
	int cnt=0;
	for(int i=0;i<v.size();++i)
	{
		while(v[last_deleted+1].x+d<v[i].x)
		{
			++last_deleted;
			fen.update(compressed_y[v[last_deleted].y],-1);
		}
		map<ll,int>::iterator l=compressed_y.lower_bound(v[i].y-d);
		map<ll,int>::iterator r=compressed_y.lower_bound(v[i].y+d+1);
		--r;
		cnt+=fen.query((*l).second,(*r).second);
		if(cnt>=k||i==v.size()-1)break;
		fen.update(compressed_y[v[i].y],1);
	}
	//cout<<d<<" "<<cnt<<endl;
	return cnt>=k;
}
void find(ll d)
{
	fen.init();
	int last_deleted=-1;
	set<pair<ll,ll> >s;
	for(int i=0;i<v.size();++i)
	{
		//cout<<i<<":\n";
		while(v[last_deleted+1].x+d<v[i].x)
		{
			++last_deleted;
			s.erase({v[last_deleted].y,v[last_deleted].x});
		}
		set<pair<ll,ll> >::iterator it=s.lower_bound({v[i].y-d,-INF});
		for(;it!=s.end();++it)
		{
			if((*it).first>v[i].y+d)break;
			//cout<<(*it).first<<" "<<(*it).second<<" "<<v[i].x<<" "<<v[i].y<<endl;
			output.push_back(max(abs((*it).first-v[i].y),abs((*it).second-v[i].x)));
		}
		s.insert({v[i].y,v[i].x});
	}
	sort(output.begin(),output.end());
}
int x,y;
int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);cout.tie(NULL);
	cin>>n>>k;
	for(int i=1;i<=n;++i)
	{
		cin>>x>>y;
		v.push_back({x+y,x-y});
		xs.insert(v.back().x);
		ys.insert(v.back().y);
	}
	xs.insert(-INF-1);
	xs.insert(INF+1);
	ys.insert(-INF-1);
	ys.insert(INF+1);
	int cnt=0;
	for(auto xd:xs)
	{
		++cnt;
		compressed_x[xd]=cnt;
	}
	cnt=0;
	for(auto xd:ys)
	{
		++cnt;
		compressed_y[xd]=cnt;
	}
	sort(v.begin(),v.end());
	/*cout<<"v:\n";
	for(auto xd:v)
	{
		cout<<xd.x<<" "<<xd.y<<endl;
	}
	cout<<endl<<endl;*/
	ll low=1,high=INF-1,mid,ans=INF;
	while(low<=high)
	{
		mid=(low+high)/2;
		if(ok(mid))
		{
			ans=mid;
			high=mid-1;
		}
		else low=mid+1;
	}
	//cout<<ans<<endl;
	find(ans-1);
	//cout<<output.size()<<endl;
	for(int i=0;i<output.size()&&i<k;++i)cout<<output[i]<<'\n';
	//cout<<(ll)k-(ll)output.size()<<endl;
	for(int i=0;i<(ll)k-(ll)output.size();++i)cout<<ans<<'\n';
return 0;
}

Compilation message

road_construction.cpp: In function 'bool ok(long long int)':
road_construction.cpp:56:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<point>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   56 |  for(int i=0;i<v.size();++i)
      |              ~^~~~~~~~~
road_construction.cpp:67:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<point>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   67 |   if(cnt>=k||i==v.size()-1)break;
      |              ~^~~~~~~~~~~~
road_construction.cpp: In function 'void find(long long int)':
road_construction.cpp:78:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<point>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   78 |  for(int i=0;i<v.size();++i)
      |              ~^~~~~~~~~
road_construction.cpp: In function 'int main()':
road_construction.cpp:147:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  147 |  for(int i=0;i<output.size()&&i<k;++i)cout<<output[i]<<'\n';
      |              ~^~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 84 ms 6384 KB Output is correct
2 Correct 69 ms 6252 KB Output is correct
3 Correct 61 ms 6236 KB Output is correct
4 Correct 59 ms 6236 KB Output is correct
5 Correct 73 ms 5100 KB Output is correct
6 Correct 8 ms 1388 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2431 ms 68180 KB Output is correct
2 Correct 2416 ms 67984 KB Output is correct
3 Correct 56 ms 6108 KB Output is correct
4 Correct 2333 ms 67924 KB Output is correct
5 Correct 2171 ms 68024 KB Output is correct
6 Correct 2104 ms 68316 KB Output is correct
7 Correct 1986 ms 67540 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5280 ms 60132 KB Output is correct
2 Correct 6403 ms 60164 KB Output is correct
3 Correct 5 ms 1260 KB Output is correct
4 Correct 1824 ms 60116 KB Output is correct
5 Correct 656 ms 5588 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5280 ms 60132 KB Output is correct
2 Correct 6403 ms 60164 KB Output is correct
3 Correct 5 ms 1260 KB Output is correct
4 Correct 1824 ms 60116 KB Output is correct
5 Correct 656 ms 5588 KB Output is correct
6 Correct 6796 ms 60116 KB Output is correct
7 Correct 6892 ms 60088 KB Output is correct
8 Correct 7 ms 1260 KB Output is correct
9 Correct 5 ms 1260 KB Output is correct
10 Correct 6950 ms 55748 KB Output is correct
11 Correct 1483 ms 60120 KB Output is correct
12 Correct 835 ms 5516 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 84 ms 6384 KB Output is correct
2 Correct 69 ms 6252 KB Output is correct
3 Correct 61 ms 6236 KB Output is correct
4 Correct 59 ms 6236 KB Output is correct
5 Correct 73 ms 5100 KB Output is correct
6 Correct 8 ms 1388 KB Output is correct
7 Correct 4484 ms 29120 KB Output is correct
8 Correct 4242 ms 29000 KB Output is correct
9 Correct 60 ms 6236 KB Output is correct
10 Correct 2650 ms 25256 KB Output is correct
11 Correct 1727 ms 23936 KB Output is correct
12 Correct 491 ms 5104 KB Output is correct
13 Correct 511 ms 6364 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 84 ms 6384 KB Output is correct
2 Correct 69 ms 6252 KB Output is correct
3 Correct 61 ms 6236 KB Output is correct
4 Correct 59 ms 6236 KB Output is correct
5 Correct 73 ms 5100 KB Output is correct
6 Correct 8 ms 1388 KB Output is correct
7 Correct 2431 ms 68180 KB Output is correct
8 Correct 2416 ms 67984 KB Output is correct
9 Correct 56 ms 6108 KB Output is correct
10 Correct 2333 ms 67924 KB Output is correct
11 Correct 2171 ms 68024 KB Output is correct
12 Correct 2104 ms 68316 KB Output is correct
13 Correct 1986 ms 67540 KB Output is correct
14 Correct 5280 ms 60132 KB Output is correct
15 Correct 6403 ms 60164 KB Output is correct
16 Correct 5 ms 1260 KB Output is correct
17 Correct 1824 ms 60116 KB Output is correct
18 Correct 656 ms 5588 KB Output is correct
19 Correct 6796 ms 60116 KB Output is correct
20 Correct 6892 ms 60088 KB Output is correct
21 Correct 7 ms 1260 KB Output is correct
22 Correct 5 ms 1260 KB Output is correct
23 Correct 6950 ms 55748 KB Output is correct
24 Correct 1483 ms 60120 KB Output is correct
25 Correct 835 ms 5516 KB Output is correct
26 Correct 4484 ms 29120 KB Output is correct
27 Correct 4242 ms 29000 KB Output is correct
28 Correct 60 ms 6236 KB Output is correct
29 Correct 2650 ms 25256 KB Output is correct
30 Correct 1727 ms 23936 KB Output is correct
31 Correct 491 ms 5104 KB Output is correct
32 Correct 511 ms 6364 KB Output is correct
33 Execution timed out 10075 ms 64672 KB Time limit exceeded
34 Halted 0 ms 0 KB -