Submission #1068412

#TimeUsernameProblemLanguageResultExecution timeMemory
1068412lollipopNaval battle (CEOI24_battle)C++17
46 / 100
3086 ms791096 KiB
#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/rope>
//#define int long long
#define pb push_back
#define s second
#define f first
#define pf push_front
#define inf 100000000000000000
#define bitebi __builtin_popcountll
#define FOR( i , n ) for( int i = 0 ; i < n ; i ++ )
#define YES cout <<"YES\n"
#define NO cout << "NO\n"
#define debug cout << "Here Fine" << endl ;
#define pr pair < int , int >
#define fbo find_by_order // returns iterator
#define ook order_of_key // returns strictly less numbers than key
using namespace std ;
//#pragma GCC optimize("Ofast")
//#pragma GCC target("avx,avx2,fma")
using namespace __gnu_pbds;
using namespace __gnu_cxx;
template<class T> using ordered_set =tree<T, null_type, less<T>, rb_tree_tag,tree_order_statistics_node_update> ;
const double Pi=acos(-1.0);
const double EPS=1E-8;
const int mod =  1000000007 ;
const int mod1 = 998244353 ;
const int N = 2e5 + 10 ;
mt19937 R(time(0));
map < int , int > ma , ma1 ;



struct Point {
    int x;
    int y;
};
Point val[ N ] ;


bool willIntersect(Point p1, char d1, Point p2, char d2, int &time) {
    // Calculate deltas for movement
    int dx1 = (d1 == 'E') ? 1 : (d1 == 'W') ? -1 : 0;
    int dy1 = (d1 == 'N') ? -1 : (d1 == 'S') ? 1 : 0;
    int dx2 = (d2 == 'E') ? 1 : (d2 == 'W') ? -1 : 0;
    int dy2 = (d2 == 'N') ? -1 : (d2 == 'S') ? 1 : 0;

    // Relative movement per time step
    int rel_dx = dx2 - dx1;
    int rel_dy = dy2 - dy1;

    // Initial difference in positions
    int diff_x = p1.x - p2.x;
    int diff_y = p1.y - p2.y;
    //cout << rel_dx << " " << rel_dy << " " << diff_x << " " << diff_y << endl ;
    if (rel_dx != 0 && diff_x % rel_dx == 0) {
        time = diff_x / rel_dx;
        if (time >= 0 && diff_y == time * rel_dy) {
            return true;
        }
    } else if (rel_dy != 0 && diff_y % rel_dy == 0) {
        time = diff_y / rel_dy;
        if (time >= 0 && diff_x == time * rel_dx) {
            return true;
        }
    } else if (rel_dx == 0 && rel_dy == 0) {  
        if (diff_x == 0 && diff_y == 0) {
            time = 0;
            return true;
        }
    }

    // No intersection found
    return false;
}



int n ;
vector < pair < int , pair < int , int > > > v ;
int ds[ N ] ;
char c[ N ] ;

void solve(){
	cin >> n ;
	
	
	
	FOR( i , n ) cin >> val[ i ].x >> val[ i ].y >> c[ i ] ; 
	FOR( i , n ) ds[ i ] = -1 ; 
	
	
	FOR( i , n ){
		for( int j = i + 1 ; j < n ; j ++ ){
			// check if they coincide 
			if( c[ i ] == c[ j ] ) continue ; 
			int time = -1 ; 
			if( willIntersect(val[ i ], c[ i ], val[ j ], c[ j ], time) ){
				time = abs( time ) ; 
				v.pb( { time , { i , j } } ) ;
		//		cout << i << " " << j << " time " << time << endl;
			}
		}
	}
	
	sort( v.begin() , v.end() ) ;
	
	for( auto x : v ){
		if( ds[ x.s.f ] != -1 && ds[ x.s.s ] != -1 ) continue ; 
		if( ds[ x.s.f ] == -1 && ds[ x.s.s ] == -1 ){
		 	ds[ x.s.f ] = x.f ; 
		 	ds[ x.s.s ] = x.f ; continue ; 
		}
		if( ds[ x.s.f ] == -1 ){
			if( ds[ x.s.s ] == x.f ) ds[ x.s.f ] = x.f ; 
		} 
		else{
			if( ds[ x.s.f ] == x.f ) ds[ x.s.s ] = x.f ; 			
		}
		
	}
	FOR( i , n ){
		if( ds[ i ] == -1 ) cout << i + 1 << " " ;
	}
	return ; 
}
signed main() {
   ios_base::sync_with_stdio(0),cin.tie(NULL),cout.tie(NULL);
   int t = 1 ; // cin >> t ;
   while( t -- ){
   	 solve() ;
   }

}




#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...