prostor.cpp


/*
  Croatian Open Competition in Informatics 2006/2007
  Contest 6 - Task PROSTOR
  Programming language C++
*/

#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#include <cstring>
#include <unordered_set>
#include <set>
#include <stack>
#include <map>
#include <cmath>
#include <sstream>
#include <queue>


using namespace std;

#define MAX 1000

typedef long long llint;

struct loga2D {
   int a[MAX][MAX];

   void clear() {
      memset( a, 0, sizeof a );
   }

   void update( int X, int Y, int delta ) {
      for( int x = X; x <= MAX; x += x&-x )
         for( int y = Y; y <= MAX; y += y&-y )
            a[x][y] += delta;
   }

   int query( int X, int Y ) {
      int ret = 0;
      for( int x = X; x > 0; x -= x&-x )
         for( int y = Y; y > 0; y -= y&-y )
            ret += a[x][y];
      return ret;
   }

   int query( int X1, int Y1, int X2, int Y2 ) {
      return query( X2, Y2 ) - query( X1-1, Y2 ) - query( X2, Y1-1 ) + query( X1-1, Y1-1 );
   }

} Lo, Hi;

struct event {
   int type, y;
   int x1, x2;
   int z1, z2;
   event( int T, int Y, int X1, int X2, int Z1, int Z2 ) {
      type = T; y = Y;
      x1 = X1; x2 = X2;
      z1 = Z1; z2 = Z2;
   }
};
bool operator < ( const event &A, const event &B ) {
   if( A.y != B.y ) return A.y < B.y;
   return A.type < B.type;
}

llint sweep( vector<event> &E ) {
   llint ret = 0;

   sort( E.begin(), E.end() );
   Lo.clear();
   Hi.clear();

   for( vector<event>::iterator it = E.begin(); it != E.end(); ++it ) {
      if( it->type == 1 || it->type == 2 ) {
         ret += Lo.query( it->x1, 1, it->x2, it->z2 ) - Hi.query( it->x1, 1, it->x2, it->z1 - 1 );
      }
      if( it->type == 1 ) {
         Lo.update( it->x1, it->z1, 1 );
         Hi.update( it->x2, it->z2, 1 );
      }
      if( it->type == 3 ) {
         Lo.update( it->x1, it->z1, -1 );
         Hi.update( it->x2, it->z2, -1 );
      }
   }

   return ret;
}

int main( void ) {
   int n;
   scanf( "%d", &n );

   vector<event> sweepXY;
   vector<event> sweepYZ;
   vector<event> sweepZX;

   for( int i = 0; i < n; ++i ) {
      int x1, y1, z1;
      int x2, y2, z2;
      scanf( "%d%d%d", &x1, &y1, &z1 );
      scanf( "%d%d%d", &x2, &y2, &z2 );
      if( x2 < x1 ) swap( x1, x2 );
      if( y2 < y1 ) swap( y1, y2 );
      if( z2 < z1 ) swap( z1, z2 );

      if( x1 == x2 ) {
         sweepXY.push_back( event( 1, y1, x1, x2, z1, z2 ) );
         sweepZX.push_back( event( 2, x1, z1, z2, y1, y2 ) );
         sweepXY.push_back( event( 3, y2, x1, x2, z1, z2 ) );
      }
      if( y1 == y2 ) {
         sweepYZ.push_back( event( 1, z1, y1, y2, x1, x2 ) );
         sweepXY.push_back( event( 2, y1, x1, x2, z1, z2 ) );
         sweepYZ.push_back( event( 3, z2, y1, y2, x1, x2 ) );
      }
      if( z1 == z2 ) {
         sweepZX.push_back( event( 1, x1, z1, z2, y1, y2 ) );
         sweepYZ.push_back( event( 2, z1, y1, y2, x1, x2 ) );
         sweepZX.push_back( event( 3, x2, z1, z2, y1, y2 ) );
      }
   }

   printf( "%lld\n", sweep(sweepXY) + sweep(sweepYZ) + sweep(sweepZX) );

   return 0;
}
posted @ 2023-03-09 22:13  harper886  阅读(30)  评论(0编辑  收藏  举报