BestCoder Round #39 解题报告
?
?
現場只做出前三題w
不過不管怎樣這既是第一次認真打BC
又是第一次體驗用在線編譯器調代碼
訂正最后一題花了今天一整個下午(嗚嗚
收獲還是比較大的^_^
?
?
?
?
?
?
Delete
?
wld有n個數(a1,a2,...,an),他希望進行k次刪除一個數的操作,使得最后剩下的n?k個數中有最多的不同的數,保證1≤n≤100,0≤k<n,1≤ai≤n(對于任意1≤i≤n)?
比較簡單的貪心...
把出現一次以上的多于一次的部分都刪除掉
如果k依然>0就要刪去k種不同的數
?
?
?
?
?
Multiplewld有一個序列a[1..n], 對于每個1≤i<n, 他希望你求出一個最小的j(以后用記號F(i)表示),滿足i<j≤n, 使aj為ai的倍數(即aj mod ai=0),若不存在這樣的j,那么此時令F(i) = 0 保證1≤n≤10000,1≤ai≤10000 對于任意 1≤i≤n, 且對于任意1≤i,j≤n(i!=j),滿足ai != aj
?
n^1.5次的大暴力即可
發現BC好多題目都是用這種方法...在此之前并不認為這樣可以過
對于每個數枚舉它所有的因數,刷新它們的f[i]值
?
?
?
?
?
Codewld有一個長度為n的序列a1..an wld想要你給出下面這段c++代碼的輸出: int calc() {int res=0;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){res+=gcd(a[i],a[j])*(gcd(a[i],a[j])-1);res%=10007;}return res; } 保證1≤n≤10000,1≤ai≤10000 (對于任意1≤i≤n)
?
?
我的做法是n^1.5次的,但是發現題解是nlog(n)
但上次莫比烏斯反演只看到一半...所以先棄療吧
講講n^1.5次的做法
首先n^1.5的復雜度將每個數的因子打上標記
我們可以枚舉最大公約數d,如果有x個數有d這個因子
那么就累計x*(x-1)次這個答案
但是顯然我們會發現問題
如果兩個數有4這個因子,那么在統計2的時候又會統計一次!
解決方法很簡單,我們可以預先處理出每個數應累計的答案f[i]
枚舉最大公約數d的同時,再枚舉d的因子i,減去這個因子的答案
注意:這里的答案也是處理過的答案,即f[i]
最后單獨累計i=j時的情況
手速太慢...原因有好多個
開始寫的時候把+=看成了*=
所以寫了乘法逆元...然后調了半天輸出了很多中間過程才發現錯誤
然后還忘記了i=j的情況
后來WA了一發,是因為枚舉最大公約數的時候應枚舉到a[i]的最大值而不是n
剛開始沒查出來,又開始證明算法的思路即f[i]的計算是否正確
改來改去越來越離譜..突然發現是后面的問題
然后就1h+辣> <
?
?
?
?
?
Luckywld有n個數(a1...an) 保證對于任意1≤i≤n,1≤ai≤n wld有一個常數k保證2≤k≤2?n 為了消除歧義保證k為奇數 他有m個詢問 每個詢問有參數l1,r1,l2,r2 保證(1≤l1≤r1<l2≤r2≤n) 對于每個詢問你需要回答有多少個二元組(i,j)滿足: l1≤i≤r1且l2≤j≤r2且ai+aj=k 保證1≤n≤30000,1≤m≤30000
?
?
恩..這道題在考場上確實是寫不出來的..
今天下午去學習了一下莫隊算法...覺得很有趣...
莫隊算法就是建立在分塊基礎上,離線解決一系列區間詢問問題
首先這道題假設已知[l,r]中相加=k的對數
那么我們可以通過復雜度不高的代價得知[l-1,r][l+1,r][l,r-1][l,r+1]的答案
剛開始是打算用log級的倍增做的..但是交了一發TLE了
?
這道題詢問的是[l1,r1][l2,r2]中滿足條件的對數
如何轉換成單個區間上面[l,r]中相加=k的對數呢
假設題目中讓我們求的是一個在區間A,一個在區間B的答案,我們假設為F(A,B),并且令F中統計的數對為有序的
即只統計a[i]+a[j]=k且(i<j)的情況
可以證明得出F(A,B) = F(A+C+B,A+C+B)-F(A+C,A+C)-F(B+C,B+C)+F(C,C)
F(A+C+B,A+C+B)-F(A+C,A+C)-F(C+B,C+B)+F(C,C)
= F(A,A)+F(A,C)+F(A,B)+F(C,C)+F(C,B)+F(B,B)-F(A,A)-F(A,C)-F(C,C)-F(C,C)-F(C,B)-F(B,B)+F(C,C)
= F(A,B)
轉化成了4部分兩區間相等的F,也就是可以用上面的莫隊算法來解決了
?
最后一個問題,就是轉移的時候如何從log(n)轉化成O(1)
在執行莫隊的同時,即l,r一位一位移動的時候,用一個數組記錄當前區間內某個數出現的次數就可以了...
?
?
?
漲了177w
手速還是慢慢慢
?
居然過了一個周末一下子就27號了呢
居然再過兩天又要回家了呢
27/.Apr.
?
?
轉載于:https://www.cnblogs.com/mjy0724/p/4460991.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的BestCoder Round #39 解题报告的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java.net.SocketExcep
- 下一篇: 面向接口编程(二)