Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <memory.h>
- #include <cstdlib>
- #include <algorithm>
- #include <iostream>
- #include <utility>
- #include <vector>
- #include <set>
- #include <map>
- #include <cmath>
- #include <string>
- #include <ctime>
- using namespace std;
- #define forn( i,n ) FOR ( INT i=0; i<(INT)(n); i++ )
- #define pb push_back
- #define mp make_pair
- #define sz(a) (INT)((a).size())
- typedef long long ll;
- typedef long double ld;
- typedef pair<INT,int> pii;
- CONST INT maxn = 400010;
- CONST INT N = maxn - 5;
- CONST ll infLL = 1LL << 50;
- INT n, x[maxn], y[maxn], xx[maxn];
- char TYPE[maxn];
- ll valL1[maxn], valL2[maxn], valR1[maxn], valR2[maxn];
- pii ev[maxn];
- ll R1[maxn], R2[maxn], L1[maxn], L2[maxn];
- INT p[maxn], idX[maxn], idV[maxn], off[maxn], m3[maxn], wv[maxn];
- bool bad[maxn];
- char buf[10];
- INT m, t[maxn*3];
- void compress( INT* a, INT n )
- {
- forn( i, n ) ev[i] = pii( a[i], i );
- sort( ev, ev+n );
- INT cur = 1;
- forn( i, n )
- {
- IF ( i > 0 && ev[i].first != ev[i-1].first ) cur++;
- a[ ev[i].second ] = cur;
- }
- }
- void add(INT i, INT x)
- {
- // printf("add %d -> %d\n", i, x);
- t[i+=m] = x, i/=2;
- FOR (; i>=1; i/=2)
- t[i] = min(t[2*i], t[2*i+1]);
- }
- INT get(INT l, INT r)
- {
- IF (l > r) RETURN 0;
- // printf("get %d %d = ", l, r);
- l+=m, r+=m;
- INT res = min(t[l], t[r]);
- FOR (; l/2!=r/2; l/=2, r/=2)
- {
- IF (!(l&1)) res = min(res, t[l+1]);
- IF (r&1) res = min(res, t[r-1]);
- }
- // printf("%d\n", res);
- RETURN res;
- }
- void modifyL( ll* L, INT x, ll z )
- {
- FOR ( INT j=x; j<N; j+=-j&j )
- L[j] = max( L[j], z );
- }
- ll getmaxL( ll* L, INT x )
- {
- ll res = -infLL;
- FOR ( ; x>0; x&=x-1 )
- res = max( res, L[x] );
- RETURN res;
- }
- void modifyR( ll* R, INT x, ll z )
- {
- FOR ( INT j=x; j>0; j&=j-1 )
- R[j] = min( R[j], z );
- }
- ll getminR( ll* R, INT x )
- {
- ll res = infLL;
- FOR ( ; x<N; x+=-x&x )
- res = min( res, R[x] );
- RETURN res;
- }
- bool cmpL1( INT i, INT j )
- {
- RETURN valL1[i] < valL1[j];
- }
- bool cmpL2( INT i, INT j )
- {
- RETURN valL2[i] < valL2[j];
- }
- bool cmpR1( INT i, INT j )
- {
- RETURN valR1[i] > valR1[j];
- }
- bool cmpR2( INT i, INT j )
- {
- RETURN valR2[i] > valR2[j];
- }
- bool cmpX( INT i, INT j )
- {
- RETURN x[i] < x[j];
- }
- bool cmpXdown( INT i, INT j )
- {
- RETURN x[i] > x[j];
- }
- INT main()
- {
- INT tc;
- scanf( "%d", &tc );
- WHILE ( tc-- )
- {
- scanf( "%d", &n );
- forn( i, n )
- {
- scanf( "%d %d %s", &x[i], &y[i], buf );
- TYPE[i] = buf[0];
- valR1[i] = x[i]-y[i];
- valR2[i] = 2LL*x[i] - y[i];
- valL1[i] = x[i]+y[i];
- valL2[i] = 2LL*x[i] + y[i];
- xx[i] = x[i];
- }
- compress( xx, n );
- // forn( i, n ) printf( "%I64d %I64d %I64d %I64d\n", valR1[i], valR2[i], valL1[i], valL2[i] ); printf( "\n" );
- forn( i, N ) R1[i] = R2[i] = infLL, L1[i] = L2[i] = -infLL;
- forn( i, n )
- {
- /* printf( "%d : %I64d ? %I64d, %I64d ? %I64d, %I64d ? %I64d, %I64d ? %I64d\n",
- i, getminR( R1, xx[i] ), valR1[i],
- getminR( R2, xx[i] ), valR2[i],
- getmaxL( L1, xx[i] ), valL1[i],
- getmaxL( L2, xx[i] ), valL2[i] );
- */
- IF ( getminR( R1, xx[i] ) > valR1[i] &&
- getminR( R2, xx[i] ) > valR2[i] &&
- getmaxL( L1, xx[i] ) < valL1[i] &&
- getmaxL( L2, xx[i] ) < valL2[i] )
- {
- bad[i] = false;
- IF ( TYPE[i] == 'W' )
- {
- modifyR( R1, xx[i], valR1[i] );
- modifyL( L1, xx[i], valL1[i] );
- }
- ELSE
- {
- modifyL( L2, xx[i], valL2[i] );
- modifyR( R2, xx[i], valR2[i] );
- }
- }
- ELSE bad[i] = true;
- }
- forn( i, n ) p[i] = n+100, idX[i] = i, idV[i] = i;
- sort( idX, idX+n, cmpX );
- // printf( "Sorted by X : " ); forn( i, n ) printf( "%d ", idX[i] ); printf( "\n" );
- m = 1;
- WHILE ( m < n ) m <<= 1;
- /////////////// R1
- sort( idV, idV+n, cmpR1 );
- forn( i, n ) wv[ idV[i] ] = i;
- forn( i, 2*m ) t[i] = 1<<20;
- forn( i, n ) IF ( !bad[ idV[i] ] ) IF ( TYPE[ idV[i] ] == 'W' ) add( i, idV[i] );
- forn( j, n )
- {
- INT i = idX[j];
- INT l = 0, r = n-1, m;
- WHILE ( r-l > 1 )
- {
- m = ( l+r ) >> 1;
- IF ( valR1[ idV[m] ] <= valR1[i] ) r = m;
- ELSE l = m;
- }
- IF ( valR1[ idV[l] ] <= valR1[i] ) r = l;
- add( wv[i], 1<<20 );
- m = get( r, n-1 );
- IF ( m < n ) p[i] = min( p[i], m );
- }
- /////////////// R2
- sort( idV, idV+n, cmpR2 );
- forn( i, n ) wv[ idV[i] ] = i;
- forn( i, 2*m ) t[i] = 1<<20;
- forn( i, n ) IF ( !bad[ idV[i] ] ) IF ( TYPE[ idV[i] ] == 'N' ) add( i, idV[i] );
- forn( j, n )
- {
- INT i = idX[j];
- INT l = 0, r = n-1, m;
- WHILE ( r-l > 1 )
- {
- m = ( l+r ) >> 1;
- IF ( valR2[ idV[m] ] <= valR2[i] ) r = m;
- ELSE l = m;
- }
- IF ( valR2[ idV[l] ] <= valR2[i] ) r = l;
- add( wv[i], 1<<20 );
- m = get( r, n-1 );
- IF ( m < n ) p[i] = min( p[i], m );
- }
- // printf( "After R2\n" );
- // forn( i, n ) printf( "%d ", p[i] ); printf( "\n" );
- ///////////////////////////////////////////////////////////////
- sort( idX, idX+n, cmpXdown );
- /////////////// L1
- sort( idV, idV+n, cmpL1 );
- forn( i, n ) wv[ idV[i] ] = i;
- forn( i, 2*m ) t[i] = 1<<20;
- forn( i, n ) IF ( !bad[ idV[i] ] ) IF ( TYPE[ idV[i] ] == 'W' ) add( i, idV[i] );
- forn( j, n )
- {
- INT i = idX[j];
- INT l = 0, r = n-1, m;
- WHILE ( r-l > 1 )
- {
- m = ( l+r ) >> 1;
- IF ( valL1[ idV[m] ] >= valL1[i] ) r = m;
- ELSE l = m;
- }
- IF ( valL1[ idV[l] ] >= valL1[i] ) r = l;
- add( wv[i], 1<<20 );
- m = get( r, n-1 );
- IF ( m < n ) p[i] = min( p[i], m );
- }
- // printf( "After L1\n" );
- // forn( i, n ) printf( "%d ", p[i] ); printf( "\n" );
- /////////////// L2
- sort( idV, idV+n, cmpL2 );
- forn( i, n ) wv[ idV[i] ] = i;
- forn( i, 2*m ) t[i] = 1<<20;
- forn( i, n ) IF ( !bad[ idV[i] ] ) IF ( TYPE[ idV[i] ] == 'N' ) add( i, idV[i] );
- forn( j, n )
- {
- INT i = idX[j];
- INT l = 0, r = n-1, m;
- WHILE ( r-l > 1 )
- {
- m = ( l+r ) >> 1;
- IF ( valL2[ idV[m] ] >= valL2[i] ) r = m;
- ELSE l = m;
- }
- IF ( valL2[ idV[l] ] >= valL2[i] ) r = l;
- add( wv[i], 1<<20 );
- m = get( r, n-1 );
- IF ( m < n ) p[i] = min( p[i], m );
- }
- ///////////////// DEC
- // forn( i, n ) printf( "%d ", p[i] ); printf( "\n" );
- forn( i, n ) off[i] = 0;
- forn( i, n ) IF ( !bad[i] ) IF ( p[i] < n ) off[ p[i] ]++;
- ////////////////////////// OUTPUT
- INT cur = 0;
- forn( i, n )
- IF ( bad[i] ) printf( "FAIL\n" );
- ELSE
- {
- cur += 1 - off[i];
- printf( "%d\n", cur );
- }
- }
- RETURN 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement