답안 #386705

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
386705 2021-04-07T08:29:33 Z ogibogi2004 Road Construction (JOI21_road_construction) C++14
38 / 100
10000 ms 66336 KB
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int MAXN=250006;
const ll INF=4e9;
ll 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;
		}
	}
	ll query(int idx)
	{
		++idx;
		ll ret=0;
		for(;idx>0;idx-=idx&(-idx))
		{
			ret+=t[idx];
		}
		return ret;
	}
	ll 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;
	ll 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 6380 KB Output is correct
2 Correct 73 ms 6252 KB Output is correct
3 Correct 62 ms 6236 KB Output is correct
4 Correct 60 ms 6236 KB Output is correct
5 Correct 63 ms 5100 KB Output is correct
6 Correct 9 ms 1388 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3407 ms 65464 KB Output is correct
2 Correct 3400 ms 65364 KB Output is correct
3 Correct 58 ms 6108 KB Output is correct
4 Correct 3084 ms 66336 KB Output is correct
5 Correct 2863 ms 66260 KB Output is correct
6 Correct 2569 ms 66132 KB Output is correct
7 Correct 2434 ms 66260 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 9820 ms 60116 KB Output is correct
2 Execution timed out 10050 ms 60500 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 9820 ms 60116 KB Output is correct
2 Execution timed out 10050 ms 60500 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 74 ms 6380 KB Output is correct
2 Correct 73 ms 6252 KB Output is correct
3 Correct 62 ms 6236 KB Output is correct
4 Correct 60 ms 6236 KB Output is correct
5 Correct 63 ms 5100 KB Output is correct
6 Correct 9 ms 1388 KB Output is correct
7 Correct 8728 ms 29000 KB Output is correct
8 Correct 8709 ms 29372 KB Output is correct
9 Correct 63 ms 6236 KB Output is correct
10 Correct 5640 ms 25512 KB Output is correct
11 Correct 3581 ms 24124 KB Output is correct
12 Correct 685 ms 8580 KB Output is correct
13 Correct 702 ms 7840 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 74 ms 6380 KB Output is correct
2 Correct 73 ms 6252 KB Output is correct
3 Correct 62 ms 6236 KB Output is correct
4 Correct 60 ms 6236 KB Output is correct
5 Correct 63 ms 5100 KB Output is correct
6 Correct 9 ms 1388 KB Output is correct
7 Correct 3407 ms 65464 KB Output is correct
8 Correct 3400 ms 65364 KB Output is correct
9 Correct 58 ms 6108 KB Output is correct
10 Correct 3084 ms 66336 KB Output is correct
11 Correct 2863 ms 66260 KB Output is correct
12 Correct 2569 ms 66132 KB Output is correct
13 Correct 2434 ms 66260 KB Output is correct
14 Correct 9820 ms 60116 KB Output is correct
15 Execution timed out 10050 ms 60500 KB Time limit exceeded
16 Halted 0 ms 0 KB -