HZOI20190813 B、(デューティ)のいずれか

質問に直面している::魔法のページに移動https://www.cnblogs.com/Juve/articles/11352426.html

私はO(NMQ)70を破ったことを聞きました

それは明らかであるブロガーだけで50分

テストサイト:プレフィックスと統合されたアプリケーション

スカラー演算子は:図リングのポイントを通信ブロック=の数が含まれていない - 辺の数、二次元の接頭辞および前処理、O(1)の矩形領域内の点と辺の数を見つけること。

アルゴリズムを記述するための良い70分:お問い合わせの数を求めて各グループの暴力的な通信ブロックの複雑さはO(NMQ)であり、人々はそれが診察室での最初の7つのテストポイント、ほとんどのプレイヤーの適度なレベルを通して問題になることができると思います。最善の戦略は、3番目の質問の思考のための時間を確保するために70分間、このアルゴリズムを使用することです。

3,4,5,6他の模擬試験のポイント:標準の使用と同じラインを数えるが、解決しやすいよう、接頭辞と2次元を必要としません。

8,9のテストポイントの目的は一定であることは選手たちの世話をすると選手の小さな配列を開くには大きすぎます。

この問題は、実際にグランドコンテストC 015 AtCoder問題であり、そこにすぐに元の質問とは、この問題のハイスコアを取得するので、いくつかの選手がやったかもしれないが、あまり期待しないでください

ソリューションLiu_rundaの公式タイトル

実際には、あなたは、すべての長方形の中黒点の数 - すべての黒の間の点を接続するエッジの数に等しい中国聯通の長方形のブロックの数をと遊ぶためのサンプルの手を見つけるだろう

メンテナンス三プレフィックスは、それぞれ、黒点の数が存在し、ライン上の辺の数は、カラム上のエッジの数はそうO(1)クエリとすることができます

書式#include <iostreamの> 
の#include <cstdioを> 
する#include <CStringの> 
の#include <cmath> 
の#include <スタック> 
の#include <キュー> 
の#define再登録
の#define MAXN 2005 
名前空間stdを使用。
INTのN、M、Q、マップを表示する[MAXN] [MAXN]。
INT合計は[MAXN] [MAXN]、sumh [MAXN] [MAXN]、suml [MAXN] [MAXN]。
INT DX [2] = { - 1,0}、DY [2] = {0、-1}、H [MAXN] [MAXN]、L [MAXN] [MAXN]。
チャーCH [MAXN]。
メイン(){署名付き
	のscanf( "%D%D%D"、&N、&M&Q)を。
	以下のために{(INT i = 1; iが++; iが<= N)
		(+ 1 CH、 "%sの")のscanf。
		用(INTのJ = 1; J <= Mであり、j ++){ 
			マップを表示する[I] [J] = CH [J] - '0'。
			和[I] [J] =和[I-1]〜[J] +和[I]、[J-1] -sum [I-1] [J-1] +マップを表示する[I] [J]。
		{(J ++; J <= M INT J = 1)のための
		INT RES1 =和[EX] [EY] -sum [SX-1] [EY] -sum [EX] [SY-1] +和[SX-1] [SY-1]。
			IF(マップを表示する[I] [J] == 0)続けます。
			用(int型のk = 0; kは<= 1; ++ K){ 
				int型のpは=私はDX [K]、Q = J + 1 DY [k]を+。
				IF(マップを表示する[P] [Q] == 0)続けます。
				もし(K == 0)H [P] [Q] ++; 
				他L [P] [Q] ++; 
			} 
		} 
	} 
	{(; iが<= N I ++は、I = 1 INT)のため
		のために(INT J = 1; J <= Mであり、j ++){ 
			sumh [I] [J] = sumh [I-1]〜[J] + sumh [I]、[J-1] -sumh [I-1] [J-1] + H [i]は[J]。
			suml [I] [J] = suml [I-1]〜[J] + suml [I]、[J-1] -suml [I-1] [J-1] + L [I] [J]; //内部边数的前缀和(行与列)
		} 
	} 
	(i = 1、SX、SY、EX、EY int型、iは<= Q; iは++)のために{ 
		scanf関数( "%D%D%D%D"、およびSX 、&​​SY、&EX、EY&); 
		INT RES2 = suml [EY-1] -suml [X-1] [EY-1] -suml [から] [SY-1] + suml [X-1] [SY-1] [から]。
		RES3 sumh INT = [ON-1]〜[キー] -sumh [X-1] [キー] -sumh [ON-1]〜[SY-1] + sumh [X-1] [SY-1]。
		int型ANS = RES1-RES2、RES3。
		printf( "%d個の\ n"、ANS)。
	} 
	0を返します。
}

 

おすすめ

転載: www.cnblogs.com/Juve/p/11352508.html