Cod sursa(job #2330206)

Utilizator benjamin2205Zeic Beniamin benjamin2205 Data 28 ianuarie 2019 06:38:41
Problema Parcurgere DFS - componente conexe Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.21 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f ("aquapark.in");
ofstream g ("aquapark.out");

int c, n, m;
struct drum {
    int a;
    int b;
    int d;
    int z;
};

drum drm[100001];
int marc[100001][3];
int solutie[100001];

bool cmpl(drum l, drum r) {
//    return ((l.b - l.a < r.b - r.a) || ((l.b - l.a == r.b - r.a) && (l.a < r.a)));
    return ((l.a < r.a) || (l.a == r.a && l.b < r.b));
}

/// (nrlat + nrlat - 3) = maximul de cai

void citire() {
    int a, b;

    f >> c >> n >> m;
    for(int i = 1; i <= m; ++i) {
        f >> a >> b;
        // Ordoneaza perechea de piscine

        if (a < b) {
            drm[i].a = a;
            drm[i].b = b;
        }
        else {
            drm[i].a = b;
            drm[i].b = a;
        }
        drm[i].d = abs(a-b);

    }
}

// sortezi dupa diferenta si dupa care e primul

void rezolvare() {
    sort (drm + 1, drm + m + 1, cmpl);

//    for (int i = 1; i <= m; ++i) {
//        if (drm[i].d != 1) {
//            if (marc[drm[i].a]  >>< drm[i].d &&
//                marc[drm[i].b] == 0) {
//                for (int j = drm[i].a + 1; j < drm[i].b; ++j)
//                    marc[j] = drm[i].d - 1;
//                drm[i].z = 1;
//            }
//        }
//        else{
//            drm[i].z = 1;
//        }
//    }

///    =pracurgi laturile
///    =daca marginea stanga e mai mare sau egala SI cea dreapta e mai mica sau egala
///        atunci pentru fiecare element intre capete marchezi cu capat in stanga si dreapta
///               marchezi cu 1 in struct la latura respectiva
///        altfel marchezi cu 2 in struct la latura respectiva
///

//1,4
//2,5
//
//incepe din 2, deci trebuie sa nu mearga mai departe de marc[2][2]
//se termina in 5, deci nu trebuie sa mearga mai in spate decat marc[5][1]

    for (int i = 1; i <= m ;++i) {
        marc[i][2] = INT_MAX;
    }

    for (int i = 1; i <= m; ++i) {
        if (drm[i].b <= marc[drm[i].a][2] && drm[i].a >= marc[drm[i].b][1]) {
            for (int j = drm[i].a + 1; j < drm[i].b; ++j) {
                marc[j][1] = drm[i].a;
                marc[j][2] = drm[i].b;
            }
            drm[i].z = 1;
        }
    }

    for (int i = 1; i <= m; ++i) {
        g << drm[i].a << ' ';
        g << drm[i].b << ' ';
        if (drm[i].z == 0)
            g << 2 << '\n';
        else
            g << drm[i].z << '\n';
    }
}

void rezolvare2() {
    for (int i = 1; i <= m; ++i) {
        // Marcheaza dreapta i cu 1, daca nu e deja marcata
        if (solutie[i] == 0) {
            solutie[i] = 1;
            for (int j = 1; j <= m; ++j) {
                // Daca dreapta i intersecteaza dreapta j
                if ((drm[i].a < drm[j].a && drm[i].b < drm[j].b) ||
                    (drm[j].a < drm[i].a && drm[j].b < drm[i].b)) {
                    // Marcheaza dreapta j cu 2
                    solutie[j] = 2;
                }
            }
        }
    }

    for (int i = 1; i <= m; ++i) {
        g << drm[i].a << ' ';
        g << drm[i].b << ' ';
        g << solutie[i] << '\n';
    }
}

int main()
{
    citire();
    if (c == 1)
        rezolvare2();
    return 0;
}