日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

牛客国庆集训派对Day6

發(fā)布時(shí)間:2023/12/3 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 牛客国庆集训派对Day6 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

??蛧鴳c集訓(xùn)派對(duì)Day6

以下是我個(gè)人題解,出題人題解附帶在最后

A.Birthday

費(fèi)用流裸題,只要注意到1+3+5+...+2k?1=k21+3+5+...+2k-1 = k^21+3+5+...+2k?1=k2即可已做這道題了.
其他的地方連邊都很方便.每一個(gè)區(qū)域向匯點(diǎn)連很多條容量為111的邊,但費(fèi)用分別是1,3,5,...,2k?11,3,5,...,2k-11,3,5,...,2k?1.
最后跑最小費(fèi)用最大流即可.

B.Board

注意到我們先對(duì)每一行進(jìn)行操作,每一行各行減去它們行內(nèi)的最小值.然后每一列減去它們逐列的最小值.可以保證,這樣操作一輪以后,所有點(diǎn)的數(shù)都變成了000.
初始把問好處設(shè)為0,這樣操作一遍以后,指定格子處乘以?1-1?1就是答案.

C. Circle

注意到(x,x+1)(x,x+1)(x,x+1)必然互質(zhì),因此直接輸出nnn.

D.土龍弟弟

unsolved.

E.Growth

設(shè)s[x][y]s[x][y]s[x][y]表示所有ai≤x,bi≤ya_i\le x,b_i\le yai?x,bi?yziz_izi?之和.
dp[x][y]dp[x][y]dp[x][y]表示從第000天開始,到第x+yx+yx+y天的屬性分配滿足a:x,b:ya:x,b:ya:x,b:y所獲得的最大值,

轉(zhuǎn)移方程

dp[x][y]+p?s[x][y]→dp[p+x][y]dp[x][y] + p*s[x][y] \rightarrow dp[p+x][y]dp[x][y]+p?s[x][y]dp[p+x][y]

dp[x][y]+q?s[x][y]→dp[x][y+q]dp[x][y] + q*s[x][y] \rightarrow dp[x][y+q]dp[x][y]+q?s[x][y]dp[x][y+q]

sss數(shù)組直接用二維前綴和預(yù)處理即可.

dpdpdp轉(zhuǎn)移的時(shí)候采用bfsbfsbfs順序轉(zhuǎn)移即可.

F.kindom

很容易得到方程

dp[n]=dp[x1]+x1+dp[x2]+x2+...+dp[xm]dp[n] = dp[x_1] + x_1 + dp[x_2] + x_2 +... + dp[x_m]dp[n]=dp[x1?]+x1?+dp[x2?]+x2?+...+dp[xm?]

其中xi≤xj,i&lt;jx_i\le x_j,i &lt; jxi?xj?,i<j時(shí).且滿足∑xi=n?1\sum x_i = n-1xi?=n?1.

dp[n]=dp[x1]+dp[x2]+...+dp[xm]+(n?1?xm)dp[n] = dp[x_1] + dp[x_2] + ... + dp[x_m] + (n-1-x_m)dp[n]=dp[x1?]+dp[x2?]+...+dp[xm?]+(n?1?xm?)

轉(zhuǎn)移時(shí)枚舉xmx_mxm?的大小,那么求dp[x1]+dp[x2]+...+dp[xm?1]dp[x_1] + dp[x_2] + ... + dp[x_{m-1}]dp[x1?]+dp[x2?]+...+dp[xm?1?]的最大值.

由于dp[x]≥x?2dp[x] \ge x-2dp[x]x?2,因此dp[x]dp[x]dp[x]的增長速率必然不低于線性,因此當(dāng)x1,...,xm?1x_1,...,x_{m-1}x1?,...,xm?1?盡可能越大越好越大越好.

故方程變?yōu)?

dp[n]=max1≤xm≤n?1{?n?1?xmxm??dp[xm]+dp[(n?1?xm)%xm]+dp[xm]}dp[n] = max_{1\le x_m \le n-1}\{\lfloor \frac{n-1-x_m}{x_m} \rfloor * dp[x_m] + dp[(n-1-x_m)\%x_m] + dp[x_m]\}dp[n]=max1xm?n?1?{?xm?n?1?xm????dp[xm?]+dp[(n?1?xm?)%xm?]+dp[xm?]}

時(shí)間復(fù)雜度O(n2)O(n^2)O(n2)

G.Matrix

unsolved.

H.Mountain

最大值乘2.

I.清明夢(mèng)超能力者黃YY

算法一

涉及:樹鏈剖分,掃描線

在一個(gè)線段的情況下,我們可以把一個(gè)染色區(qū)間拆成左端點(diǎn)處增加事件,右端點(diǎn)處刪除事件.
維護(hù)一顆權(quán)值線段樹.
這樣,端點(diǎn)從小到大掃描時(shí),遇到增加事件就在線段樹指定位置+1,遇到刪除事件就在線段樹指定位置-1.

那么要回答一個(gè)點(diǎn)的答案只需要掃到這個(gè)點(diǎn)的時(shí)候,在權(quán)值線段樹里二分kkk大值即可.

這個(gè)搬到了樹上,我們照樣可以使用掃描線的方法來做.

對(duì)于每一個(gè)染色區(qū)間,將其剖到樹鏈上去,可以剖出最多log(n)log(n)log(n)個(gè)小區(qū)間.

這些小區(qū)間的深度較小的端點(diǎn)加入增加事件,深度較大的端點(diǎn)加入刪除事件.

然后對(duì)整棵樹按照dfndfndfn序列從小到大依次掃描即可,注意掃描的過程中也要維護(hù)一顆權(quán)值線段樹.

算法二

涉及:dfs,權(quán)值線段樹合并

對(duì)于每個(gè)詢問u,vu,vu,v,應(yīng)該在uuu處加入增加事件,在vvv處加入增加事件,在lca(u,v)lca(u,v)lca(u,v)處加入刪除事件,在faz[lca(u,v)]faz[lca(u,v)]faz[lca(u,v)]處加入刪除事件.因此每個(gè)詢問會(huì)產(chǎn)生444個(gè)事件.

我們采用dfs的順序,每個(gè)點(diǎn)維護(hù)一顆權(quán)值線段樹,然后后序遍歷到達(dá)一個(gè)節(jié)點(diǎn)時(shí)候,先將它所有兒子的線段樹進(jìn)行合并,合并完成后,將該點(diǎn)涉及到的增加或刪除事件執(zhí)行到線段樹上,此時(shí),該點(diǎn)的權(quán)值線段樹維護(hù)的就是橫跨這個(gè)節(jié)點(diǎn)的所有染色區(qū)間.

然后在權(quán)值線段樹上進(jìn)行kkk大詢問即可得到該點(diǎn)的答案.

J.最短路

先建樹,樹建完后多余100100100條邊,每條邊取左端點(diǎn),得到100100100個(gè)端點(diǎn),從這些點(diǎn)出發(fā)跑bfsbfsbfs,可以得到從這些點(diǎn)到任意一點(diǎn)的最短路.對(duì)于每個(gè)詢問,枚舉這100100100個(gè)點(diǎn)sss,求dis[s][u]+dis[s][v]dis[s][u] + dis[s][v]dis[s][u]+dis[s][v]的最小值即為答案.

總的時(shí)間復(fù)雜度:O(100k+100n)O(100k + 100n)O(100k+100n)

K.排序

unsolved.

附錄

以下是出題人題解:

birthday:
思路:考慮費(fèi)用流時(shí)把每個(gè)part拆成n個(gè)點(diǎn),選擇第i個(gè)點(diǎn)的代表為放置i塊蛋糕和(i - 1)塊蛋糕的時(shí)間差,這個(gè)時(shí)間差是遞增的,因此在費(fèi)用流的過程中必定會(huì)從小到大選擇
具體建圖:左邊n個(gè)點(diǎn)代表n個(gè)蛋糕,右邊m * n個(gè)點(diǎn)代表m個(gè)part,每個(gè)part拆成n個(gè)點(diǎn)。源點(diǎn)向每個(gè)左邊的點(diǎn)連一條流量1費(fèi)用0的邊,每個(gè)右邊的點(diǎn)向匯點(diǎn)連一條流量1費(fèi)用0的編。每個(gè)蛋糕向可以放的兩個(gè)part的所有點(diǎn)連邊,連向第i個(gè)點(diǎn)的費(fèi)用為i^2 - (i - 1)^2,流量為1。這樣求最小費(fèi)用流既為答案。

board:
把格子N染色,第i行第j列格子的顏色為(i + j) % N。那么每次操作時(shí),必定是N種不同的顏色都有一格被操作到,因此最后任何顏色格子的和必定是相等的。因此只需要記錄每種顏色格子的和,并算出缺失格子的顏色C,用其余顏色的和減去顏色C的和即可

Circle:
因?yàn)?i,i+1)=1且(1,n)=1,所以把1…n依次放進(jìn)一個(gè)環(huán),就可以啦。答案為n。

Growth:
把獎(jiǎng)勵(lì)的x拿出來從小到大排序,得到x1,x2,…,xn。
把獎(jiǎng)勵(lì)的y拿出來從小到大排序,得到y(tǒng)1,y2,…,yn。
用v[i][j]表示a值到達(dá)xi,b值達(dá)到y(tǒng)i時(shí)接下來每天可以得到的獎(jiǎng)勵(lì)。
v[i][j] = v[i - 1][j] + v[i][j - 1] - v[i - 1][j - 1] + t[i][j]
其中t[i][j]為滿足x=i,y=j的獎(jiǎng)勵(lì)的總和。
用f[i][j]表示a值達(dá)到xi,b值達(dá)到y(tǒng)j時(shí)已經(jīng)拿到的獎(jiǎng)勵(lì)的最大值。
f[i][j] + (x[i + 1] - x[i] - 1) * t[i][j] + t[i + 1][j] -> f[i + 1][j]
f[i][j] + (y[j + 1] - y[j] - 1) * t[i][j] + t[i][j + 1] -> f[i][j + 1]
最后統(tǒng)計(jì)一下答案就可以了。

kingdom:
f[i]代表i個(gè)點(diǎn)時(shí)的答案,g[i][j]代表若干顆樹加起來,size和為i,每棵樹size<=j時(shí),這些樹的代價(jià)和最大是多少
從1到n枚舉i,在i固定時(shí)枚舉心腹的影響力大小更新f[i],然后用類似背包的思路更新g[i][1]~g[i][i]
復(fù)雜度O(N^2)

Matrix:
w個(gè)格子的重心的坐標(biāo)為(∑xiwi / ∑wi, ∑yiwi / ∑wi)。
那么其實(shí)我們只要維護(hù)∑xiwi,∑yiwi,∑wi就可以了。
假設(shè)我們現(xiàn)在有一個(gè)頂點(diǎn)為(x, y)的三角形,我們想要推到頂點(diǎn)為(x, y+1)的三角形,觀察兩者之間的差異,會(huì)發(fā)現(xiàn)在推過去的過程中,其實(shí)就是刪去了一個(gè)斜條,又加入了一個(gè)斜條。
同理,從(x, y)到(x+1, y)其實(shí)只是刪去了兩個(gè)斜條,加上了底上的橫條,而這些關(guān)鍵的值都是可以通過前綴和的方法維護(hù)。

Mountain:
考慮山中最高的一座,最優(yōu)操作一定是從第一座山的左下角開始不停地往上爬,然后從最高的山不停地往下爬爬到最后一座山的右下角。
所以答案為最高山的高度*2。

清明夢(mèng):
首先每條路徑從LCA處分開可以拆成兩條鏈
假設(shè)鏈A->B執(zhí)行了第i次染色操作,假設(shè)A是B的祖先,那么我們?cè)贐點(diǎn)加入一個(gè)"插入i"的事件,在A的父親點(diǎn)加入一個(gè)"刪除i"的事件
然后dfs整顆樹求解,每個(gè)點(diǎn)維護(hù)一個(gè)線段樹。處理一個(gè)點(diǎn)時(shí)先合并所有兒子的線段樹,然后再處理這個(gè)點(diǎn)上的事件,得到線段樹之后詢問第K大值既可得到答案。
復(fù)雜度分析:
Node* merge(Node* a, Node* b) {
if (a == NULL) return b;
if (b == NULL) return a;
a->sum += b->sum;
a->child[0] = merge(a->child[0], b->child[0]);
a->child[1] = merge(a->child[1], b->child[1]);
return a;
}
考慮以上的線段樹合并,每次合并會(huì)減少一個(gè)區(qū)間。而在事件點(diǎn)插入、刪除的時(shí)候會(huì)產(chǎn)生至多l(xiāng)og個(gè)區(qū)間,因此復(fù)雜度為O(NLogN)

最短路:本題十分直接。我們不斷地把度數(shù)為1的點(diǎn)刪掉,把度數(shù)為2的點(diǎn)收縮,最后會(huì)得到一個(gè)圖,和原圖的點(diǎn)數(shù)與邊數(shù)之差相同,且新圖中每個(gè)點(diǎn)的度數(shù)都至少是3。這就是說我們會(huì)得到一個(gè)200個(gè)點(diǎn)300條邊以內(nèi)的圖。新圖可以用Floyd算法預(yù)處理所有點(diǎn)對(duì)之間最短路。詢問時(shí),將詢問轉(zhuǎn)化到新圖上即可。轉(zhuǎn)化時(shí)需要注意細(xì)節(jié)。

排序:設(shè)m是a和b的差的lowbit。我們先假設(shè)m是1,即a和b的奇偶性不同。這時(shí)通過適當(dāng)?shù)臉?gòu)造,我們可以用常數(shù)步交換任意兩個(gè)奇偶互異的數(shù)字的位置。交換奇偶相同的數(shù)只要借一個(gè)和它們奇偶不同的數(shù)即可。如此我們便可交換任意兩個(gè)數(shù),即此時(shí)沒有無解。下面考慮m大于1。我們稱一個(gè)數(shù)字x的低位為(x&(m-1)),高位為x減去它的低位。我們發(fā)現(xiàn)數(shù)組的低位是無法利用交換魔法的,只能用到加法和異或。也就是說,我們必須用加法和異或排好數(shù)組的低位。排好低位后,我們按照低位將所有數(shù)字分為若干組,每組內(nèi)(和之前m為1的情況類似)是沒有無解的?,F(xiàn)在問題只剩如何用加法和異或排好低位??梢园l(fā)現(xiàn),a[0],…,a[m-1]的低位和a[m],…,a[2m-1]的低位必須完全一致且均為0到m-1的一個(gè)排列,否則它們無法同時(shí)通過加法和異或排好。同理a[2m],…,a[3m-1]的低位也必須一致。所以,我們只要用加法和異或排好a[0],…,a[m-1]即可。這其實(shí)是本題的n=m且沒有交換魔法的版本(因?yàn)楝F(xiàn)在超過m-1的加法和異或是沒用的)。在這個(gè)版本下,從升序排列只能生成(m/2)(2**(m/2))種不同的排列。這些排列可以用遞歸法構(gòu)造:m=2時(shí)用一次加法即可(后面會(huì)解釋為什么用加法不用異或)。m更大時(shí),我們發(fā)現(xiàn)連續(xù)使用加1和異或1可以達(dá)到奇數(shù)都加2,偶數(shù)都不變的效果。這個(gè)操作實(shí)際相當(dāng)于只考慮奇數(shù)且不考慮個(gè)位情況下的加1操作。這就可以提取所有奇數(shù)做遞歸,將所有奇數(shù)排列成任意的m/2時(shí)的可能排列。同理,先異或1再加1起到的是偶數(shù)加2奇數(shù)不變的效果。我們相似地遞歸偶數(shù)部分。注意到,遞歸一側(cè)時(shí),異或操作是會(huì)影響另一側(cè)的。奇數(shù)和偶數(shù)兩側(cè)的異或操作的異或和必須相同(因?yàn)檎w考慮,異或操作其實(shí)是同時(shí)作用在奇數(shù)和偶數(shù)上的!),除了個(gè)位和最高位。(除了個(gè)位是因?yàn)槲覀兏静豢紤]個(gè)位,個(gè)位有值的異或操作只用在異或1的時(shí)候了。除了最高位是因?yàn)樽罡呶划惢蚩梢杂闷鏀?shù)+2操作模擬出來。)這樣可以得到的排列數(shù)最多為(m/2)(2**(m/2)),同時(shí)滿足條件的排列都可以用遞歸法構(gòu)造出來。

土龍弟弟:下面會(huì)有一些定義。出此題是期望比賽的時(shí)候大家憑感覺得到結(jié)論,不證明。
首先題目問的是在torus上扣若干個(gè)洞,所得曲面上的閉環(huán)的同倫等價(jià)類。(定義:torus:就是我們定義的地圖,形似甜甜圈。閉環(huán):就是說土龍弟弟一天走的路徑。因?yàn)闀?huì)回來所以叫閉環(huán)。同倫等價(jià)類:就是一個(gè)土龍弟弟的路線可能會(huì)變換。凡是可能屬于同一個(gè)土龍弟弟的兩條路線就是相互同倫的。題目問的就是最少能分成多少組使得組內(nèi)相互同倫。)我們把扣掉的洞用線連起來,使得線之間不相交且按照線將曲面分割成若干簡單的部分。(簡單的部分:就是這一部分是你在紙上隨便畫個(gè)不自交的閉環(huán)得到的東西。簡單是因?yàn)檫@一個(gè)區(qū)域中所有的閉環(huán)都同倫,因?yàn)榭梢钥s小到很小再移動(dòng)到一起。)分割區(qū)域這一步需要小構(gòu)造一下。大體思路就是每一行都畫一條橫的線,這線實(shí)際會(huì)被洞分割成多條線。然后有些區(qū)域是個(gè)環(huán)(即從左邊走到最右邊再向右回到最左邊),即并非簡單區(qū)域。這些區(qū)域再畫一條豎線。
這樣分割后,一個(gè)閉環(huán)就可以用依次穿過的線的編號(hào)組成的字符串來表示(除了記錄哪條線,方向也有用。并且由于是環(huán),字符串也是循環(huán)的。)然后消去相鄰相反括號(hào)(即連續(xù)的正穿和反穿同一條線的部分。因?yàn)槊總€(gè)區(qū)域都是簡單的,所以連續(xù)正穿和反穿中間的部分可以不斷收縮直到不穿過這條線,所以消去后所得的曲線和之前是同倫的。)最后為了判斷循環(huán)串相等要用最小表示法。證明:我們要證的是同倫當(dāng)且僅當(dāng)消去相鄰相反括號(hào)后的序列循環(huán)相等。 假設(shè)a經(jīng)過消括號(hào)得到(不能再消的)b,顯然a和b是同倫的,因?yàn)槊恳徊蕉纪瑐?。假設(shè)a’消括號(hào)得到b’。如果b和b’循環(huán)相等,a和b同倫。這就證明了一半。反過來,對(duì)一個(gè)曲線做同倫變換時(shí),只能產(chǎn)生或消除相鄰的相反括號(hào)。所以如果b和b’不等,他們又都沒有相鄰相反括號(hào)可以消去,它們就不可能通過產(chǎn)生和消除相鄰相反括號(hào)相互轉(zhuǎn)換,即b和b’不同倫,即a和a’不可能同倫。
最后注意沒有洞是特殊情況。題面里除去了這種情況。其實(shí)torus上扣若干洞后的基本群總是free group,但是沒扣洞時(shí)的基本群是Z^2(平面整數(shù)格點(diǎn)加法群)。

總結(jié)

以上是生活随笔為你收集整理的牛客国庆集训派对Day6的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。