• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            c++&oi

            NOIP2011解題報告

            NOIP2011解題報告

            馬鞍山第二中學 鄭逸寧

            DAY1.

            1.1carpet

            題目簡述:

            求最后一次覆蓋某一點的矩形的序號.

            分析:

            對于點(x,y)和矩形(a,b,g,k),若滿足a<=x<=a+g && b<=y<=b+k,則稱該矩形覆蓋該點.

            實現1:

            從前向后查找,一邊讀一邊更新.T=O(n),S=O(1);

            實現2

            先存儲下來,從后往前查找,查找到即輸出.T=O(n),S=O(n);

            總結:

            一般來說,實現2在數據已經儲存好的情況下比1要快,但就本題來說比1花費了更多的空間,這體現了時間和空間的辯證關系.

            代碼

            1.2hotel

            題目簡述:

            求一段有A,B兩種屬性的序列中,滿足Ai=Aj,并且存在Bki<=k<=j<=W的無序二元組的組數.

            分析1:

            這是一個靜態統計問題.先不妨設i<j,防止統計時重復,也能很快的想到按屬性A分開處理,我們可以利用動態規劃的思想來解決.

            實現1:

            T[i]表示第i個元素前最近的滿足Bk<=W元素的位置;

            G[i][j]表示在前j 元素中屬性A為i的元素的個數.

            首先計算出G[i][j]:

            若Aj=i,則G[i][j]=G[i][j-1]+1;

            否則G[i][j]=G[i][j-1];

            然后一邊計算T[i],一邊統計總數ans:

            若i本身滿足Bi<=W則T[i]=i,ans+=G[Ai][T[i]]-1(自己不能和自己成組);

            否T[i]=T[i-1], ans+=G[Ai][T[i]].

            最后時間復雜度T=O(kn),空間復雜度S=O(kn) .

            分析2:

            本題還有不同的思路.如:使用ST算法的O(nlog2n)的算法,和同樣是DP預處理但構造得比較精妙的O(n)的算法。具體實現,以后再寫.

            總結:

            O(kn)的算法很容易想到,但更快的算法比較困難,畢竟我在考場上還想錯了.如果題目可以用O(kn)的方法解決,那么在考試時最好不要想O(n)或O(nlog2n)的算法.

            O(kn)

            1.3mayan

            題目簡述:

            有一個游戲,通過交換左右兩個方塊,使三個或三個以上的同色方塊連成一線而消除掉,當下方方塊消除后,上面的方塊會掉落.求在規定步數時,方塊剛好全部消除的字典序最小方案.

            分析:

            搜索.

            實現:

            這道題很復雜,編寫的內容非常的多,由于我水平不高,只是寫了在一層中平移互換的部分.

            總結:

            要多練習搜索題.

            30%

            Day2:

            2.1factor

            題目簡述:

            求(ax+by)n中xnym項的次數.

            分析:

            利用二項式展開定理,系數為C(n,n+m) anbm

            實現:

            遞推求出組合數C[i][j]=C[i-1][j-1]+C[i-1][j],一邊加一邊取模.再一邊乘一邊取模,乘上anbm即可.

            T=O((n+m)2),S=O((n+m)2).

            總結:

            取模的運算遵循乘法和加法的結合律,但不支持除法.如果要用公式法算組合數,需要先分解質因數,

            約分后再乘才行.相比之下使用遞推法算組合數就更好一些

            代碼

            2.2
            題目簡述:

             

            給定n個含有w, v兩種屬性的元素和m個區間,選一個W,使公式:

            Yi=∑1*∑vj,j∈[Li,Ri]且wj≥W

            計算出的∑Yi與給定的值Y之間的差的絕對值最小。

            分析:

            這是一道動態統計的問題,但仔細分析,∑Yi隨W增大而單調不增,所以我們可以先二分答案,讓后把它改為靜態的統計問題.對于多區間的統計,有不同的解決方法,所以同樣使用二分答案,本題的得分也在50~100之間.

            實現1:

            單獨處理每個區間,按照公式計算即可.

            T=O(n2log2maxw),S=O(n).

            實現2:

            使用線段樹.這是一個錯誤的想法,是在錯誤預估 O(nlog2nlog2maxw)的時間可以通過的前提下做出的選擇,其實一開使想到O(n)的掃描線算法(其實這已經是一個錯誤的想法了,因為掃描線是用于對于多區間覆蓋,無關聯的點的簡單統計用的,而對于有重疊的區間統計和較復雜的公式就無能為了力了),也聯想到樹狀數組,覺得功能不足以完成較復雜的公式計算.其實沒有想到正確的統計方法,要不然不僅是樹狀數組,連什么數據結構都不用也可以解決.

            具體實現方式就是每次插入m條線段,并遞歸同時計算出∑1和∑vj,最后求和計算.

            T=O(nlog2nlog2maxw),S=O(n).

            實現3:

            其實類似的統計題是做過的,但看到復雜的公式就沒有想到改進.我們可以用動態規劃的思想來解決這個問題:用t[i]表示前i個元素中符合條件的元素的個數,用sum[i]表示前i個元素中符合條件元素的v的值的和,那么對于區間[l,r],最后的值就是(sum[r]-sum[l-1])*(t[r]-t[l-1]).我們預處理出t[i]和sum[i]的值,然后對每個區間操作一次即可。

            T=O((n+m)log2maxw),S=O(n).

            總結:

            好多人沒有得滿分的原因是二分查找沒有注意邊界,但也有像我一樣腦殘的人想到了高級的線段樹,而忽視了簡單的預處理,還浪費了不少的時間。

            線段樹悲劇
            AC代碼

            2.3bus

            題目簡述:

            有序的n個點組成一個序列,有m個單位在時間Ti出現在其中的一點Ai要移動到比Ai大的一點Bi,只有所有要到Ai點以后的單位都到了Ai點,才可以出發到下一個點,每兩個相鄰的點之間有一定權值的距離.可以通過k次調整,每次使相鄰點之間的距離-1,可以重復調整.求所有點移動的最小時間和.

            分析1:

            題目不是很好懂,大略讀懂題目后,觀察數據中有k<=1的30%的數據,于是枚舉即可.

            實現1:

            d[i]表示第i個點到第i+1個點的權值,a[i],b[i],t[i]如題目簡述所示.latest[i]表示到第i個點的元素最晚的到達值,arrive[i]表示集體到第i個點的時間.當k=0時:

            arrive[i]=max(arrive[i-1],latest[i-1])+d[i-1],

            ans=∑(arrive[b[i]]-t[i])

            當k=1時,枚舉出一個d[i],減去1,計算出最優的ans即可.T=O(n2),S=O(n).

            分析2:

            我們考慮怎樣使用調整.顯然對于latest[i]>=arrive[i],對于i點以后的單位所需的時間沒有任何影響,感覺這里的許多操作應該是獨立的,大概可以用貪心的方法來解題,然而需要一個衡量標準,這正是在考場上沒想到的.

            實現2:

            用next[i]表示在第i個點后離i最近的滿足latest[i]>=arrive[i]的點,sum[i]表示前i個點的單位數.

            我們可以用sum[next[i]]-sum[i]來衡量在第i-1到第i個點之間調整的效果,每次選擇該值最大的邊,把d的值-1,然后重新計算arrive[i]的值,再做相同操作.此時時間復雜度O(kn),還不足以通過全部的數據.其實很簡單的想一想,如果把d[i]的值-1后仍然有所有滿足latest[i]>=arrive[i]的點的狀態不會改變并且d[i]仍然可以-1,那么下次調整的還是i-1到i的這條邊.我們不妨一次性把它做到位,讓d[i]減去一個恰好的數(我是拿KM算法的松弛量類比的)最終T=O(n2),S=O(n).

            總結:

            本來想在后面70%中隨便貪心做做的,但時間不夠了,當時想的貪心法已經很接近這個解法了,如果第二題能節約更多的時間的話,就可以給這題留出更大的希望.

            果斷30%

            其實AC也不難

            注:本文用T 表示時間復雜度,S表示空間復雜度.復雜度只表示數量級,不考慮常數.


            還需思考的問題:

            1.2的O(nlogn)和O(n)的解法

            2.1的數學方法優化?

            1.3怎樣爆搜?


            posted on 2011-11-27 17:36 zyn.cpp 閱讀(1855) 評論(2)  編輯 收藏 引用

            評論

            # re: NOIP2011解題報告 2012-06-27 13:59

            頂一下。。  回復  更多評論   

            # re: NOIP2011解題報告 2012-06-28 12:47

            sum[i]表示前i個點的單位數?這。。,sum[i]表示i點前下車的乘客數吧?  回復  更多評論   

            <2012年6月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            1234567

            導航

            統計

            常用鏈接

            留言簿

            隨筆檔案(57)

            文章檔案(13)

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            精品多毛少妇人妻AV免费久久| 国产亚洲精品久久久久秋霞| 国产叼嘿久久精品久久| 中文字幕久久精品| 久久久久综合网久久| 午夜视频久久久久一区| 久久精品99久久香蕉国产色戒| 久久婷婷人人澡人人| 精品久久久久久亚洲精品| 性做久久久久久久久| 99久久精品国内| 久久99精品国产麻豆宅宅| 精品久久久久久无码国产| 色狠狠久久AV五月综合| 久久无码国产| 99久久精品国产综合一区| 久久99国产乱子伦精品免费| 偷偷做久久久久网站| 久久久久亚洲AV无码专区桃色 | 91精品久久久久久无码| 国内精品伊人久久久影院| 国产精久久一区二区三区| 亚洲色婷婷综合久久| 欧美激情精品久久久久久久九九九| 久久天天躁狠狠躁夜夜avapp | 久久66热人妻偷产精品9| 亚洲国产精品成人AV无码久久综合影院| 狠狠色丁香久久综合五月| 久久久婷婷五月亚洲97号色| 久久精品国产AV一区二区三区| 青青热久久国产久精品 | 久久免费视频网站| 久久99精品久久久久久久久久| 久久SE精品一区二区| 日日狠狠久久偷偷色综合96蜜桃| 99久久精品免费看国产免费| 久久久精品人妻一区二区三区四| 97视频久久久| 亚洲中文字幕久久精品无码喷水| 亚洲伊人久久大香线蕉综合图片| 久久精品国产AV一区二区三区|