bzoj 4059: [Cerc2012]Non-boring sequences
題意
一個序列被稱為是不無聊的,僅當它的每個連續子序列存在一個獨一無二的數字,即每個子序列裡至少存在一個數字只出現一次。給定一個整數序列,請你判斷它是不是不無聊的。
題解
首先,一個很顯然的做法就是 對於每一個位置i,我們可以知道他作為獨一無二的值的區間有什麼 這個預處理上一個,下一個和他一樣的就可以了 然後就相當於這一段區間都是合法的 如果[l,r]看作一個點,明顯地,他可以覆蓋一個矩形 那麼就變成矩形面積並了 看一下是否覆蓋所有合法區間即可
但是這樣做這題就太沒有意思了。。
於是就有一個很好玩的做法 就是對於一個區間[l,r] 如果他的一個位置p,是獨一無二的,那麼我們顯然可以遞迴[l,p−1],[p+1,r] 至於p怎麼找,你可以從序列的兩頭掃兩個指標 如果有一個符合就結束遞迴 複雜度的話,你會發現,形式是這樣的T(n)=T(k)+T(n−k)+min(k,n−k) 容易發現,這東西就是啟發式合併,因此複雜度也是nlogn的 無論從程式碼上還是從常數上都比第一個做法小得多
相關推薦
bzoj 4059: [Cerc2012]Non-boring sequences
題意 一個序列被稱為是不無聊的,僅當它的每個連續子序列存在一個獨一無二的數字,即每個子序列裡至少存在一個數字只出現一次。給定一個整數序列,請你判斷它是不是不無聊的。 題解 首先,一個很顯然的做法就是 對
【bzoj 4059】Non-boring sequences(分治+啟發式分裂)
傳送門biu~ 我們可以把相同的數字用雙向連結串列串起來,pre[x]為x位置之前第一個和x位置數字相同的位置,nexxnexx為xx位置之後第一個和xx位置數字相同的位置。對於區間[l,r][l,r
bzoj4059 [Cerc2012]Non-boring sequences
分治 過程 == break 掃描線 sequence 合並 algo 檢驗 根本不會。。。 似乎有很高妙的分治做法啊!https://www.cnblogs.com/forever97/p/bzoj4059.html 就是說,如果當前區間為[l,r],有一個i滿足pr
[Cerc2012]Non-boring sequences
Description 定義一個序列是不無聊的,當且僅當它的所有子區間都存在一個獨一無二的數字,即每個子區間裡至少存在一個數字只出現過一次。給定一個長度為\(N(N\leq2\times 10^5)\)的序列,請判斷它是不是無聊的。 Solution 對於每個位置\(i\),先求出\(pre[i],nx
UVA 1608 Non-boring sequences (分冶+遞歸)
iostream col 容易 不存在 ons mage 搜索 pos 子序列 一、題目概述 二、題目釋義 要求序列s的所有子序列,若所有這些子序列中均存在一個自己序列內是唯一的數,則稱這個序列s是不無聊的 三、思路分析 從序列s開始考慮,序列s的整個長度為n,若序列s中
●UVA 1608 Non-boring sequences
and bsp auth IT include ide 表示 bool targe 題鏈: https://vjudge.net/problem/UVA-1608#author=chenchonghan題解: 分治 如果一個區間[l,r]裏面在p位置出現了一個只出現一次
uva1608 Non-boring sequences
nlogn break 序列 lse uva next 復雜度 pri span 某個序列找到唯一元素後,判斷被分成的兩邊的序列即可問題在於找到唯一元素連續序列,重復元素的問題;感覺很有一般性 查找相同元素用map,last,next存上一個相同元素的位置復雜度計算有點思
1608 Non-boring sequences
#include<cstdio> #include<map> using namespace std; const int maxn = 200000 + 5
Uva1608 Non-boring sequences 【分治+中途相遇】【例題8-16】
題意:給一個序列,如果此序列中的任意子序列中至少尋找一個唯一的值就說明此序列為不無聊序列,否則為無聊序列。注意,任意子序列即所有的子序列都滿足才行! 思路:依然是參考了紫書+程式碼庫! (1)預處理:分別從左邊和右邊來一遍,從左邊掃,當沒有出現重複值時,當前位置都賦值為-
【高效演算法設計——遞迴】 UVa 1608 Non-boring sequences
題意:給定一段序列,如果這段序列的任意連續子序列中至少存在一個數唯一,那麼這段序列就是Non-boring,否則就是boring,判定這段序列是否boring 思路:如果一個數A[x]是全場唯一,那麼我們只需判斷A[1]~A[x-1] 和A[x+1]~A[n]是否滿足要求
[分治] UVa1608 Non-boring sequences 不無聊序列 (分治與中途相遇法的結合)
題目 思路 1.主要思路:如果有一個只出現一次的元素A[p],那麼所有包含此元素的所有連續子序列都滿足不無聊。那麼只需分治判斷A[0~p-1]和A[p+1~n]是否不無聊即可。 2.分治方向的選擇:(上界分析) 從左往右找:最壞情況是唯一元素恰好在
Non-boring sequences(折半遞迴。。暫且這麼叫吧)
該題給一個序列,讓我們判斷是不是不無聊序列(如果不明白請看樣例), 我們可以將區間從大到小不斷壓縮來確定答案,首先要確定一個區間是否滿足要求,只要看這個區間裡是不是有一個只出現一次的數,受前面《唯一的雪花》一題的啟發,我們可以在O(n)時間內求出當前數離他最近的與他相同的數
UVA1608 【Non-boring sequences】
思路: 此題一個字: 難 不囉嗦了,來講該講的。 讀入 T T T、
UVA - 1608 Non-boring sequences(分治法)
name 表示 urn its mes else pac 學習 tro 題目: 如果一個序列的任意連續的子序列中至少有一個只出現一次的元素,則稱這個序列是不無聊的。輸入一個n(n≤200000)個元素的序列A(各個元素均為109以內的非負整數),判斷它是不是不無聊的。 思路
BZOJ 4057: [Cerc2012]Kingdoms
kingdom %d amp brush n) cst sin std light 狀壓DP #include<cstdio> #include<cstring> using namespace std; int F[1200005],A
BZOJ P4057 [CERC2012] Kingdoms【狀態壓縮】
#include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #defin
【BZOJ 4059】 (分治暴力|掃描線+線段樹)
【分析】 這題我是不會往掃描線方向想的。感覺很神奇。 首先對於每個a[i]求前一個同色的位置$last$和後一個的位置$next$,顯然左端點在[last+1,i]右端點在[i,next-1]的都是可以的。 那麼把左端點當成x,右端點當成y,區間就表示成了平面上的一個點,可行區間集就是一個矩形
bzoj 2986 Non-Squarefree Numbers 容斥原理+數學
代碼 bre define com amp check href break www. 題面 題目傳送門 解法 顯然可以二分答案 計算的時候用容斥原理即可 用莫比烏斯函數實現這個過程即可 代碼 #include <bits/stdc++.h> #define L
【馬拉車】Gym 101864J - Non Super Boring Substring
題目連結<http://codeforces.com/gym/101864/attachments> 題意: 給出一個字串,求出不包含迴文長度大於等於k的子串的個數。 題解: 我是先計算不符合條件的數目,然後用總的減去。 先直接一遍馬拉車,求出所有的迴文半
2018 BACS High School Programing Contest J.Non Super Boring Substring-manacher+雙指標
題意: 給出一個字串,求其子串中不包含長度大於等於k的迴文串的子串個數 思路: 對於單串迴文問題,考慮使用manacher演算法進行預處理,即可處理出以每個位置為中點的最長迴文半徑 使用雙指標技術,結合迴文半徑的資訊,處理出以每個位置為起點,在不構成大於等於