p1870長為m的字典序最大不下降子串行

2022-03-29 18:43:22 字數 1210 閱讀 9059

首先理解題意。一句話翻譯就是:給出長為m的數列求長為n的字典序最大不下降子串行。

看到只有兩個人過,看似很難,實際上。。確實很難,從夏天見到的這個題就開始想並得到了乙個錯誤演算法,想了好長時間。

首先二分求lis應該都會吧。首先處理出以每個點為起點的最長不下降序列長度len,考慮對於第i個元素我們要找的是哪個呢?應該是當前 值大於等於第i-1個元素 且 位置位於第i-1個元素之後 且 len大於等於n-i的那個數字。如果有同樣大的元素應該取最靠前的那個。

這樣兩個貪心策略就有了。可以先寫結構體把元素按len排序,然後寫乙個堆:每次把len符合要求的全部放進去,由於是有序的,這個操作很快。然後把不符合要求的扔掉,最後留下來的堆頂一定是需要的元素,更新一下狀態輸出即可。

int

i,j,k,now;

int a[100010],c[100010

],len;

intn,m;

priority_queue

int,int> >o;

struct

node

shu[

140000

];inline

bool

orz(node xx,node yy)

return xx.len>yy.len;

}inline

int ask(int

x)

returnl;}

intmain()

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

sort(shu+1,shu+1+n,orz);

for(k=0,i=1;m;m--)

while(o.size()&&(o.top().firstk))

o.pop();

cout

now=o.top().first;

k=-o.top().second;}}

寫**的時候把n與m換了一下,更符合我的習慣。。

最後分析一下複雜度:二分求lis複雜度(n*logn),sort複雜度(n*logn),最後的操作i移動的n次,每個元素最多進堆一次出堆一次,複雜度(n*logn);總體複雜度n*logn

有n 個長為m 1 的字串

有n 個長為m 1 的字串,如果某個字串的最後m 個字元與某個字串的前m 個字元匹配,則兩個字串可以聯接,問這n 個字串最多可以連成乙個多長的字串,如果出現迴圈,則返回錯誤。分析一下,將各個字串作為乙個節點,首尾鏈結就好比是一條邊,將兩個節點連線起來,於是問題就變成乙個有關圖的路徑長度的問題。鏈結所...

P1361 小M的作物

p1361 小m的作物 二者取其一型別的網路流題 不同的集合,向對應元素連去不同 收益 容量的邊 對於那些神奇的組合,我們只需要按照以下方式建立兩個點 x 向 s 連一條在a時的額外收益 2.x x 注意順序,x 是其有向邊的起點,x 是其有向邊的終點 向其後繼節點連 inf 容量的邊,保證不會出現...

P1361 小M的作物

小m在mc裡開闢了兩塊巨大的耕地a和b 你可以認為容量是無窮 現在,小p有n中作物的種子,每種作物的種子有1個 就是可以種一棵作物 用1.n編號 現在,第i種作物種植在a中種植可以獲得ai的收益,在b中種植可以獲得bi的收益,而且,現在還有這麼一種神奇的現象,就是某些作物共同種在一塊耕地中可以獲得額...