Pagini recente » Cod sursa (job #1557146) | Cod sursa (job #383578) | Cod sursa (job #1672600) | Cod sursa (job #2648456) | Cod sursa (job #2330206)
#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;
}