Submission #1360214

#TimeUsernameProblemLanguageResultExecution timeMemory
1360214lex._.Park (BOI16_park)C++20
0 / 100
127 ms31908 KiB
#include <bits/stdc++.h>
#define MMAX 100000
#define NMAX 2000
#define x first
#define y second
using namespace std;

pair<int, int> trees_coord[NMAX+1];
int trees_r[NMAX+1];

pair<double, pair<int, int>> muchii[NMAX*NMAX+1];
int cnt=0;

double dist(pair<int, int> a, pair<int, int> b)
{
    return sqrt((a.first-b.first)*(a.first-b.first)+(a.second-b.second)*(a.second-b.second));
}

int t[NMAX+5], sz[NMAX+5];

int find(int node)
{
    if(node==t[node]) return node;
    t[node]=find(t[node]);
    return t[node];
}

void merge(int node1, int node2)
{
    node1=find(node1);
    node2=find(node2);
    if(node1==node2) return;
    if(sz[node1]<sz[node2]) swap(node1, node2);
    t[node2]=node1;
    sz[node1]+=sz[node2];
}

bool same_cc(int node1, int node2)
{
    node1=find(node1);
    node2=find(node2);
    return (node1==node2);
}

struct query
{
    int r, e, idx;
} queries[MMAX+1];

bool cmp(query a, query b)
{
    return a.r<b.r;
}

bool ans[MMAX+1][5];

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int n, m, w, h;
    cin >> n >> m >> w >> h;
    for(int i=1; i<=n; i++)
    {
        cin >> trees_coord[i].x >> trees_coord[i].y >> trees_r[i];
        muchii[++cnt]={trees_coord[i].y-trees_r[i], {i, n+1}};
        muchii[++cnt]={w-trees_coord[i].x-trees_r[i], {i, n+2}};
        muchii[++cnt]={h-trees_coord[i].y-trees_r[i], {i, n+3}};
        muchii[++cnt]={trees_coord[i].x-trees_r[i], {i, n+4}};
    }
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<i; j++)
        {
            double d=dist(trees_coord[i], trees_coord[j])-(trees_r[i]+trees_r[j]);
            muchii[++cnt]={d, {i, j}};
        }
    }
    for(int i=1; i<=n+4; i++)
    {
        t[i]=i;
        sz[i]=1;
    }
    sort(muchii+1, muchii+cnt+1);

    for(int i=1; i<=m; i++)
    {
        cin >> queries[i].r >> queries[i].e;
        queries[i].idx=i;
    }
    sort(queries+1, queries+m+1, cmp);
    int j=1;
    for(int i=1; i<=m; i++)
    {
        while(j<=cnt && muchii[j].first<2*queries[i].r)
        {
            merge(muchii[j].second.first, muchii[j].second.second);
            j++;
        }
        ans[queries[i].idx][1]=ans[queries[i].idx][2]=ans[queries[i].idx][3]=ans[queries[i].idx][4]=1;

        if(same_cc(n+4, n+1) && queries[i].e!=1) ans[queries[i].idx][1]=0;
        if(same_cc(n+1, n+2) && queries[i].e!=2) ans[queries[i].idx][2]=0;
        if(same_cc(n+2, n+3) && queries[i].e!=3) ans[queries[i].idx][3]=0;
        if(same_cc(n+3, n+4) && queries[i].e!=4) ans[queries[i].idx][4]=0;

        if(same_cc(n+1, n+3))
        {
            if(queries[i].e==1 || queries[i].e==4) ans[queries[i].idx][2]=ans[queries[i].idx][3]=0;
            else ans[queries[i].idx][1]=ans[queries[i].idx][4]=0;
        }

        if(same_cc(n+2, n+4))
        {
            if(queries[i].e==1 || queries[i].e==2) ans[queries[i].idx][3]=ans[queries[i].idx][4]=0;
            else ans[queries[i].idx][1]=ans[queries[i].idx][2]=0;
        }
    }
    for(int i=1; i<=m; i++)
    {
        for(int e=1; e<=4; e++)
            if(ans[i][e]) cout << e;
        cout << "\n";
    }

    return 0;
}

Compilation message (stderr)

park.cpp: In function 'int main()':
park.cpp:67:40: warning: narrowing conversion of '(trees_coord[i].std::pair<int, int>::second - trees_r[i])' from 'int' to 'double' [-Wnarrowing]
   67 |         muchii[++cnt]={trees_coord[i].y-trees_r[i], {i, n+1}};
      |                        ~~~~~~~~~~~~~~~~^~~~~~~~~~~
park.cpp:68:42: warning: narrowing conversion of '((w - trees_coord[i].std::pair<int, int>::first) - trees_r[i])' from 'int' to 'double' [-Wnarrowing]
   68 |         muchii[++cnt]={w-trees_coord[i].x-trees_r[i], {i, n+2}};
      |                        ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~
park.cpp:69:42: warning: narrowing conversion of '((h - trees_coord[i].std::pair<int, int>::second) - trees_r[i])' from 'int' to 'double' [-Wnarrowing]
   69 |         muchii[++cnt]={h-trees_coord[i].y-trees_r[i], {i, n+3}};
      |                        ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~
park.cpp:70:40: warning: narrowing conversion of '(trees_coord[i].std::pair<int, int>::first - trees_r[i])' from 'int' to 'double' [-Wnarrowing]
   70 |         muchii[++cnt]={trees_coord[i].x-trees_r[i], {i, n+4}};
      |                        ~~~~~~~~~~~~~~~~^~~~~~~~~~~
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...