Cod sursa(job #1891715)

Utilizator EpictetStamatin Cristian Epictet Data 24 februarie 2017 11:41:08
Problema Regiuni Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <fstream>
#include <vector>
#include <list>

using namespace std;

ifstream fin ("regiuni.in");
ofstream fout ("regiuni.out");

class dreapta { public : int a, b, c; } N[1010];
class punct { public : int x, y; } M[1010];
int n, m, g = 1;
vector < int > A;
list < int > L[1010];

bool Pos(punct p, dreapta d)
{
    return (d.a * p.x + d.b * p.y + d.c > 0);
}

int main()
{
    fin >> n >> m;
    for (int i = 1; i <= n; i ++)
    {
        fin >> N[i].a >> N[i].b >> N[i].c;
    }
    for (int i = 1; i <= m; i ++)
    {
        fin >> M[i].x >> M[i].y;
        L[g].push_back(i);
    }
    for (int i = 1; i <= n; i ++)
    {
        for (int j = 1, jj = g; j <= jj; j ++)
        {
            while (!A.empty()) A.pop_back();
            int a = 0;
            for (list < int > :: iterator it = L[j].begin(); it != L[j].end(); it ++)
            {
                if (Pos(M[*it], N[i])) A.push_back(*it);
                else a ++;
            }
            if (!A.empty() && a > 0)
            {
                g ++;
                vector < int > :: iterator it2 = A.begin();
                for (list < int > :: iterator it1 = L[j].begin(); it1 != L[j].end() && it2 != A.end(); it1 ++)
                {
                    while (it1 != L[j].end() && it2 != A.end() && *it1 == *it2)
                    {
                        it1 = L[j].erase(it1);
                        L[g].push_back(*it2);
                        it2 ++;
                    }
                }
            }
        }
    }
    fout << g << '\n';
    fout.close();
    return 0;
}