답안 #386706

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
386706 2021-04-07T08:31:13 Z ogibogi2004 Road Construction (JOI21_road_construction) C++14
38 / 100
10000 ms 66392 KB
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int MAXN=250006;
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);
		}
		auto l=ys.lower_bound(v[i].y-d);
		auto r=ys.lower_bound(v[i].y+d+1);
		r--;
		cnt+=fen.query(compressed_y[(*l)],compressed_y[(*r)]);
		if(cnt>=k)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});
		}
		auto 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 main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);cout.tie(NULL);
	cin>>n>>k;
	for(int i=1;i<=n;++i)
	{
		int x,y;
		cin>>x>>y;
		v.push_back({x+y,x-y});
		xs.insert(v.back().x);
		ys.insert(v.back().y);
	}
	xs.insert(-INF);
	xs.insert(INF);
	ys.insert(-INF);
	ys.insert(INF);
	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=0,high=INF,mid,ans=-1;
	while(low<=high)
	{
		mid=(low+high)/2;
		if(ok(mid))
		{
			ans=mid;
			high=mid-1;
		}
		else low=mid+1;
	}
	//cout<<ans<<endl;
	find(ans);
	//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: 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 74 ms 6252 KB Output is correct
2 Correct 76 ms 6252 KB Output is correct
3 Correct 64 ms 6236 KB Output is correct
4 Correct 62 ms 6236 KB Output is correct
5 Correct 64 ms 5100 KB Output is correct
6 Correct 11 ms 1388 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3392 ms 65236 KB Output is correct
2 Correct 3421 ms 65372 KB Output is correct
3 Correct 58 ms 6108 KB Output is correct
4 Correct 3063 ms 66256 KB Output is correct
5 Correct 2890 ms 66212 KB Output is correct
6 Correct 2596 ms 66388 KB Output is correct
7 Correct 2445 ms 66392 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 9755 ms 60164 KB Output is correct
2 Execution timed out 10083 ms 60116 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 9755 ms 60164 KB Output is correct
2 Execution timed out 10083 ms 60116 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 74 ms 6252 KB Output is correct
2 Correct 76 ms 6252 KB Output is correct
3 Correct 64 ms 6236 KB Output is correct
4 Correct 62 ms 6236 KB Output is correct
5 Correct 64 ms 5100 KB Output is correct
6 Correct 11 ms 1388 KB Output is correct
7 Correct 9195 ms 28992 KB Output is correct
8 Correct 8706 ms 29008 KB Output is correct
9 Correct 62 ms 6236 KB Output is correct
10 Correct 5785 ms 25256 KB Output is correct
11 Correct 3593 ms 23928 KB Output is correct
12 Correct 685 ms 8324 KB Output is correct
13 Correct 689 ms 7584 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 74 ms 6252 KB Output is correct
2 Correct 76 ms 6252 KB Output is correct
3 Correct 64 ms 6236 KB Output is correct
4 Correct 62 ms 6236 KB Output is correct
5 Correct 64 ms 5100 KB Output is correct
6 Correct 11 ms 1388 KB Output is correct
7 Correct 3392 ms 65236 KB Output is correct
8 Correct 3421 ms 65372 KB Output is correct
9 Correct 58 ms 6108 KB Output is correct
10 Correct 3063 ms 66256 KB Output is correct
11 Correct 2890 ms 66212 KB Output is correct
12 Correct 2596 ms 66388 KB Output is correct
13 Correct 2445 ms 66392 KB Output is correct
14 Correct 9755 ms 60164 KB Output is correct
15 Execution timed out 10083 ms 60116 KB Time limit exceeded
16 Halted 0 ms 0 KB -