2020牛客多校第六場 K

2021-10-08 22:18:17 字數 1132 閱讀 5261

題意:判斷給的序列是不是 任意1~n的全排拼接成序列的連續子串行

每乙個數字應該屬於的地方它只能出現一次。從任意點i開始,如果某個點在往後查詢的時候出現了兩次,那麼i點最多能夠延伸到那個地方。 然後我們可以把每個點求一下最多能延伸到哪個點,直接記錄len。(操作看**)

處理:由於k很大,可以到1e9,但是n只有5*e5,故我們可以把這些點離散化一下(方便pre陣列的運用)。所以此時a裡面存的是離散化後,每個點對應的離散化值。

更多詳細看**。

最後判斷: 列舉開始起點,依次check是都滿足條件。

**:

#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);

#include

#define int long long

#define sc scanf

#define pf printf

using

namespace std;

typedef pair<

int,

int> pii;

typedef

long

long ll;

const

int inf =

0x3f3f3f3f

;const

double eps =

1e-4

;const

int mod =

1e9+7;

const

int n =

500010

;int a[n]

,b[n]

,pre[n]

,len[n]

;signed

main()

//列舉起點,看後面是否滿足條件,因為開頭可以不是完整的1~n的全排

bool plas =

false

;for

(int sa=

1;sa<=

min(k,len[1]

+1);sa++)}

if(flag)

} cout<<

(plas?

"yes"

:"no"

)<}return0;

}

牛客多校第六場

d 題意感覺說的不是很清楚,一開始題意弄錯了,以為是最優的方案,結果是對於每個盒子這個 so clever 的人的做法是優先選擇盡可能大的物品裝完乙個盒子,我就不知道這個人 聰明了。思路 賽後知道題意後,5分鐘寫完,瞎暴力就一發過了,我自己都有點出乎意料真水了。includeusing namesp...

2020牛客多校聯賽第六場(CBEK)

輸出4.50000000 一列一列的去找,因為兩列合併時 即合併之後的值處於兩者之間不超過較大值,那麼就沒有合併的意義了,一列一列的更新最大值。因為分母是選取的子矩陣的最後一行,因此可以擴大分子,即從第一行開始加到子矩陣末尾。include using namespace std typedef l...

2019牛客多校第六場C(PAM)

傳送門 不會pam,建議看一下該部落格pam 維護乙個陣列,表示節點對於答案的貢獻 那麼如何計算這個值呢,首先我們需要知道它是由誰轉移而來的,比如該節點表示的是aabbbbaa,他是由abbbba轉移而來的,我們在計算aabbbbaa時首先要加上abbbba,然後還有一些fail邊連向的點首先我們來...