間桐慎二是間桐家著名的廢柴,有一天,他在學校隨機了一組隨機數列, 準
備使用他那強大的人工智慧求出其最長上公升子串行,但是天有不測風雲,人有旦
夕禍福,柳洞一成路過時把間桐慎二的水杯打翻了……
現在給你乙個長度為 n 的整數序列,其中有一些數已經模糊不清了,現在請
你任意確定這些整數的值,使得最長上公升子串行最長(為何最長呢?因為間桐慎
二向來對自己的人品很有信心) 。
第一行乙個正整數 n。
接下來 n 行,第 i 行若為「k x」 ,則表示第 i 個數可以辨認且這個數為 x;
若為「n」 ,則表示第i 個數已經辨認不清了。
第一行乙個整數,表示最長的最長上公升子串行長度。
4k 1
nk 2
k 33
對於100%的資料,n ≤ 100000,|x| ≤ 10^9
傳送門orz yzh dalao~
n是不確定元素,
考慮n怎麼去用,假如對於乙個最長的上公升序列,它不包含某乙個n,
那麼完全可以去掉某個位置上的數,然後用這個n去代替的;
所以可以看作所有'n'都用上了。
接著考慮:比如1,n,3,顯然我們會令n=2;
比如1,n,n,4,顯然會讓序列變成1,2,3,4;
那如果是1,n,n,3呢?最長上公升序列長度就只有3了。
推廣一下這個小思路,假如是x,p個n,y,假設y>x
那麼當y-x>p的時候,我們很容易想到序列變成了x,x+1,x+2,……y
那麼如果y-x=w<=p呢?那麼這個最長上公升的序列長度就不是p+2了,而是w+1了;
可以看作,x=y-p,只要把y減掉'n'的個數,就可以直接比較x和y了,
也就是……
對於第i個數,假設前面出現了p個n,那麼第i個數減去p;
然後求出這個構造出的序列的lis,再加上所有'n'的個數(『n』全取)就是答案。
為什麼是對的呢……就看上面說的一點內容吧……
大致總結證明一下:
如果新序列裡能夠繼續滿足上公升的,那麼中間所有的'n'即可取;
之前已經說過,最優解裡肯定所有'n'都取了;
所以只要求新序列的最長上公升子串行即可。
lis二分總是要打錯很煩躁……
#includeusing namespace std;
const int
n=100005;
int n,p,b[n],a[n];
void bs(int x)
b[l]=x;
}int lis(int maxn)
int main()
printf("%d\n",lis(m)+t);
return 0;
}
BZOJ4282 慎二的隨機數列
省選前刷水記錄 構造 很顯然我們要讓那些未知的都加入最終答案 這樣子答案才最大 然後就很簡單了。很奇怪的是本地int main 不加int不會報錯 oj上會ce include include include using namespace std define ll long long int c...
BZOJ4282 慎二的隨機數列
首先在開頭加上 inf,結尾加上inf,最後答案減2即可。設s i 為i之前未知的個數,f i 為以i結尾的lis,且a i 已知,那麼 f i max f j min s i s j a i a j 1 1,其中j將min分類討論後可轉化為三維偏序,cdq分治 掃瞄線 樹狀陣列即可,時間複雜度 o...
BZOJ 4282 慎二的隨機數列 動態規劃
顯然隨機的數全部屬於上公升序列肯定能構造出最優解,那麼直接認為隨機的數都在最優解中。如果是求最長不上公升子串行的話就直接去掉所有的隨機數求一遍然後加上隨機數的個數。現在是讓求最長上公升子串行,只需把每個數都減去前面隨機的數的個數然後求一遍再加上隨機數的個數即為答案!include include i...