Submission #1177369

#TimeUsernameProblemLanguageResultExecution timeMemory
1177369alexddNaval battle (CEOI24_battle)C++20
100 / 100
1562 ms144480 KiB
#include<bits/stdc++.h>
using namespace std;
const int INF = 1e9;
int n;
int x[200005],y[200005];
char tip[200005];
int scos[200005];
priority_queue<pair<int,pair<int,int>>> pq;///{timp,{id1,id2}}

map<int,set<pair<int,int>>> dE[3],dW[3],dN[3],dS[3];
void calc_vecini(int i)
{
    if(tip[i]=='E')
    {
        auto it = dW[0][y[i]].lower_bound({x[i],0});
        if(it != dW[0][y[i]].end())
            pq.push({-((*it).first - x[i])/2, {i, (*it).second}});

        it = dS[2][x[i]+y[i]].lower_bound({x[i],0});
        if(it != dS[2][x[i]+y[i]].end())
            pq.push({-((*it).first - x[i]), {i, (*it).second}});

        it = dN[1][x[i]-y[i]].lower_bound({x[i],0});
        if(it != dN[1][x[i]-y[i]].end())
            pq.push({-((*it).first - x[i]), {i, (*it).second}});
    }
    else if(tip[i]=='W')
    {
        auto it = dE[0][y[i]].lower_bound({x[i],INF});
        if(it != dE[0][y[i]].begin())
        {
            it--;
            pq.push({-(x[i] - (*it).first)/2, {i, (*it).second}});
        }

        it = dN[2][x[i]+y[i]].lower_bound({x[i],INF});
        if(it != dN[2][x[i]+y[i]].begin())
        {
            it--;
            pq.push({-(x[i] - (*it).first), {i, (*it).second}});
        }

        it = dS[1][x[i]-y[i]].lower_bound({x[i],INF});
        if(it != dS[1][x[i]-y[i]].begin())
        {
            it--;
            pq.push({-(x[i] - (*it).first), {i, (*it).second}});
        }
    }
    else if(tip[i]=='N')
    {
        auto it = dS[0][x[i]].lower_bound({y[i],INF});
        if(it != dS[0][x[i]].begin())
        {
            it--;
            pq.push({-(y[i] - (*it).first)/2, {i, (*it).second}});
        }

        it = dW[2][x[i]+y[i]].lower_bound({x[i],0});
        if(it != dW[2][x[i]+y[i]].end())
            pq.push({-((*it).first - x[i]), {i, (*it).second}});

        it = dE[1][x[i]-y[i]].lower_bound({x[i],INF});
        if(it != dE[1][x[i]-y[i]].begin())
        {
            it--;
            pq.push({-(x[i] - (*it).first), {i, (*it).second}});
        }
    }
    else
    {
        assert(tip[i]=='S');

        auto it = dN[0][x[i]].lower_bound({y[i],0});
        if(it != dN[0][x[i]].end())
            pq.push({-((*it).first - y[i])/2, {i, (*it).second}});

        it = dE[2][x[i]+y[i]].lower_bound({x[i],INF});
        if(it != dE[2][x[i]+y[i]].begin())
        {
            it--;
            pq.push({-(x[i] - (*it).first), {i, (*it).second}});
        }

        it = dW[1][x[i]-y[i]].lower_bound({x[i],0});
        if(it != dW[1][x[i]-y[i]].end())
            pq.push({-((*it).first - x[i]), {i, (*it).second}});
    }
}
void baga(int i)
{
    if(tip[i]=='E')
    {
        dE[0][y[i]].insert({x[i],i});
        dE[1][x[i] - y[i]].insert({x[i],i});
        dE[2][x[i] + y[i]].insert({x[i],i});
    }
    else if(tip[i]=='W')
    {
        dW[0][y[i]].insert({x[i],i});
        dW[1][x[i] - y[i]].insert({x[i],i});
        dW[2][x[i] + y[i]].insert({x[i],i});
    }
    else if(tip[i]=='N')
    {
        dN[0][x[i]].insert({y[i],i});
        dN[1][x[i] - y[i]].insert({x[i],i});
        dN[2][x[i] + y[i]].insert({x[i],i});
    }
    else
    {
        assert(tip[i]=='S');
        dS[0][x[i]].insert({y[i],i});
        dS[1][x[i] - y[i]].insert({x[i],i});
        dS[2][x[i] + y[i]].insert({x[i],i});
    }
}
void scoate(int i)
{
    if(tip[i]=='E')
    {
        dE[0][y[i]].erase({x[i],i});
        dE[1][x[i] - y[i]].erase({x[i],i});
        dE[2][x[i] + y[i]].erase({x[i],i});
    }
    else if(tip[i]=='W')
    {
        dW[0][y[i]].erase({x[i],i});
        dW[1][x[i] - y[i]].erase({x[i],i});
        dW[2][x[i] + y[i]].erase({x[i],i});
    }
    else if(tip[i]=='N')
    {
        dN[0][x[i]].erase({y[i],i});
        dN[1][x[i] - y[i]].erase({x[i],i});
        dN[2][x[i] + y[i]].erase({x[i],i});
    }
    else
    {
        assert(tip[i]=='S');
        dS[0][x[i]].erase({y[i],i});
        dS[1][x[i] - y[i]].erase({x[i],i});
        dS[2][x[i] + y[i]].erase({x[i],i});
    }
}
signed main()
{
    ios_base::sync_with_stdio(0);cin.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>x[i]>>y[i]>>tip[i];
        baga(i);
    }
    for(int i=1;i<=n;i++)
    {
        calc_vecini(i);
    }
    while(!pq.empty())
    {
        int id1 = pq.top().second.first, id2 = pq.top().second.second;
        pq.pop();
        if(scos[id1] && scos[id2])
        {
            continue;
        }
        else if(!scos[id1] && scos[id2])
        {
            if(scos[id2] == pq.top().first)
            {
                scoate(id1);
                scos[id1] = pq.top().first;
            }
            else
                calc_vecini(id1);
        }
        else if(scos[id1] && !scos[id2])
        {
            if(scos[id1] == pq.top().first)
            {
                scoate(id2);
                scos[id2] = pq.top().first;
            }
            else
                calc_vecini(id2);
        }
        else
        {
            scoate(id1);
            scoate(id2);
            scos[id1] = scos[id2] = pq.top().first;
        }
    }
    for(int i=1;i<=n;i++)
        if(!scos[i])
            cout<<i<<"\n";
    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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...