답안 #386717

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
386717 2021-04-07T08:37:25 Z ogibogi2004 Road Construction (JOI21_road_construction) C++14
38 / 100
10000 ms 57556 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<int,int>compressed_y;
map<int,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/2-1);
	xs.insert(INF/2+1);
	ys.insert(-INF/2-1);
	ys.insert(INF/2+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: 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 71 ms 6236 KB Output is correct
2 Correct 79 ms 6236 KB Output is correct
3 Correct 68 ms 6252 KB Output is correct
4 Correct 65 ms 6252 KB Output is correct
5 Correct 60 ms 5084 KB Output is correct
6 Correct 12 ms 1388 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3050 ms 57508 KB Output is correct
2 Correct 3116 ms 57476 KB Output is correct
3 Correct 57 ms 6124 KB Output is correct
4 Correct 2976 ms 57300 KB Output is correct
5 Correct 2801 ms 57516 KB Output is correct
6 Correct 2591 ms 57556 KB Output is correct
7 Correct 2345 ms 56840 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 8474 ms 52308 KB Output is correct
2 Execution timed out 10019 ms 52180 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 8474 ms 52308 KB Output is correct
2 Execution timed out 10019 ms 52180 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 71 ms 6236 KB Output is correct
2 Correct 79 ms 6236 KB Output is correct
3 Correct 68 ms 6252 KB Output is correct
4 Correct 65 ms 6252 KB Output is correct
5 Correct 60 ms 5084 KB Output is correct
6 Correct 12 ms 1388 KB Output is correct
7 Correct 7797 ms 25860 KB Output is correct
8 Correct 7934 ms 25860 KB Output is correct
9 Correct 64 ms 6252 KB Output is correct
10 Correct 5557 ms 22652 KB Output is correct
11 Correct 3392 ms 21348 KB Output is correct
12 Correct 744 ms 5104 KB Output is correct
13 Correct 692 ms 6212 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 71 ms 6236 KB Output is correct
2 Correct 79 ms 6236 KB Output is correct
3 Correct 68 ms 6252 KB Output is correct
4 Correct 65 ms 6252 KB Output is correct
5 Correct 60 ms 5084 KB Output is correct
6 Correct 12 ms 1388 KB Output is correct
7 Correct 3050 ms 57508 KB Output is correct
8 Correct 3116 ms 57476 KB Output is correct
9 Correct 57 ms 6124 KB Output is correct
10 Correct 2976 ms 57300 KB Output is correct
11 Correct 2801 ms 57516 KB Output is correct
12 Correct 2591 ms 57556 KB Output is correct
13 Correct 2345 ms 56840 KB Output is correct
14 Correct 8474 ms 52308 KB Output is correct
15 Execution timed out 10019 ms 52180 KB Time limit exceeded
16 Halted 0 ms 0 KB -