UVa1608 不無聊的數列

2021-09-11 20:02:48 字數 919 閱讀 2826

題意:乙個長度為n序列,如果這個任意連續子串行的中都有至少有乙個只出現一次的元素,那麼就稱這個序列是不無聊的,判斷這個序列是不是無聊的。

思路:分治

先將整個序列掃瞄一遍,找到只出現一次的元素,如果沒有,則這個序列是無聊的。如果找到了a[k],那麼只需要檢查[l, k-1] 和 [k+1, r]。

關鍵是如何找到這個唯一的元素:事先算出每個元素左邊和右邊最近的相同元素的位置,這樣就可以在o(1)時間內判斷在任意乙個連續子串行中,某個元素是不是唯一。

但是還需要思考怎麼找,從左往右?從右往左?

這兩種辦法在最壞情況下(唯一元素在末尾或開頭),查詢複雜度都是o(n),總複雜度為o(n^2)。

可以從兩邊向中間找,這樣查詢複雜度為o(n/2),隨之總複雜度o(nlogn).

可能t比較大,memset會超時。

#include #include #include #include using namespace std; 

#define se second

const int n = 2e5+5;

int left[n], right[n], a[n];

bool judge(int l, int r)

return false;

}int main()

else left[i] = -1;

mp[a[i]] = i;

} mp.clear();

for(int i = n - 1; i >= 0; --i)

else right[i] = n+1;

mp[a[i]] = i;

} if(judge(0,n-1)) printf("non-");

printf("boring\n"); }

return 0;

}

UVA1608 不無聊的序列(分治,中途相遇)

如果乙個序列裡沒有只出現一次的元素,那麼這個序列顯然是無聊的。如果乙個序列裡有乙個出現一次的元素a k 那麼對於這個序列無聊或不無聊的判斷,只需判斷 1,k 1 和 k 1,n 是不是無聊的。所以就可以遞迴下去,那麼我們現在的問題就變為如何找到乙個只出現一次的元素。預處理好每個數的前驅,後繼,掃一遍...

UVA 1608 啟發式分治

題目大意 給乙個序列,問這個序列無不無聊,不無聊序列的定義是任意的連續序列中都能找到乙個只出現過一次的數字 題目思路 首先給乙個序列,這個序列中滿足有乙個只出現過一次的數字,那麼,在這個序列中,所有跨過這個數字的區間一定都是不無聊的,所以想出現無聊的數字一定得在兩邊找,那麼就可以想到利用分治。然後使...

uva 1608 分治 中途相遇法

參考紫書,利用stl map,找到陣列中相同元素的關係。每找到乙個所求範圍唯一元素,對元素所在的範圍進行分治。注意 不能用prev和next作陣列名會使juge無法判斷 include includeusing namespace std const int maxn 200000 5 int nu...