Submission #1177366

#TimeUsernameProblemLanguageResultExecution timeMemory
1177366alexddNaval battle (CEOI24_battle)C++20
30 / 100
1470 ms106852 KiB
#include<bits/stdc++.h>
using namespace std;
const int INF = 1e9;
int n;
int x[200005],y[200005];
char tip[200005];
bool 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)///calculeaza si restu lovirilor
{
    if(tip[i]=='E')
    {
        auto 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}});
        }
    }
    else if(tip[i]=='W')
    {

    }
    else if(tip[i]=='N')
    {

    }
    else
    {
        assert(tip[i]=='S');
        auto it = dE[2][x[i]+y[i]].upper_bound({x[i],INF});
        if(it != dE[2][x[i]+y[i]].begin())
        {
            it--;
            pq.push({-(x[i] - (*it).first), {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)
{
    scos[i]=1;
    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])
        {
            if(!scos[id1])
                calc_vecini(id1);
            if(!scos[id2])
                calc_vecini(id2);
            continue;
        }
        scoate(id1);
        scoate(id2);
    }
    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...