HZOJ Lianliankanの

ちょうどかどうかで達成することができないと感じ改ざんのない状態で、検査室は、ほぼ正の解をと思うが、私は一度にあまりにも深刻かわからない......

最後の戦いは、Dage社が言っているように見えるO(4 * 15 * nの*の M)、 証拠の複雑さは、とにかく、それは...... T暴力的になることはありません


 

ソリューション:

ボックスは、x *(X-1)/ 2への寄与次に、xの疲れて表示される場合ユニコムBFSそれぞれブロック0、ブロックエッジユニコム:テストポイント8,9,10のために。隣接する同一の寄与ユニコムブロックの両方削除注意。これらのテストポイントの性質のために、答えが正しいことを考え出しました。

一般の場合に拡張、上記の結論は完全には適用されません。

結論上記の考察は、2つのブロックが包含および除外を考慮すると、再びカウントされるリンクブロック0の複数に属している場合、間違っているものであろう。(考えられないので、検査室の適切な実装の複雑さは、ここで停止します)

各ブロック番号0を考慮するユニコムは、便宜上、同一のブロックは0ユニコムがある2つの隣接するブロックとの間に設けられています。

0は、それぞれ第一BFSユニコムブロック複雑度の$ O(nm)の非ゼロに属する$点について得られます。

ブロックのタイプごとに、F1 [i]はリンクI、F 2内のブロックの数を表し得るために[I] [j]はiで表され、Jは、数、F3は[] [] []、F4(他のがあってもよいです) [] [] [] []と同様。

そして、あなたもキー・ジア統計答えをカットすることができます。

しかし、アレイとそれはとても大きく、Hash_mapを考慮することはできません。

ハッシュ構造は非常に良いGETではないので、私はマップを使用し、理解しやすいので、コードの複雑さも低くなっています。

したがって、次のコードカードを容易に一定にすることができます。

#include <アルゴリズム> 
の#include <iostreamの> 
する#include <CStringの> 
する#include <cstdioを> 
する#include <キュー> 
の#include <地図> 
の#define INT LL 
の#defineペア対<整数、整数> 
の#define FIR最初
の#define秒第二
の#define MP(B)make_pair(B)
の#define LLは長い長
の#define S1(AA <BA)
の#define S2(AB <BB)
の#define S3(AC <BC)
の#define S4(AD < BD)
の#define S5(AS <BS)
の#define D1(AA == BA)
の#define D2(AB ==のBB)
の#define D3(AC == BC)
の#define D4(広告== BD)
の#define D5( ==のBS)として
名前空間stdを使用。
構造体ノード1 {、S int型;(ノード1のB、ノード1)友人のブール演算子を<{D1 S5返す:S1;}}。
構造体NODE2 {A、B、S INT;(NODE2のB NODE2)フレンドブール演算子<{戻りD1(D2 S5:S2?):S1;}}。
構造体ノード3 {A、B、C INT、S;フレンドブール演算子<(ノード3 A、ノード3 B){戻りD1(D2(D3 S5:S3):S2?):S1;}}。
構造体ノード4、{A、B、C、D、S int型;(ノード4のB、ノード4)友人のブール演算子を<{戻りD1(D2(D3(D4 S5:S4):S3):S2???):S1? ;}}。
マップ<ノード1、INT> MP1。
マップ<node2で、int型> MP2; 
マップ<ノード3、INT> mp3。
マップ<ノード4、int型>のMP4; 
N INT、M、K、MP [1010] [1010]。
int型ベル[1010] [1010]、CNT; 
[1000010] Tをint型。
ブールV [1010] [1010]。
IX [5] = {0,1、-1,0、0} int型。
INT IY [5] = {0,0、0,1、-1}。
ベクター<整数>こと[1010] [1010]。

ブール値(int型のx、int型のY、int型SOR){戻りX> 0 && X <= N && Y> 0 && Y <= M &&であります
BOOL OK(int型のx、int型のY){戻りX> 0 && X <= N && Y> 0 && Y <= M && MP [X] [Y] == 0;} 
ボイドBFS(INT NX、INT NY)
{ 
	ベル[NX] [NY] = CNT。
	キュー<ペア> Q; q.push(MP(NX、NY))。
	(!q.empty())、一方
	{ 
		。。INT X = q.front()モミ、Y = q.front()秒; q.pop()。
		以下のために(; 4 = iは<; I = 1 int型私は++)
		{	 
			int型TX = X + IX [i]は、TY = Yを+ IY [I]。
			(もし!OK(TX、TY)&&ベル[TX] [TY])q.push(MP(TX、TY))、ベル[TX] [TY] = CNT; 
			そうであれば(TX> 0 && TX <= N && TY> 0 && TY <= M && MP [TX] [TY])である[TX] [TY] .push_back(CNT)。
		} 
	} 
} 
()主符号付き 
{ 
// freopenは( "ex_link3.in"、 "R"、STDIN)。
// freopenは( "in.txt"、 "R"、STDIN)。
// freopenは( "1.out"、 "W"、STDOUT)。
	
	CIN >> N >> M >> K。
	
	以下のために(; iがn = <I ++ iは1 = INT)
		のための(J ++ INT J = 1; J <= M) 
		(!MP [I] [J] &&ベル[I] [J])であれば++ CNT、BFS(i、j)は、
	ための式(I ++; iは= N <I = 1 INT)
		のための(INT J = 1; J <= Mであり、j ++)
		{ 
			IF(MP [I]、[J]を&&(I + 1、J、融点である[I] [J]))である[I] [J] .push_back(++ CNT)、[I + 1] [j]は.push_back(CNT)です。
			(MP [I] [J] &&である(I、J + 1、MP [I] [J]))であれば、[I] [J] .push_back(++ CNT)であり、[I]、[J + 1]であります.push_back(CNT)。
		} 
		
	(i = 1 int型I ++; iが<= N)用
		のための(INT J = 1; J <= Mであり、j ++)
		{ 
			ソート(BE [I] [J] .begin()、である[I] [J ]。終わり()); 
			INT、T =一意(BE [I] [J] .begin()、である[I] [J] .END()) -する[I] [J]。
			一方、(BE [I] [J] .size()> T)である[I] [J] .pop_back()。
		} 
	
	ため(INT I = 1; I ++; iが= N <)
		のための(J ++ INT J = 1; J <= M)
		(MP [I] [J])の場合
		{ 
			ソート([I] [J]です。開始()、([I] [J] .ENDです))。
			IF(SIZ> = 1){(int型のk = 0; <SIZ k個; ++ k)に対するMP1 [I] [J] [K] {こと(ノード1)を、MP [I] [J]}] ++; } 
			{(int型のk = 0 kは++; kは<SIZ)のための(> = 2 SIZ)場合のため(int型L = K + 1、L <SIZ; L ++)MP2 [(ノード2){である[I] [J] [k]は、である[I] [J] [L]、MP [I] [J]}] ++;} 
			もし(SIZ> = 3){ための(int型のk = 0; K <SIZあり、k ++)のために(int型L = K + 1、L ++; L <SIZ)のための(INT R = L + 1; R <SIZ; R ++)
				mp3 [(ノード3){である[I] [J] [K]である[I] [J] [L]、[I] [J] [R]であり、MP [I] [J]}] ++;} 
			(SIZ> = 4){MP4場合[(ノード4){である[I] [ J] [0]である[I] [J] [1]、である[I] [J] [2]、である[I] [J] [3]、MP [I] [J]}] ++ ;} 
		} 
	マップ<ノード1、整数> ::イテレータIT1。
	マップ<ノード2、整数> ::イテレータIT2。
	マップ<ノード3、整数> ::イテレータIT3。
	マップ<ノード4、整数> ::イテレータIT4。
	LL ANS = 0。
	用(IT1 = mp1.begin();!IT1 = mp1.end(); IT1 ++)ANS + = it1->第二*(it1->第-1)/ 2。
	用(IT2 = mp2.begin();!IT2 = mp2.end(); IT2 ++)ans- = it2->第二*(it2->第-1)/ 2。
	用(IT3 = mp3.begin();!IT3 = mp3.end(); IT3 ++)ANS + = it3->第二*(it3->第-1)/ 2。
	用(IT4 = mp4.begin();!IT4 = mp4.end(); IT4 ++)ans- = it4->第二*(it4->第-1)/ 2。
	printf( "%LLDする\ n"、ANS)。
}
	

 

おすすめ

転載: www.cnblogs.com/Al-Ca/p/11695334.html