Submission #1307381

#TimeUsernameProblemLanguageResultExecution timeMemory
1307381opeleklanosFountain Parks (IOI21_parks)C++20
15 / 100
72 ms23592 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <stack>
#include "parks.h"
using namespace std;


int xi[4] = {0, 0, +2, -2};
int yi[4] = {+2, -2, 0, 0};

int n;
vector<int> roadU;
vector<int> roadD;
vector<int> benchX;
vector<int> benchY;

#define X first.second 
#define Y first.first 

int construct_roads(vector<int> x, vector<int> y){
    n = x.size();
    vector<pair<pair<int, int>, int>> fount(n);
    
    for(int i = 0; i<n; i++){
        fount[i] = {{y[i], x[i]}, i};
    }
    sort(fount.begin(), fount.end());
    // reverse(fount.begin(), fount.end());

    vector<int> seen(n);
    stack<int> s;
    s.push(0);
    while(!s.empty()){
        int i = s.top();
        seen[i] = 1;
        s.pop();
        if(fount[i].X == fount[i+1].X && fount[i].Y + 2 == fount[i+1].Y&& !seen[i+1]){
            roadU.push_back(fount[i].second);
            roadD.push_back(fount[i+1].second);
            benchX.push_back((fount[i].X == 2)?1:5);
            benchY.push_back(fount[i].Y+1);
            if(!seen[i+1]) s.push(i+1);
        }
        if(fount[i].Y == fount[i-1].Y && fount[i].X - 2 == fount[i-1].X && !seen[i-1]){
            roadU.push_back(fount[i].second);
            roadD.push_back(fount[i-1].second);
            benchX.push_back(3);
            benchY.push_back(fount[i].Y+1);
            if(!seen[i-1]) s.push(i-1);
        }
        if(fount[i].X + 2 == fount[i+1].X && fount[i].Y == fount[i+1].Y&& !seen[i+1]){
            roadU.push_back(fount[i].second);
            roadD.push_back(fount[i+1].second);
            benchX.push_back(3);
            benchY.push_back(fount[i].Y+1);
            if(!seen[i+1]) s.push(i+1);
        }
        if(i<n-2 && fount[i].X == fount[i+2].X && fount[i].Y + 2 == fount[i+2].Y&& !seen[i+2]){
            roadU.push_back(fount[i].second);
            roadD.push_back(fount[i+2].second);
            benchX.push_back((fount[i].X == 2)?1:5);
            benchY.push_back(fount[i].Y+1);
            if(!seen[i+2]) s.push(i+2);
        }
    }
    
    for(int i = 0; i<n; i++) if(seen[i] == 0) return 0;
    build(roadU, roadD, benchX, benchY);

    return 1;
}

// int main(void){
//     freopen("input.txt", "r", stdin);
//     int ni;
//     cin>>ni;
//     vector<int> c1(ni), l1(ni);
//     for(int i = 0; i<ni; i++) cin>>c1[i];
//     for(int i = 0; i<ni; i++) cin>>l1[i];
    
//     int ans = construct_roads(c1, l1);
    
// }

// vector<vector<int>> grid;

// vector<vector<int>> vis;
// int found = 0;

// void dfs(int x, int y){
    //     vis[x][y] = 1;
    //     for(int i = 0; i<4; i++){
        //         if(grid[xi[i]+x][yi[i]+y] && !vis[xi[i]+x][yi[i]+y]){
            //             roadU.push_back(grid[x][y]-1);
            //             roadD.push_back(grid[xi[i]+x][yi[i]+y] - 1);
            //             if(x == 2 || y+xi[i] == 2)
            //         }
            //     }
            // }
#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...