最長不下降子串行

2022-09-07 23:51:27 字數 1408 閱讀 3987

分析:

在考場上的思路是對的:

d的範圍很小,所以總有迴圈的一天,

這樣我們處理出迴圈節,

需要注意的是,迴圈節不一定從1開始

比如說:1 4 2 5 3 2 5 3 迴圈節從第3位開始

我在考場上把序列縮到:不迴圈部分+乙個迴圈節

長度設為n

在序列上做最長不下降子串行,

至於之後的迴圈節,他們對答案都可以貢獻1

看了一下大佬的ac程式

ta的n是這樣的:

(我天,這麼大,然而人家a了,你能說什麼呢。。。)

好吧,n最大上了萬位,

求最長不降只能用nlongn

然而我這個zz連最長不降nlogn都jj

看一下大佬優美的寫法

int le=1

;f[1]=a[1];

for (i=2

;i<=n;i++)

return le;

最後要注意在%剩的餘數中,也有可能對ans貢獻1

這裡寫**片

#include

#include

#include

#include

#include

#define ll long long

using

namespace

std;

ll nn;

int a,b,c,d,t;

int p[1000010],beg,xh,n;

ll a[1000010],f[1000010];

void doit() //nlongn

if (n==nn)

ans=(ll)le+(nn-n)/xh;

int r=(nn-n)%xh; //不構成迴圈的一小部分

if (r)

for (i=0;iif (a[beg+r]>=f[le]) //f[le]是長度為le的最小結尾

printf("%lld",ans);

}void cl()

p[x]=i;

a[i]=x;

}n=xh*(xh1 ? beg-1:xh)+beg-1; //迴圈部分:不迴圈部分 乘上較長的部分

if (n>nn) n=nn;

for (i=beg+xh;i<=n;i++) a[i]=a[i-xh];

for (int i=1;i<=beg+xh;i++) printf("%d ",a[i]);

puts("");

doit();

}int main()

最長不下降子串行

a1 t0 an a an 1 2 b an c d n 1 求該序列最長不下降子串行長度 n不是很大顯然可以暴力。n很大呢?那就不斷減迴圈節長度直至減到乙個閾值內,再暴力。正確性顯然,只要閾值不要設太小。include include include define fo i,a,b for i a...

最長不下降子串行

最長不下降子串行解法 第一種就是普通的dp方法 for int i 1 i n i dp 0 1 for int i 1 i n i ans max ans,dp i cout 主要記錄一下n logn的寫法 二分 主要思路 用乙個陣列 b 來記錄最長的子串行 一開始讓b 1 a 1 陣列a為輸入的...

最長不下降子串行

例子 openjudge 4977 怪盜基德的滑翔翼 描述怪盜基德是乙個充滿傳奇色彩的怪盜,專門以珠寶為目標的超級盜竊犯。而他最為突出的地方,就是他每次都能逃脫中村警部的重重圍堵,而這也很大程度上是多虧了他隨身攜帶的便於操作的滑翔翼。有一天,怪盜基德像往常一樣偷走了一顆珍貴的鑽石,不料卻被柯南小朋友...