This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define MAXN 200007
using namespace std;
int n,k;
struct rect{int xl,xh,yl,yh;};
rect intersect(rect a,rect b) {rect r={max(a.xl,b.xl),min(a.xh,b.xh),max(a.yl,b.yl),min(a.yh,b.yh)}; return r;}
bool valid(rect a) {return a.xh>=a.xl && a.yh>=a.yl;}
rect p[MAXN],res;
pair<int,int> px[MAXN],py[MAXN];
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
inline vector<rect> check(vector<rect> pot)
{
vector<rect> t;
for(int i=0;i<n;i++)
{
bool ziv=false;
for(int j=0;j<pot.size();j++) if(valid(intersect(p[i],pot[j])))
{
pot[j]=intersect(pot[j],p[i]);
ziv=true;
break;
}
if(!ziv) return t;
}
return pot;
}
int main()
{
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++)
{
scanf("%d%d%d%d",&p[i].xl,&p[i].yl,&p[i].xh,&p[i].yh);
if(!i) res=intersect(p[0],p[0]);
else res=intersect(res,p[i]);
}
if(k==1) {printf("%d %d",res.xl,res.yl); return 0;}
if(k>1 && valid(res))
{
printf("%d %d\n",res.xl,res.yl);
for(int i=1;i<k;i++) printf("1 1\n");
return 0;
}
for(int i=0;i<n;i++) px[i]={p[i].xl,p[i].xh};
for(int i=0;i<n;i++) py[i]={p[i].yl,p[i].yh};
sort(px,px+n);
sort(py,py+n);
vector<int> xn,yn;
int mnx=1000000007,mndx,mny=1000000007,mndy;
for(int i=0;i<n;i++)
{
if(mnx>=px[i].second)
{
mnx=px[i].second;
mndx=i;
}
if(px[i].first>mnx)
{
xn.push_back(mndx);
mnx=px[i].second;
mndx=i;
}
}
xn.push_back(mndx);
for(int i=0;i<n;i++)
{
if(mny>=py[i].second)
{
mny=py[i].second;
mndy=i;
}
if(py[i].first>mny)
{
yn.push_back(mndy);
mny=py[i].second;
mndy=i;
}
}
yn.push_back(mndy);
while(xn.size()>yn.size()) yn.push_back(yn[0]);
while(yn.size()>xn.size()) xn.push_back(xn[0]);
int t=xn.size();
sort(xn.begin(),xn.end());
sort(yn.begin(),yn.end());
while(true)
{
do
{
vector<rect> prv;
for(int i=0;i<t;i++) prv.push_back({px[xn[i]].first,px[xn[i]].second,py[yn[i]].first,py[yn[i]].second});
vector<rect> sol=check(prv);
if(sol.size()!=0)
{
for(int i=0;i<t;i++) printf("%d %d\n",sol[i].xl,sol[i].yl);
for(int i=t;i<k;i++) printf("1 1\n");
return 0;
}
} while(next_permutation(yn.begin(),yn.end()));
shuffle(p,p+n,rng);
}
}
Compilation message (stderr)
hamburg.cpp: In function 'std::vector<rect> check(std::vector<rect>)':
hamburg.cpp:17:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<rect>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
17 | for(int j=0;j<pot.size();j++) if(valid(intersect(p[i],pot[j])))
| ~^~~~~~~~~~~
hamburg.cpp: In function 'int main()':
hamburg.cpp:29:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
29 | scanf("%d%d",&n,&k);
| ~~~~~^~~~~~~~~~~~~~
hamburg.cpp:32:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
32 | scanf("%d%d%d%d",&p[i].xl,&p[i].yl,&p[i].xh,&p[i].yh);
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |