Submission #1346929

#TimeUsernameProblemLanguageResultExecution timeMemory
1346929alexddCard Collection (JOI24_collection)C++20
0 / 100
0 ms344 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long

const int MAXN = 200005;
const int MAXQ = 200005;

const int INF = 2e9;


namespace FAST
{
    int n,q;
    vector<int> a,b,setx,sety;
    bool rez[MAXQ];

    void solve_separate()//we will get (setx, sety) from 2 separate elements
    {
        for(int i=1;i<=q;i++)
        {
            int maxri = -INF, maxle = -INF;
            for(int j=1;j<=n;j++)
            {
                if(a[j] <= setx[i] && b[j] != sety[i])
                {
                    maxri = max(maxri, b[j]);
                }
                if(b[j] <= sety[i] && a[j] != setx[i])
                {
                    maxle = max(maxle, a[j]);
                }
            }

            int cnt_both = 0, cnt_x = 0, cnt_y = 0;
            for(int j=1;j<=n;j++)
            {
                if(a[j] == setx[i] && b[j] == sety[i])
                    cnt_both++;
                else if(a[j] == setx[i])
                    cnt_x++;
                else if(b[j] == sety[i])
                    cnt_y++;
            }

            if(cnt_both == 0)
            {
                if(cnt_x > 0 && cnt_y > 0)
                {
                    if(maxle >= setx[i] && maxri >= sety[i])
                    {
                        rez[i] = 1;
                    }
                }
            }
            else if(cnt_both == 1)
            {
                if(cnt_x + 1 > 0 && cnt_y > 0)
                {
                    if(maxle >= setx[i])
                    {
                        rez[i] = 1;
                    }
                }

                if(cnt_x > 0 && cnt_y + 1 > 0)
                {
                    if(maxri >= sety[i])
                    {
                        rez[i] = 1;
                    }
                }
            }
            else
            {
                rez[i] = 1;
            }
        }
    }

    void solve_one()//we will get (setx, sety) from the same element
    {
        for(int i=1;i<=q;i++)
        {
            int cnt_both = 0;
            for(int j=1;j<=n;j++)
            {
                if(a[j] == setx[i] && b[j] == sety[i])
                    cnt_both++;
            }

            if(cnt_both == 0)
                continue;

            bool found = 0;
            if(cnt_both > 1)
                found = 1;
            for(int j=1;j<=n;j++)
            {
                if(a[j] >= setx[i] && b[j] >= sety[i] && !(a[j] == setx[i] && b[j] == sety[i]))
                {
                    found = 1;
                }
            }

            if(found)
            {
                rez[i] = 1;
                continue;
            }

            bool ex1 = 0, ex2 = 0;
            for(int j=1;j<=n;j++)
            {
                if(a[j] <= setx[i] && b[j] >= sety[i] && !(a[j] == setx[i] && b[j] == sety[i]))
                    ex1 = 1;
                if(a[j] >= setx[i] && b[j] <= sety[i] && !(a[j] == setx[i] && b[j] == sety[i]))
                    ex2 = 1;
            }
            if(ex1 && ex2)
            {
                rez[i] = 1;
                continue;
            }
        }
    }

    void flip()
    {
        for(int i=1;i<=n;i++)
        {
            a[i] = -a[i];
            b[i] = -b[i];
        }
        for(int i=1;i<=q;i++)
        {
            setx[i] = -setx[i];
            sety[i] = -sety[i];
        }
    }

    vector<int> solve(int copn, int copq, vector<int> copa, vector<int> copb, vector<int> copsetx, vector<int> copsety)
    {

        n = copn;
        q = copq;
        a = copa;
        b = copb;
        setx = copsetx;
        sety = copsety;

        for(int i=1;i<=q;i++)
            rez[i] = 0;

        solve_separate();
        solve_one();

        flip();
        solve_separate();
        solve_one();
        flip();

        vector<int> sol;
        for(int i=1;i<=q;i++)
            if(rez[i])
                sol.push_back(i);
        return sol;
    }
}

namespace BRUT
{
    int n,q;
    vector<int> a,b,setx,sety;
    bool rez[MAXQ];

    vector<int> solve(int copn, int copq, vector<int> copa, vector<int> copb, vector<int> copsetx, vector<int> copsety)
    {
        n = copn;
        q = copq;
        a = copa;
        b = copb;
        setx = copsetx;
        sety = copsety;

        for(int i=1;i<=q;i++)
            rez[i] = 0;

        for(int i=1;i<=q;i++)
        {

        }

        vector<int> sol;
        for(int i=1;i<=q;i++)
            if(rez[i])
                sol.push_back(i);
        return sol;
    }
}

void stress()
{

    exit(0);
}

signed main()
{

    //stress();


    ios_base::sync_with_stdio(0);cin.tie(0);

    int n,q;
    cin>>n>>q;
    vector<int> a(n+2),b(n+2),setx(q+2),sety(q+2);
    for(int i=1;i<=n;i++)
    {
        cin>>a[i]>>b[i];
    }
    for(int i=1;i<=q;i++)
    {
        cin>>setx[i]>>sety[i];
    }

    vector<int> sol = FAST::solve(n,q,a,b,setx,sety);
    for(int x:sol) cout<<x<<" ";

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...