Lydsy月賽合輯

2021-09-08 00:24:49 字數 3269 閱讀 6330

不想單開的就寫在這裡了

都還是挺不錯的啊

許可權題沒有

又是被ozy秒殺的我

不考慮嚴格大於的話你直接ai,bi取個max就過了…

現在要考慮嚴格大於,相當於每個矩形,都是一條在ai,bi中的邊

我們定義這個數被作為一次長,當且僅當有一條新的邊指向了他

最後我們就要給所有邊定向,顯然要求每個數最多只有乙個入度,貢獻就是出度*權值

顯然所有的連通塊要不就是環套樹要不就是樹

是樹的很簡單,只有乙個點取了他所有度來作為貢獻,最後加上最大的那個點的權值就行了

否則的話每個點都會有乙個入度,直接算答案就行了

並查集維護一下

還是挺類似bzoj4883的

只能往資料隨機這方面靠了

一開始做了乙個每個點找前面a,b最小的1k個暴力做,然後滾出了

我們可以確定乙個闕值m

mm,使得答案在m

mm以內的所有數都被全部掃完一遍

大概確定個m=8000,後面沒有被掃到的數暴力做

就能過了…

資料隨機的玩意還是憑感覺啊…

真是沒腦子了

糊了半天才發現沒把下邊界容斥掉根本就沒辦法記憶化

別管根號的回文數枚舉直接dp就可以了

預處理sum

[i

]sum[i]

sum[i]

表示能組成位數為i

ii的(含前導零)回文數有多少種方案

然後常規數字dp

被ozy忽悠去寫辣雞kd樹…

顯然可以把貢獻拆成每個點的

每個點的貢獻就是i−p

re[i

]i-pre[i]

i−pre[

i],其中pre

[i

]pre[i]

pre[i]

表示和i

ii顏色相同的前乙個位置是什麼

然後不考慮修改的話每個詢問就是個二維數點

在( l,

l)

(l,l)

(l,l

)為左下角和(r,

r)

(r,r)

(r,r

)為右上角的矩形數點的權值和

修改的話,直接再加乙個點進去,就是權值取負的.

然後cdq就可以了

性質就是每個字串的最小迴圈節長度就是i−n

ext[

i]

i-next[i]

i−next

[i],其中這個nex

tnext

next

是k mp

kmpkm

p的next

next

next

陣列我們從頭開始給這個字串編號,遇到乙個新字元就tot

+1

tot+1

tot+

1,否則就拿出舊編號給他

顯然這些就是本質不同的字串,其他只是乘乙個組合數而已

爆搜這些本質不同的字串,每次做一發kmp

kmpkm

p狀態數大概只有400w個,然後就可以過了…

哦其實狀態數是o(b

ell(

n)

)o(bell(n))

o(bell

(n))

的…因為就是集合劃分數

感謝ozy的思路

首先肯定要列舉這個母串,可以用一些諸如是否是約數,每個字母的數量是否能組成總共字母的數量的小技巧來優化

然後區間dpf[i

][j]

f[i][j]

f[i][j

]表示[i,

j]

[i,j]

[i,j

]能否被全部表示出來

兩種轉移

要不就是分成兩段,這兩段都能被表示出來

要不就是在最後的位置匹配母串的乙個字元,這個字元是確定的,然後詢問f[i

][j−

1]

f[i][j-1]

f[i][j

−1]記憶化一下可以寫的更舒服

感謝ozy的diss讓我加速想出了這題

可以發現合法的路徑一定是從乙個點往下走一段,橫著走一段,再往上走一段

直接對x軸分治,找到每個點到這個中軸線最高高度是多少

然後按這個高度排序,路徑可以拆分為a−u

1+b+

u2

<=k

a-u1+b+u2<=k

a−u1+b

+u2<=k

其中a是較矮那段的長度,b是較高那段的長度,u1是a的高度,u2是b的高度

排序一下從上往下掃就可以了,注意算重的情況,複雜度是nlo

g2

nnlog^2n

nlog2n

的不難發現可以大膽猜想中間那一段的雷數是唯一的

我們可以求出從第3行開始,每次下移3行的行的雷數,就是3,6,9,12,15…行的

同理,我們也可以求出從第n-2行開始,每次上移3行的雷數,就是n-2,n-5,n-8,n-11…行的

怎麼求的話,以第3行為例,用第二行求出1~3行的和,再用第一行求出1~2行的和就可以知道了

如此n有兩種情況,如果n-2模3不為零的話,顯然我們可以每三行求出其中不同兩行的和,這樣第三個行的和也就確定了

如果模3為0的話,顯然n/2+1這一行模三為0,於是這一行在一開始就能知道

所以無論如何我們都可以知道n/2+1這行的和…直接掃就可以了

一開始太過於糾結具體的填法…就忽略了某些行的數量是一定的,因為具體只可以有乙個2n2^

2n的做法…

題目條件限制很舒服…很好證明這個最長上公升子串行一定是a,b兩串的最長上公升子串行之和

證明的話可以考慮反證法…不展開了

現在的方向就是要在序列中刪除一些數,使得lis減小

於是可以每個數拆點i,i

+n

i,i+n

i,i+

n,從i

−>i+

ni->i+n

i−>i+

n連邊,流量為代價

對於每乙個lis,從小到大連邊,大概就是min

+n

−>ma

xmin+n->max

min+n−

>ma

x,流量inf,這樣連,然後源向最小的連,最大的向匯連。由於乙個點不可能同時是起點和終點,所以直接跑最小割

其實不需要找到所有lis,用dp陣列f[i]向f[i]+1且大小滿足限制的連就可以了

顯然邊數隻會有n

2n^2

n2,非常舒服

很早就想到了這個想法只是*****的認為可能同時是起點終點就不寫了,去了個廁所冷靜一下發現我假了2333…

Lydsy1706月賽 大根堆 亂搞 啟發式合併

description 給定一棵n個節點的有根樹,編號依次為1到n,其中1號點為根節點。每個點有乙個權值v i。你需要將這棵樹轉化成乙個大根堆。確切地說,你需要選擇盡可能多的節點,滿足大根堆的性質 對於任意兩個點i,j,如果i在樹上是j的祖先,那麼v i v j。請計算可選的最多的點數,注意這些點不...

bzoj4919 Lydsy1706月賽 大根堆

給定一棵n個節點的有根樹,編號依次為1到n,其中1號點為根節點。每個點有乙個權值v i。你需要將這棵樹轉化成乙個大根堆。確切地說,你需要選擇盡可能多的節點,滿足大根堆的性質 對於任意兩個點i,j,如果i在樹上是j的祖先,那麼v i v j。請計算可選的最多的點數,注意這些點不必形成這棵樹的乙個連通子...

日期問題合輯

問題 a 判斷閏年判斷某年是否是閏年。輸入只有一行,包含乙個整數a 0 a 3000 一行,如果公元a年是閏年輸出y,否則輸出n 2006n include int main 問題 b 細菌繁殖一種細菌的繁殖速度是每天成倍增長。例如 第一天有10個,第二天就變成20個,第三天變成40個,第四天變成8...