版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37868325/article/details/82123143
我大概是真的傻了,,,一个小时那么简单的C愣是没想对做法。。。比赛结束五分钟后立马有思路,,我真的要呵呵哒了。。。
就是n个正方形,输出一个点,被至少n-1个正方形覆盖。。。这么简单,,,以前也做过类似的题,,就不知道为什么就傻成这样,,,愣是没有想法,,一直在试暴力!!!!wa!!!!!
就是从前往后遍历一遍,记录前i个正方行的交集,然后从后往前遍历,记录后面的所有正方形的交际
在对于每个位置考虑,若去掉当前位置,前后两块的交际是否空,不空就随意输出一个点,,然后跳出即可,,,,
这个代码,就比赛后突然想到,敲完了却没法交,一开始数组开小了,,RE了一发,,数组改大就A了。。。,,我真的是,,大概是个智障吧,,还有挂了个终测,,少考虑了n<4的情况。。。心疼分数,,掉了一百多分。。。而且这么个破题竟然拖了那么久都没做出来,,还在托,,连D的题意都没有读,,,今晚真的好迷哇!!!!
#include<bits/stdc++.h>
using namespace std;
const int N = 15;
const int inf = 1000000000;
int n,x1,x2,y11,y2,num,s;
struct AA
{
int l,a,b,c,d,ok,id;
bool operator<(const AA&aa) const
{
if(l==aa.l)
{
if(ok==aa.ok)
return a<aa.a;
return ok>aa.ok;
}
return l<aa.l;
}
}pos[200005],dp[200005],dpp[200005],ss;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d%d%d",&x1,&y11,&x2,&y2);
pos[++num].a=x1;
pos[num].b=y11;
pos[num].c=x2;
pos[num].d=y2;
}
dp[0].a=-1000000009;
dp[0].b=-1000000009;
dp[0].c=1000000009;
dp[0].d=1000000009;
dpp[0]=dp[0];
dp[n+1].a=-1000000009;
dp[n+1].b=-1000000009;
dp[n+1].c=1000000009;
dp[n+1].d=1000000009;
dpp[n+1]=dp[n+1];
for(int i=1;i<=n;i++)
{
dp[i].a=max(dp[i-1].a,pos[i].a);
dp[i].b=max(dp[i-1].b,pos[i].b);
dp[i].c=min(dp[i-1].c,pos[i].c);
dp[i].d=min(dp[i-1].d,pos[i].d);
}
for(int i=n;i>=1;i--)
{
dpp[i].a=max(dpp[i+1].a,pos[i].a);
dpp[i].b=max(dpp[i+1].b,pos[i].b);
dpp[i].c=min(dpp[i+1].c,pos[i].c);
dpp[i].d=min(dpp[i+1].d,pos[i].d);
}
for(int i=1;i<=n;i++)
{
ss.a=max(dp[i-1].a,dpp[i+1].a);
ss.b=max(dp[i-1].b,dpp[i+1].b);
ss.c=min(dp[i-1].c,dpp[i+1].c);
ss.d=min(dp[i-1].d,dpp[i+1].d);
//cout<<i<<" "<<ss.a<<" "<<ss.b<<" "<<ss.c<<" "<<ss.d<<endl;
if(ss.a<=ss.c&&ss.b<=ss.d)
{
cout<<ss.a<<" "<<ss.b<<endl;
break;
}
}
}