답안 #386742

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
386742 2021-04-07T09:01:26 Z ogibogi2004 Road Construction (JOI21_road_construction) C++14
65 / 100
10000 ms 57704 KB
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int MAXN=250009;
const ll INF=4e9;
const int INF1=2e9+2000;
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<int>xs;
set<int>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<int,int>::iterator l=compressed_y.lower_bound(max((ll)-INF1,v[i].y-d));
		map<int,int>::iterator r=compressed_y.lower_bound(min((ll)INF1,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<int,int> >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<int,int> >::iterator it=s.lower_bound({max((ll)-INF1,v[i].y-d),-INF1});
		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((ll)(*it).first-v[i].y),abs((ll)(*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(-INF1);
	xs.insert(INF1);
	ys.insert(-INF1);
	ys.insert(INF1);
	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:57:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<point>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   57 |  for(int i=0;i<v.size();++i)
      |              ~^~~~~~~~~
road_construction.cpp:68:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<point>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   68 |   if(cnt>=k||i==v.size()-1)break;
      |              ~^~~~~~~~~~~~
road_construction.cpp: In function 'void find(long long int)':
road_construction.cpp:79:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<point>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   79 |  for(int i=0;i<v.size();++i)
      |              ~^~~~~~~~~
road_construction.cpp: In function 'int main()':
road_construction.cpp:148:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  148 |  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 72 ms 6236 KB Output is correct
3 Correct 77 ms 6248 KB Output is correct
4 Correct 65 ms 6252 KB Output is correct
5 Correct 65 ms 5084 KB Output is correct
6 Correct 13 ms 1388 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2299 ms 57704 KB Output is correct
2 Correct 2321 ms 57556 KB Output is correct
3 Correct 60 ms 6120 KB Output is correct
4 Correct 2185 ms 57252 KB Output is correct
5 Correct 2041 ms 57468 KB Output is correct
6 Correct 1933 ms 57628 KB Output is correct
7 Correct 1897 ms 56740 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4345 ms 52308 KB Output is correct
2 Correct 5119 ms 52212 KB Output is correct
3 Correct 10 ms 1260 KB Output is correct
4 Correct 1728 ms 52252 KB Output is correct
5 Correct 645 ms 5588 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4345 ms 52308 KB Output is correct
2 Correct 5119 ms 52212 KB Output is correct
3 Correct 10 ms 1260 KB Output is correct
4 Correct 1728 ms 52252 KB Output is correct
5 Correct 645 ms 5588 KB Output is correct
6 Correct 5903 ms 52180 KB Output is correct
7 Correct 5681 ms 52436 KB Output is correct
8 Correct 10 ms 1260 KB Output is correct
9 Correct 10 ms 1260 KB Output is correct
10 Correct 5640 ms 48728 KB Output is correct
11 Correct 1364 ms 52436 KB Output is correct
12 Correct 816 ms 5588 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 72 ms 6236 KB Output is correct
2 Correct 72 ms 6236 KB Output is correct
3 Correct 77 ms 6248 KB Output is correct
4 Correct 65 ms 6252 KB Output is correct
5 Correct 65 ms 5084 KB Output is correct
6 Correct 13 ms 1388 KB Output is correct
7 Correct 3399 ms 25936 KB Output is correct
8 Correct 3309 ms 25976 KB Output is correct
9 Correct 65 ms 6252 KB Output is correct
10 Correct 2427 ms 22556 KB Output is correct
11 Correct 1636 ms 21332 KB Output is correct
12 Correct 480 ms 5104 KB Output is correct
13 Correct 496 ms 6108 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 72 ms 6236 KB Output is correct
2 Correct 72 ms 6236 KB Output is correct
3 Correct 77 ms 6248 KB Output is correct
4 Correct 65 ms 6252 KB Output is correct
5 Correct 65 ms 5084 KB Output is correct
6 Correct 13 ms 1388 KB Output is correct
7 Correct 2299 ms 57704 KB Output is correct
8 Correct 2321 ms 57556 KB Output is correct
9 Correct 60 ms 6120 KB Output is correct
10 Correct 2185 ms 57252 KB Output is correct
11 Correct 2041 ms 57468 KB Output is correct
12 Correct 1933 ms 57628 KB Output is correct
13 Correct 1897 ms 56740 KB Output is correct
14 Correct 4345 ms 52308 KB Output is correct
15 Correct 5119 ms 52212 KB Output is correct
16 Correct 10 ms 1260 KB Output is correct
17 Correct 1728 ms 52252 KB Output is correct
18 Correct 645 ms 5588 KB Output is correct
19 Correct 5903 ms 52180 KB Output is correct
20 Correct 5681 ms 52436 KB Output is correct
21 Correct 10 ms 1260 KB Output is correct
22 Correct 10 ms 1260 KB Output is correct
23 Correct 5640 ms 48728 KB Output is correct
24 Correct 1364 ms 52436 KB Output is correct
25 Correct 816 ms 5588 KB Output is correct
26 Correct 3399 ms 25936 KB Output is correct
27 Correct 3309 ms 25976 KB Output is correct
28 Correct 65 ms 6252 KB Output is correct
29 Correct 2427 ms 22556 KB Output is correct
30 Correct 1636 ms 21332 KB Output is correct
31 Correct 480 ms 5104 KB Output is correct
32 Correct 496 ms 6108 KB Output is correct
33 Execution timed out 10103 ms 52180 KB Time limit exceeded
34 Halted 0 ms 0 KB -