http://poj.org/problem?id=3657
中国語版の下では、英語が直接見たくないこちらをクリックして、問題の中国語版を参照してください
説明
常に彼らの知性についての劣等感を持っている牛は、自分の脳をシャープにするための新たな推測ゲームを持っています。
指定された「ヘイ牛」は納屋の後ろに隠して作成 N (1≤ N 1,000,000≤)一意サイズのスタックが(便宜1 ..番号Nを)干し草俵の、干し草の1..1,000,000,000ベール各。
他の牛が、その後ヘイ牛に一連の尋ねる Qを (1つの≤ Q ≤25,000)スタックについての質問、すべて同じ形状を有します。
スタック番号の範囲内の任意のスタックのベールの最小数は何ですか Qの L .. Q H (1つの≤ Qの L個の ≤の N 、 Q 、Lの ≤の Qの時間 ≤の N )?ヘイ牛は、単一の整数でこれらのクエリの各々に応答 A 、その真実性は保証されません。
ヘイ牛によって与えられた答えは自己矛盾している場合、または特定の回答が他に矛盾する場合は、他の牛が決定するのを助けます。
入力
* 1行目:二スペース区切りの整数: N 及び Q
*行2 .. Q +1:各行は単一のクエリおよびその応答を表す3つのスペースで区切られた整数含有 のQ L、 QがH、及び Aを
出力
* 1行目:回答間に不整合がない場合は、単一の整数0を出力します(つまり、すべてのQクエリと一致干し草スタックの有効な実現が存在する場合)。そうでなければ、答えはその前のクエリに対する答えと矛盾している最古のクエリの1..Qからインデックスを印刷します。
サンプル入力
20 4 1 10 7 5 19 7 3 12 8 11 15 12
サンプル出力
3
説明
スタック1..10でベールの最小数は、スタック5..19でベールの最小数はスタック3..12でベールの最小数は8であり、スタック内のベールの最小数、7、7 11..15は12である
クエリ3(「3〜12 8」)が前のものと矛盾している最初のものです。クエリ1と2とすべての干し草スタックは俵の明確な数を持っているという事実から、我々はスタック5..10の一つがまさに7俵を含まなければならないことを推測します。しかし、このスタックは、クエリ3への答えと矛盾します。
中国語バージョン
質問の意味:
Nの長さに、各位置の数は、異なる配列が[1..nの]及びQ及びQは、Qが与えられた間隔、最小間隔であり、最初のいくつかのセクションでは、矛盾を取得します
アイデア:
1. +バイナリツリーライン(後充填されていないピット)
2.二分+互いに素なセット(染色用互いに素なセット間隔)//互いに素なセット古典的使用 - 染色切片を、そう互いに素なセットのメンテナンスを使用
私たちは牛の牛間違った答えの前に知りたい場合はまず、それを行う方法ではないでしょうか?
降順で行への応答。いくつかの矛盾する方法があります。
- 間隔が完全にフロントセクションが含まれているの背後にある場合、それは間違っています
- 2つの互いに素な間隔がある場合、Aは同じであり、これは間違っている(被写体乾草番号のどの2つの山が同じでないことを保証するために)
Aは現在の中間の半分以下であるとき、同じ撮影間隔を注意してください
以下の質問は、一部のソリューションを参照してください。https://blog.csdn.net/wang2147483647/article/details/60142150
2つの間隔のために各位置の一意の数が、[L、R]が最小値aであるので、[L、R]は最小値Aです。
間隔は[L、R]間隔である場合は、[L、R]は完全に含まれ、<A、および矛盾の矛盾が存在し、この時点でユニークです。
二分法は、TOTの尋問が正当なものである--- 1で決定し、Qを問い合わせることができます。各2つのタイムシェアリング、1〜質問---(だけ間隔が小数が判断多数を含む区間であるか否かを決定した後、優先処理多数)の最小値に従って降順TOT。
競合が存在する場合、それぞれ固有の番号、最小間隔のそれぞれについて同じなので、半分を続け、交差が空であるか大きい最小時間間隔であるか否かを判定する。
競合があるしない場合は、組合染色は(あるならない交差点ここ間隔未染色間隔場合、このような判断の矛盾、より大きな最小間隔における交差点(最小降順、大きい最小値すべてのセクションは、未染色の間隔が存在しない、この間隔の、最小大きい間隔))で染色されています。
それは互いに素設定処理染色することができるように、セグメントツリー、最適化タイムアウトを染色しない場合:染色された場合、一部の区間[L、R]の場合、次いで、FA [R] = L-1(Lはない、なぜならせLはまた、[L、R&LT]を表すデータ121と122)として、ポイントを染色し、染色の全ての数は、(直接ジャンプすることができ、親の各点について、後部から前方を見ていますこの間隔は)全ての染色されたときにLあれば、それが決定されるので、ノードは、>検索(R)は間隔がない点未染色であることを示しています。
コードは以下の通りであります:
1の#include <stdio.hの> 2の#include < ストリング・H> 3の#include <iostreamの> 4の#include < ストリング > 5の#include <math.h>の 6の#include <アルゴリズム> 7の#include <キュー> 8#含む< セット > 9 のconst int型 INF = 0x3f3f3f3f 。 10 使って 名前空間はstdを、 11 の#define MAXN 1000010 12 13 構造体ノード{ 14 のint L。 15 INTR; 16 のint NUM; 17 }。 18 19 INT N、Q。 20 INT FA [MAXN]。 21 ノード[MAXN]。 22 ノードTMP [MAXN]。 23 24 int型の検索(INT X) 25 { 26 リターン X == FA [x]はx:FA [X] = 検索(FA [X])。 27 } 28 29 ブールCMP(ノードA、ノードB) 30 { 31 リターン a.num> b.num。 32 } 33 34 ブール裁判官(INTTOT) 35 { 36 のための(int型 I = 1を iが<= N; iが++ ) 37 のFA [I] = I。 38 のためには、(int型 I = 1 ; I <= TOT; I ++ ) 39 TMP [I] = [I]。 40 ソート(TMP + 1、TMP + 1回の + TOT、CMP)。 41 のためには、(int型 i = 1、jは、I <= TOT; I = J + 1 ) 42 { 43 J = I。 44 int型 L = TMP [I] .L。 45 INT R = TMP [I] .R。 46 int型 L = TMP [I] .L。 47 INT R = TMP [I] .R。 48 一方(J <TOT && TMP [J] .num == TMP [J + 1 ] .num) 49 { 50 J ++ 。 51 = MAX(L、TMP [J] .L)L。// 取交集 52 、R = 分(R、TMP [J] .R)。 53 =分(L、TMP [J] .L)L。// 取并集 54 R = MAX(R、TMP [J] .R)。 55 } 56 場合(L> R || L>(r)を見つける。)//空のまたは未染色の点 57がなく 返す 0 ; 58 ながら(L <= R&LT) 59 { 60 IF(検索(R&LT)== R&LT) 61れる { 62である FA [R&LT]検索(L- = 1。); // 染色 63で r--のは; 64 } 65 他の 66 R&LT FA = [R&LT]; // 親ノードに直接ジャンプ 67 } 68 } 69 リターン 1。; 70 } 71である 72 INTmain()の 73 { 74 のscanf(" %D%dの"、&N、&Q)。 75 のために(int型 I = 1 ; I <= Q; iが++ ) 76 { 77 のscanf(" %D%D%D "、および[I] .L、&[I] .R&[I] .num) ; 78 } 79 のint L = 1 。 80 INT R = Q。 81 INT ANS = 0 。 82 一方(L <= R) 83 { 84 INT半ば=(L + R)/ 2 。 85 であれば(裁判官(MID)) 86 L =ミッド+ 1 。 87 他の 88 { 89 ANS = ミッド; 90 R =半ば1 。 91 } 92 } 93 のprintf(" %d個の\ n " 、ANS)。 94 リターン 0 ; 95 }