[羅区P4385] [COCI2009] Dvapravca(GUGU区)

効果の件名:昔のタイトルを行うには

ソリューション:

カードのポイント:

 

C ++コード:

#pragma GCC最適化( "Ofast")
の#pragma GCCの最適化( "ループをアンロール")
の#pragma GCC対象( "SSE、SSE2、SSE3、SSSE3、SSE4、POPCNT、ABM、MMX、AVX、曲=ネイティブ") 含む<アルゴリズム> 
の#include <ランダム> 
の#include <cstdioを> 
する#include <cstdlib> 
の#include <CTIME> 
の#define MAXN 1010 
の#define長い
CONST長い二EPS = 1E-8。
インライン長い二重ABS(長いダブルX){x <0の戻り?-x:X; } 

構造体ポイント{ 
	int型X、Y。
	ISR BOOL; 
	長いダブルB; 
	ポイント(){} 
	ポイント(INT __X、INT __y、BOOL __isR):X(__ X)、Y(__ Y)、ISR(__ ISR)、B(__ X){} 
	インラインブール演算子==(constのポイント&
	} 
インライン長いダブルスロープ(CONSTポイント&LHS、CONSTポイント&RHS){ 
	リターン(lhs.y - rhs.y)/ static_castを<長い二>(lhs.x - rhs.x)。
} 
インラインブールCMP(INT A、INT B){Pを返す[A] .B <P [B] .B。} 
インラインINT記号(長いダブルX){X <-EPS戻り?-1:X> EPS; } 

のstd :: MT19937 RD(時間(0))。
int型nは、totR、totB。
INT R [MAXN]、B [MAXN]、RNK [MAXN]。
int型ANS; 

ボイドCALC(){ 
	STD ::ソート(RNK + 1、RNK + N + 1、CMP)。
	{(; L <= N L = R INT 1 = 1、R、CNT [2]、RESの= 0)ため
		、R = L。
		CNT [0] = CNT [1] = 0; 
		一方、(R <= N && P [RNK [L]] == P [RNK [R])
			++ CNT [P [RNK [R] ISR。]、++ R。
		RES + = CNT [1]。
		ANS =のstd :: MAX(ANS、RES);
		IF(CNT [0])RES = CNT [1]。
} 
ボイドは(){解決
	totR INT __B = RD()%totB、__R = RD()%と、
	点_R = P [R [__ R]、_B = P [B [__ B]。
	もし(_R.x == _B.x)リターン。
	CONST長い二重K =勾配(_R、_B)、B = _R.y - _R.x * K。
	以下のために(; iは= N <; I = 1のとき、INTレジスタ++ I)P [i]は.B = P [i]は.Y - P [i]は.X * K。
	長い二分= 1E20、最大= -1e20。
	用(INT * I = B; I = B + totB; ++ I!){ 
		int型__s =記号(P [* I] .B - B)。
		IF(__s){ 
			IF(__s == 1)分= STD ::分(分、P [* I] .B)。
			他に最大=のstd :: MAX(最大、P [* I] .B)。
		} 
	} 
	int型RESM = 1、RESM = 1。
	{(!; I = R + totR ++ I INT * I = R)のために
		INT __s =記号(P [* I] .B - B)。
		IF(__s){ 
			IF(__s == 1)RESM + =(P [* I] .B <=分+ EPS)。
			他のRESM + =(P [* i]は.B> =最大- EPS)。
		} 
	} 
	ANS = STD :: MAX(ANS、STD :: MAX(RESM、RESM))。
} 

int型のmain(){ 
	scanf関数( "%のD"、&N); 
	(I = 1、X、Y int型I ++; iが<= N)のために{ 
		静的チャーCH。
		scanf関数( "%D%D%1"、&X&Y、&CH)。
		P [I] =点(x、y、CH == 'R'); 
		RNK [I] = I。
		IF(CH == 'R')R [totR ++] = I。
		他のB [totB ++] = I; 
	} 
	IF(totB == 0 || totR == 0){ 
		のprintf( "%Dを\ n"、totR)。
		0を返します。
	} 
	CALC()。
	(真){ながら
		ため(INT i = 1; iが= 10 <。
		もし(クロック()/はstatic_cast <ダブル>(CLOCKS_PER_SEC)> 0.998)破ります。
	} 
	のprintf( "%d個の\ n"、ANS)。
	0を返します。
}

  

おすすめ

転載: www.cnblogs.com/Memory-of-winter/p/11402347.html