1. 程式人生 > >2017多校Round2(hdu6045~hdu6055)

2017多校Round2(hdu6045~hdu6055)

多校 sum 想去 想要 sign 維護 處理 想法 改變

補題進度:10/11

1001(不等式)

根據題意列不等式,解一解就行了

1002(套路)

題意:

給定一個隨機產生的1e6*1e6的矩陣和一個1e3*1e3的矩陣,你要回答這個1e3*1e3的小矩陣出現在大矩陣的哪個位置

分析:

每隔1e3行 1e3列去建立一個check矩陣,看看這個check矩陣在不在1e3*1e3的矩陣中(Hash就行)

那麽時間復雜度就是O(1e3*1e3*hash)

一個比較好的取法是取一個1*64的矩陣,用unsigned long long把64個壓成一位放入hash中

1003(貪心)

樣例有誤導性,貪心著來就行了,用單調隊列維護

1004(找規律+逆序對)

題意:

按照其規則將數字填到一個矩陣中,問能不能通過移動空格使得最後的有序

分析:

若空格左右移動,相當於沒有改變排列,逆序對奇偶性不改變

若空格上下移動,那麽相當於左右移動了m-1次,因為最後空格又回到了右下角,所以上下移動一定進行偶數次,所以逆序對奇偶性也不該邊

我們想要的結果逆序對是偶數,可以猜想如果原序列逆序對個數是偶數那麽就可行,否則不可行(官方題解給出了這裏的證明)

然後問題就是如何快速求出逆序對了

我們可以按照取數順序考慮有多少個小於它的數放到了它後面

以第一次(1->p+1->2p+1->...)為例,我們發現對答案的貢獻分別是p-1+2*(p-1)+3*(p-1)+..... 這明顯可以等差數列求

然後去掉這些之後,我們發現剩余的還是單增的,算法仍舊相同

1005(DP)

題意:

給出一個n的排列(n<=3000),現在可以把連續的一段當作一組,組內進行排序,然後你可以任選兩個區間進行交換,問交換後如果能變成12345...n的話,最多能分成多少塊

分析:

首先一個n^3的算法很好得到

首先預處理出ma[i][j]和mi[i][j]

我們去枚舉需要交換哪兩個區間[a,b] [c,d],那麽很明顯d=ma[a,b],所以只需要去枚舉a,b,c,而實際上符合條件的很少,所以這裏枚舉加些剪枝是可以看作n^2的

很明顯我們需要知道f[i][j]表示區間[i,j]變為有序最多能分成多少塊

那麽求f是n^3的

現在我們要將求f[i][j]變成n^2的

我們發現這個dp中的k取值很有講究,是決策單調的,並且k不能很大,如果很大就可能導致分割的兩個區間不合法

我們用la[i]表示當前以i為左端點的最長可行區間是[i,la[i]],那麽f[i][j]=f[i][la[i]]+f[la[i]+1][j]

不過要註意分成的兩個區間一定要是左邊的左邊的最大值小於等於右邊的最小值,否則f[i][j]=1

這樣我們利用了決策單調性將復雜度降到O(n^2)的了

1006(找規律)

題意:

技術分享

分析:

剛開始想去找第一層每個數對答案的貢獻,但數字量太多了,並沒用

可以用特征根求出第一行的通式,然後等比求和求出第一行的S的通式

通過S的通式可以寫出第二行的通式,然後再等比求和求出第二行的S的通式

再往下寫兩行,就能找出Fm,1的規律了

1007(原根)

隊友太強辣,把切掉了,我就不補了

1008(單調棧)

題意:

對於一個n*m的方格,每個格子中都包含一種顏色,求出任意一個矩形包含顏色種數的期望。(n,m<=100)

分析:

我們單獨去考慮每個位置對答案的貢獻

很明顯,不同的顏色互不影響,我們可以把相同的顏色挑出來單獨計算

容易想到去計算這個東西的反面,當前答案=總的矩陣數-沒有被任何一個點覆蓋的矩形個數,但這個並不好求,所以這種求反面的想法不可行

我們定義一個位置(i,j)的有效管理矩形是以(i,j)為最左上角的矩形,那麽答案就是所有位置的有效管理矩形數的和

那麽我們對每一個位置去求有效管理矩形數

1009(莫比烏斯反演)

題意:

技術分享

n,Ai<=10^5

分析:

對於一個B,我們去求所有數的gcd,如果這個gcd>=2,那麽B是合法的,如果這個gcd=1,那麽B是不合法的

gcd=1的B數量 + gcd=2的B的數量 + gcd=3的B的數量 + ... + gcd=min(Ai)的B的數量 ==== 所有B的總數(πAi)

那麽我們要求的答案就是πAi - gcd=1的B數量

那麽莫比烏斯反演一下ans=Σμ(d)*sum(d)

sum(d)表示公約數為d的時候方案數,很明顯sum(d)=π(Ai/d)

這裏也要優化,將Ai/d相同的放在一塊,這裏可以用一個桶來存

1010

待填坑

1011(Trick)

題目:

給了n個整點(n<=500),問有多少個正多邊形

分析:

找找規律會發現,只有正方形是可行的

所以可以枚舉兩個點作為正方形的相鄰點,根據兩個點去旋轉90°以及去做一個平移操作可以得到另外兩個點,判斷那兩個整點是否被讀入覆蓋就行了

時間復雜度O(n^2)

2017多校Round2(hdu6045~hdu6055)