13多校 4 ,組隊賽 18 總結

2022-10-11 02:09:10 字數 3447 閱讀 5225

解題報告:

(來自杭電acm微博)

注意到任意乙個回文子串行收尾兩個字元一定是相同的,於是可以區間dp,用dp[i][j]表示原字串中[i,j]位置**現的回文子串行的個數,有遞推關係:

dp[i][j]=dp[i+1][j]+dp[i][j-1]-dp[i+1][j-1]

如果i和j位置出現的字元相同,那麼dp[i][j]可以由dp[i+1][j-1]中的子串行加上這兩個字元構成回文子串行,也就是

dp[i][j]+=dp[i+1][j-1],注意邊界特判一下就可以了

明顯的poyla,首先列舉出所有的置換群,再算置換群中的不動點的個數就可以了,這裡大致的描述一下

首先是連線面中心的置換群,有3個,分別是逆時針旋轉90度,180度,270度

還有連線對邊中心的置換群,有6個,分別是旋轉180度

還有連線對角線頂點的置換群,有4個,分別是旋轉120度,240度

至於每個置換群中的不動點大家就自己人肉吧,注意要細心一點……

1003:

注意乙個強制拐彎的格仔如果強制方向的下乙個格仔是牆,那麼它將永遠卡住。將所有格仔的四個方向都看做乙個狀態。列舉處理所有起點和所有鑰匙的四個方向出發,到達其他所有格仔所有狀態的最少滑動數。這個可以bfs一遍,dp[x][y][z]表示到達(x,y)並且方向為z的最少滑動數。處理出來後,就是求起點出發經過所有鑰匙最後到達終點的最少滑動數,這可以直接8!或者dp[1<<8][8]求解。

最終新增完邊的圖,肯定可以分成兩個部x和y,其中只有x到y的邊沒有y到x的邊,那麼要使得邊數盡可能的多,則x部肯定是乙個完全圖,y部也是,同時x部中每個點到y部的每個點都有一條邊,假設x部有x個點,y部有y個點,有x+y=n,同時邊數f=x*y+x*(x-1)+y*(y-1),整理得:f=n*n-n-x*y,當x+y為定值時,二者越接近,x*y越大,所以要使得邊數最多,那麼x部和y部的點數的個數差距就要越大,所以首先對於給定的有向圖縮點,對於縮點後的每個點,如果它的出度或者入度為0,那麼它才有可能成為x部或者y部,所以只要求縮點之後的出度或者入度為0的點中,包含節點數最少的那個點,令它為乙個部,其它所有點加起來做另乙個部,就可以得到最多邊數的圖了

首先人肉出在原足球中任意兩個面的關係建個圖(我覺得我已經很有愛的把比較不好想的關係在hint中都給出了吧……),之後就變成了無向圖中的問題了,具體做法是如果兩個節點的目標狀態相同,他們之間就連權值為1的邊,否則連權值為0的邊,然後從每個點做乙個最短路出去求得到到達每個點的最短路dis[i],如果把當前列舉的起始點作為最後染色的點,那麼需要的步數就是最大的dis[i],其中i的顏色必須是黑色,因為起始的狀態每個點都是白色的,這樣列舉全部的點作為最終的狀態過去,選擇其中花費最小的就是答案了,下面簡要證明一下

要證明這個做法的正確性只需要證明任意乙個最優狀態都可以轉化成套圈圈的染色方法,因為上面的做法是求出套圈圈的染色方法中的最優解,套圈圈的意思就是每次染色的集合除了第一次都是上一次的子集……

現在給定乙個任意的染色方法,如果染色的區域是聯通的(染色過的全部點只出現在乙個連通分支),那麼肯定可以按照他們相交的狀態調整成套圈圈的染色方案,如果染色的區域不是聯通的(不只乙個聯通分支),那麼染色的次數至少是兩個,我們可以通過中間一些沒有染色的集合把這兩個區域連起來,並且按照顏色的種類把染色次數少的那堆染色合併到次數多的那堆染色,最後再多操作一次(也可能是不需要操作的)把中間那個用來連起來的區域染成白色,這樣調整的方案一定是不比給定的方案不好的

比如1-2-3這個鏈,有一種染色情況是染色了1和3,那麼我們可以調整成第一步染1,2,3這三個,就是上面講到的合併兩種染色方案,然後把中間分支(2號節點)染色成白色,這樣調整的步數一定是不大於原來的步數的

首先根據兩個人的速度和第乙個人先跑出去的時間,可以算出第乙個人在雨中跑的時間,由於第乙個人是向左跑,雨是向下落,那麼人相對於雨就是向左上角跑了,這樣會好處理一點……於是對於每個雨滴,用人所在的線段去和雨滴求相交,計算這個線段在雨中的時間,注意這個線段的兩個端點可能在雨滴中,可能和雨滴重疊……這樣對於每個雨滴可以算出對應的時間區間,在這個時間區間裡面就代表這個人在雨裡面,求出全部的時間區間之後掃瞄線過去求一下這些點段的並的長度就是答案了,注第乙個人一開始跑出去的時間也是有可能碰到雨的,在計算代表第乙個人的線段的起始端點的時候要加上這段,比賽的時候好多隊伍沒有注意到這個問題就掛了……

1007:

題意為詢問一段區間裡的數能組成多少段連續的數。先考慮從左往右乙個數乙個數新增,考慮當前新增了i - 1個數的答案是x,那麼新增完i個數後的答案是多少?可以看出,是根據a[i]-1和a[i]+1是否已經新增而定的,如果a[i]-1或者a[i]+1已經新增乙個,則段數不變,如果都沒新增則段數加1,如果都新增了則段數減1。設v[i]為加入第i個數後的改變量,那麼加到第x數時的段數就是sum (1<=i<=x}。仔細想想,若刪除某個數,那麼這個數兩端的數的改變量也會跟著改變,這樣一段區間的數構成的段數就還是他們的v值的和。將詢問離線處理,按左端點排序後掃瞄一遍,左邊刪除,右邊插入,查詢就是求區間和。

比較簡單的dp,直接用dp[i]表示0-i這段區間可能變成的不同句子數,首先有dp[i+1]+=dp[i],如果當前位置向後連續4個字元是hehe,那麼有dp[i+4]+=dp[i],最後的答案就是dp[len]了

首先用乙個簡單的2^n*n的dp可以求出乙個人訪問乙個給定狀態的最小花費,因為這i個人是等價的,所以用dp[i][mask]表示i個人跑完mask這個狀態的最小花費,所以首先列舉集合mask,對於dp[i][mask],列舉mask的子集v,dp[i][mask]可以由dp[1][v],dp[i-1][mask^v]轉移過來,注意這裡用來合併的集合是不能有重複的,這個類似揹包……這樣就可以算出對於每個狀態三個人訪問完的最小花費,之後對於給定的需要訪問的狀態,列舉包含這個給定狀態的集合更新答案就可以了……注意對於剛開始給定的圖是不能floyd的,因為要求任意兩個人的路徑不能相交……還有就是1這個節點可以每個人經過多次,這裡需要特殊處理一下……

1010:

題意為動態往字串末尾新增字母,同時在這過程中會詢問當前字串**現k次以上的不同的子串數。首先,字尾陣列處理後掃瞄一遍,按照height值維護單調棧,這可以處理每一段出現一定次數的子串,一些出現相同次數的子串會在一步中一起考慮。這就能夠求解沒有新增操作的版本。將字串倒過來,從末尾新增字母視為從前端新增,離線處理,將所有插入插入到字串中,打上時間標記。字尾陣列處理後,掃瞄一遍,處理所有出現一定次數的子串,假設總共有m次,每次都有時間標記,即哪個操作新增上的,那麼就是看第k小的時間標記,這個操作之後這種子串都會被新增到答案。所以只要求第k小的時間標記,這裡可以用劃分樹預處理,然後對在第k小時間之後的詢問都加上當前這些子串數。這可以用樹狀陣列統計,總複雜度n*logn。

比賽時有過了的隊伍好像是用字尾自動機,暴力遍歷fail指標更新的。

1011:

可以看出,每次翻轉都會翻動最右下角的格仔。如果右下角剛開始為1,那麼先手的人每次都翻動右下角的,使該格仔變為0,後手的翻其他矩形,肯定會使得最右下角的格仔變為1。這樣先手每次都有格仔翻,最後肯定是後手敗。如果右下角剛開始為0,若沒格仔翻則後手勝,否則不管翻哪個格仔,都會導致右下角變為1,後手每次都翻右下角,肯定必勝,所以是後手勝。所以結論是右下角剛開始為1則先手勝,否則後手勝。

還沒有補完,先佔坑吧~~

130804組隊練習賽ZOJ校賽

a.ribbon gymnastics 題目要求四個點作圓,且圓與圓之間不能相交的半徑之和的最大值。我當時想法很簡單,只要兩圓相切,它們的半徑之和一定最大,但是要保證不能相交的話就只能取兩兩個點間距離和最短的作為半徑和最大的。到現在也不是非常清楚為什麼可以a,我們帶錯節奏了。include incl...

20110805 組隊賽 f題

測試資料有多組,對於每組資料,第一行為乙個整數n 1 n 10000 表示表示式中數字的個數,其後的第i 1行每行有乙個整數表示xi的值 1 i n 1 xi 1000000000 對於每組資料,如果你能幫阿里巴巴開啟石門,輸出yes,否則輸出no。58421143579 yesno 這是劉汝佳黑書...

第七周組隊賽130825

今晚和教主一組,教主太神,連a四題,而且都是1a!都是用暴搜過的,暴搜大王。a題 給你多個立方體,最大能堆起幾個 小的必須在上面,立方體可以旋轉使所得面滿足條件 我寫了好久,一直tle,後來看了教主的,還是tle,先不貼了,就是dfs呀,就是 b題 給出n個點,任意找一點,使得這點帶其他點的曼哈頓距...