CF AIM Tech Round 5 (rated, Div. 1 + Div. 2)--炸炸炸!我是个傻子系列QAQ

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_37868325/article/details/82123143