Cod sursa(job #303487)

Utilizator FlorianFlorian Marcu Florian Data 9 aprilie 2009 21:24:17
Problema Regiuni Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include<cstdio>
#include<string>
#include<algorithm>
using namespace std;
#define Mod 666013
#define MAX_N 1024
#define B 26
#define BB 2
int a[MAX_N], b[MAX_N], c[MAX_N];
int x[MAX_N], y[MAX_N];
int n,m;
int h[MAX_N], H[MAX_N];
void read()
{
	freopen("regiuni.in","r",stdin);
	freopen("regiuni.out","w",stdout);
	scanf("%d%d",&n,&m);
	int i;
	for(i=1;i<=n;++i) scanf("%d%d%d",&a[i],&b[i],&c[i]);
	for(i=1;i<=m;++i) scanf("%d%d",&x[i],&y[i]);
}
int main()
{
	int i,j;
	int P , hash, pz, PP, HASH;
	read();
	for(i=1;i<=m;++i)
	{
		hash = 0; P = 1; PP = 1; HASH = 0;
		for(j=1;j<=n;++j)
		{
			pz = a[j]*x[i] + b[j]*y[i] + c[j];
			if(pz<0) 
				{
					hash = (hash + P*'a') % Mod;
					HASH = (HASH + PP*'a') % Mod;
			}
			else 
				{
					hash = (hash + P*'b') % Mod;
					HASH = (HASH + PP*'b') % Mod;
				}
			P = (P*B)%Mod;
			PP = (PP*BB)%Mod;
		}
		h[i] = hash;
		H[i] = HASH;
	}
	int sol = 0;
	for(i=1;i<=m;++i)
		if(h[i]!=-1)
		{
			sol++;
			for(j=i+1;j<=m;++j)
				if(h[i] == h[j] && H[i] == H[j])  h[j] = -1;
		}
	printf("%d\n",sol);
}