답안 #386723

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
386723 2021-04-07T08:43:06 Z ogibogi2004 Road Construction (JOI21_road_construction) C++14
38 / 100
10000 ms 57680 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);
		}
		set<ll>::iterator l=ys.lower_bound(v[i].y-d);
		set<ll>::iterator r=ys.lower_bound(v[i].y+d+1);
		--r;
		cnt+=fen.query(compressed_y[(*l)],compressed_y[(*r)]);
		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/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: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 72 ms 6236 KB Output is correct
2 Correct 71 ms 6236 KB Output is correct
3 Correct 62 ms 6252 KB Output is correct
4 Correct 62 ms 6380 KB Output is correct
5 Correct 61 ms 5084 KB Output is correct
6 Correct 10 ms 1516 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3011 ms 57680 KB Output is correct
2 Correct 3038 ms 57516 KB Output is correct
3 Correct 55 ms 6124 KB Output is correct
4 Correct 2908 ms 57264 KB Output is correct
5 Correct 2816 ms 57508 KB Output is correct
6 Correct 2736 ms 57508 KB Output is correct
7 Correct 2471 ms 56748 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 8909 ms 52260 KB Output is correct
2 Execution timed out 10029 ms 52180 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 8909 ms 52260 KB Output is correct
2 Execution timed out 10029 ms 52180 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 72 ms 6236 KB Output is correct
2 Correct 71 ms 6236 KB Output is correct
3 Correct 62 ms 6252 KB Output is correct
4 Correct 62 ms 6380 KB Output is correct
5 Correct 61 ms 5084 KB Output is correct
6 Correct 10 ms 1516 KB Output is correct
7 Correct 8055 ms 25852 KB Output is correct
8 Correct 7484 ms 25880 KB Output is correct
9 Correct 59 ms 6252 KB Output is correct
10 Correct 4959 ms 22552 KB Output is correct
11 Correct 3085 ms 21364 KB Output is correct
12 Correct 680 ms 5028 KB Output is correct
13 Correct 656 ms 6264 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 72 ms 6236 KB Output is correct
2 Correct 71 ms 6236 KB Output is correct
3 Correct 62 ms 6252 KB Output is correct
4 Correct 62 ms 6380 KB Output is correct
5 Correct 61 ms 5084 KB Output is correct
6 Correct 10 ms 1516 KB Output is correct
7 Correct 3011 ms 57680 KB Output is correct
8 Correct 3038 ms 57516 KB Output is correct
9 Correct 55 ms 6124 KB Output is correct
10 Correct 2908 ms 57264 KB Output is correct
11 Correct 2816 ms 57508 KB Output is correct
12 Correct 2736 ms 57508 KB Output is correct
13 Correct 2471 ms 56748 KB Output is correct
14 Correct 8909 ms 52260 KB Output is correct
15 Execution timed out 10029 ms 52180 KB Time limit exceeded
16 Halted 0 ms 0 KB -