Розділи нашого сайту


1.Новини
2.Про gpd
3.Скарги учасників
4.Розв"язки та алґоритми gpd
5.Тести
6.Гістьова книга
7.Лінки
задача fire розвязується дуже просто.
в нас на початку було X*Y*Z станцій, тому нехай ans = X*Y*Z.
тепер для всіх ударів метеоритів ми віднімаємо від ans наступне
якщо удар x y 0 => ans -= z;якщо x 0 z => ans -= y;якщо 0 y z => ans -= x;
далі знаходимо всі перетини пострілів та зберігаємо їх в масиві їхніх координат.
сортуємо масив.
далі якщо точка в масиві зустріається 1 раз то ans++, якщо 3 рази то ans+=2.
відповідб в ans.

а ось і тескст!
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define uchar unsigned char

#define MAXP            155


typedef struct ttype {
  long x, y, z;
  uchar w;
} ttype;

typedef struct ntype {
  long x, y, z;
} ntype;


ttype a[MAXP];
ntype points[MAXP * MAXP];
long x, y, z, p, i, j, h;
double ans;


long max(long *a,long *b)

{
  if (*a > *b)
    return (*a);
  else
    return (*b);
}


long cmp(ntype *a,ntype *b)
{
  if (a->x < b->x)
    return 1;
  else if (a->x > b->x)
    return 0;
  else {
    if (a->y < b->y)
      return 1;
    else if (a->y > b->y)
      return 0;
    else {
      if (a->z < b->z)
	return 1;
      else if (a->z > b->z)
	return 0;
      else
	return 0;
    }
  }
}


void Sort(long l,long r)
{
  long i = l, j = r;
  ntype x, y;

  x = points[(l + r) / 2 - 1];
  do {
    while (cmp(&points[i-1], &x) == 1)
      i++;
    while (cmp(&x, &points[j-1]) == 1)
      j--;
    if (i <= j) {
      y = points[i-1];
      points[i-1] = points[j-1];
      points[j-1] = y;
      i++;
      j--;
    }
  } while (i <= j);
  if (l < j)
    Sort(l, j);
  if (i < r)
    Sort(i, r);
}


int main(void)
{
  long FORLIM, FORLIM1;

  scanf("%ld%ld%ld%ld", &x, &y, &z, &p);
  FORLIM = p;
  for (i = 1; i <= FORLIM; i++) {
    scanf("%ld%ld%ld", &a[i-1].x, &a[i-1].y, &a[i-1].z);
    if (a[i-1].x == 0)
      a[i-1].w = 0;
    else if (a[i-1].y == 0)
      a[i-1].w = 1;
    else
      a[i-1].w = 2;
  }
  FORLIM = p;
  for (i = 1; i <= FORLIM; i++) {
    FORLIM1 = p;
    for (j = i + 1; j <= FORLIM1; j++) {
      if (a[i-1].w != a[j-1].w) {
	if (a[i-1].w != 0 && a[j-1].w != 0) {
	  if (a[i-1].x == a[j-1].x) {
	    h++;
	    points[h-1].x = a[i-1].x;
	    points[h-1].y = max(&a[i-1].y, &a[j-1].y);
	    points[h-1].z = max(&a[i-1].z, &a[j-1].z);
	  }
	} else if (a[i-1].w != 1 && a[j-1].w != 1) {
	  if (a[i-1].y == a[j-1].y) {
	    h++;
	    points[h-1].y = a[i-1].y;
	    points[h-1].x = max(&a[i-1].x, &a[j-1].x);
	    points[h-1].z = max(&a[i-1].z, &a[j-1].z);
	  }
	} else if (a[i-1].w != 2 && a[j-1].w != 2) {
	  if (a[i-1].z == a[j-1].z) {
	    h++;
	    points[h-1].z = a[i-1].z;
	    points[h-1].y = max(&a[i-1].y, &a[j-1].y);
	    points[h-1].x = max(&a[i-1].x, &a[j-1].x);
	  }
	}
      }
    }
  }
  Sort(1L, h);
  ans = x;
  ans *= y * z;
  FORLIM = p;
  for (i = 1; i <= FORLIM; i++) {
    if (a[i-1].w == 0)
      ans -= x;
    else if (a[i-1].w == 1)
      ans -= y;
    else if (a[i-1].w == 2)
      ans -= z;
  }
  if (h != 0)
    ans++;
  FORLIM = h;
  for (i = 2; i <= FORLIM; i++) {
    if (points[h-1].x != points[h-2].x
     || points[h-1].y != points[h-2].y ||
	points[h-1].z != points[h-2].z)
      ans++;
    else
      ans += 0.5;
  }
  printf("%0.0f\n", ans);
  return 0;
}



generated by gpd hackers group (c) 2004
Hosted by uCoz