제출 #1137487

#제출 시각아이디문제언어결과실행 시간메모리
1137487Muhammad_AneeqNaval battle (CEOI24_battle)C++20
46 / 100
3069 ms520436 KiB
/*
بسم الله الرحمن الرحيم
Author:
                          (:Muhammad Aneeq:)
*/

#include <iostream>
#include <set>
#include <vector>
#include <algorithm>
#include <map>
#warning check the output
using namespace std;
int const N=2e5+10;
int x[N],y[N];
char c[N];
set<pair<int,int>>vals[N]={};
bool ans[N]={};
void check(int i,int j)
{
    if (c[i]==c[j])
        return;
    if (c[i]=='N')
    {
        if (c[j]=='S'&&x[i]==x[j]&&y[j]<y[i]&&(y[i]-y[j])%2==0)
        {
            int cur=abs(y[i]-y[j])/2;
            vals[i].insert({cur,j});
            vals[j].insert({cur,i});
        }
        if (c[j]=='E'&&x[i]>x[j]&&y[i]>y[j]&&x[i]-x[j]==y[i]-y[j])
        {
            int cur=x[i]-x[j];
            vals[i].insert({cur,j});
            vals[j].insert({cur,i});
        }
        if (c[j]=='W'&&x[j]>x[i]&&y[i]>y[j]&&x[j]-x[i]==y[i]-y[j])
        {
            int cur=x[j]-x[i];
            vals[i].insert({cur,j});
            vals[j].insert({cur,i});
        }
    }
    if (c[i]=='S')
    {
        if (c[j]=='N'&&x[i]==x[j]&&y[j]>y[i]&&(y[j]-y[i])%2==0)
        {
            int cur=abs(y[i]-y[j])/2;
            vals[i].insert({cur,j});
            vals[j].insert({cur,i});
        }
        if (c[j]=='E'&&x[i]>x[j]&&y[i]<y[j]&&x[i]-x[j]==y[j]-y[i])
        {
            int cur=x[i]-x[j];
            vals[i].insert({cur,j});
            vals[j].insert({cur,i});
        }
        if (c[j]=='W'&&x[j]>x[i]&&y[i]<y[j]&&x[j]-x[i]==y[j]-y[i])
        {
            int cur=x[j]-x[i];
            vals[i].insert({cur,j});
            vals[j].insert({cur,i});
        }
    }
    if (c[i]=='E')
    {
        if (c[j]=='S'&&x[i]<x[j]&&y[i]>y[j]&&x[j]-x[i]==y[i]-y[j])
        {
            int cur=x[j]-x[i];
            vals[i].insert({cur,j});
            vals[j].insert({cur,i});
        }
        if (c[j]=='N'&&x[j]>x[i]&&y[j]>y[i]&&x[j]-x[i]==y[j]-y[i])
        {
            int cur=x[j]-x[i];
            vals[i].insert({cur,j});
            vals[j].insert({cur,i});
        }
        if (c[j]=='W'&&x[j]>x[i]&&y[i]==y[j]&&(x[j]-x[i])%2==0)
        {
            int cur=(x[j]-x[i])/2;
            vals[i].insert({cur,j});
            vals[j].insert({cur,i});
        }
    }
    if (c[i]=='W')
    {
        if (c[j]=='S'&&x[i]>x[j]&&y[i]>y[j]&&x[i]-x[j]==y[i]-y[j])
        {
            int cur=x[i]-x[j];
            vals[i].insert({cur,j});
            vals[j].insert({cur,i});
        }
        if (c[j]=='N'&&x[j]<x[i]&&y[j]>y[i]&&x[i]-x[j]==y[j]-y[i])
        {
            int cur=x[i]-x[j];
            vals[i].insert({cur,j});
            vals[j].insert({cur,i});
        }
        if (c[j]=='E'&&x[j]<x[i]&&y[i]==y[j]&&(x[i]-x[j])%2==0)
        {
            int cur=(x[i]-x[j])/2;
            vals[i].insert({cur,j});
            vals[j].insert({cur,i});
        }
    }
}
void subt6(int n)
{
    map<int,vector<pair<int,int>>>e[2];
    map<int,set<pair<int,int>>>w[2];
    for (int i=0;i<n;i++)
    {
        if (c[i]=='W')
            w[x[i]%2][y[i]].insert({x[i],i});
        else
            e[x[i]%2][y[i]].push_back({x[i],i});
    }
    for (auto& [i,k]:e[0])
        sort(rbegin(k),rend(k));
    for (auto& [i,k]:e[1])
        sort(rbegin(k),rend(k));
    for (auto [i,k]:e[0])
    {
        for (auto [j,ind]:k)
        {
            auto z=w[0][i].lower_bound({j,-1});
            if (z==w[0][i].end())
                continue;
            ans[ind]=ans[(*z).second]=1;
            w[0][i].erase(z);
        }
    }
    for (auto [i,k]:e[1])
    {
        for (auto [j,ind]:k)
        {
            auto z=w[1][i].lower_bound({j,-1});
            if (z==w[1][i].end())
                continue;
            ans[ind]=ans[(*z).second]=1;
            w[1][i].erase(z);
        }
    }
    for (int i=0;i<n;i++)
    {
        if (ans[i]==0)
        {
            cout<<i+1<<endl;
        }
    }
}
inline void solve()
{
    int n;
    cin>>n;
    bool s6=1;
    for (int i=0;i<n;i++)
    {
        cin>>x[i]>>y[i]>>c[i];
        if (c[i]=='N'||c[i]=='S')
            s6=0;
    }
    if (s6)
    {
        subt6(n);
        return;
    }
    for (int i=0;i<n;i++)
    {
        for (int j=i+1;j<n;j++)
        {
            check(i,j);
        }
    }
    while (1)
    {
        int mn=1e9+10;
        vector<int>inds;
        for (int i=0;i<n;i++)
        {
            if (vals[i].size()&&(*begin(vals[i])).first<mn)
            {
                inds={};
                mn=(*begin(vals[i])).first;
                inds.push_back(i);
            }
            else if (mn==(*begin(vals[i])).first)
            {
                inds.push_back(i);
            }
        }
        if (inds.size()==0)
            break;
        for (auto i:inds)
        {
            ans[i]=1;
            for (auto [j,k]:vals[i])
                vals[k].erase({j,i});
            vals[i]={};
        }
    }
    for (int i=0;i<n;i++)
    {
        if (ans[i]==0)
        {
            cout<<i+1<<endl;
        }
    }
}
int main()
{
    ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
    int t=1;
    for (int i=1;i<=t;i++)
    {
        solve();
    }
}

컴파일 시 표준 에러 (stderr) 메시지

Main.cpp:12:2: warning: #warning check the output [-Wcpp]
   12 | #warning check the output
      |  ^~~~~~~
#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...