Noip2011題解報告

2021-08-17 23:44:04 字數 3978 閱讀 1195

標籤(空格分隔): 考試

題目總結:

day1-t1 模擬

day1-t2 記錄前驅+觀察性質

day1-t3 搜尋+剪枝

day2-t1 組合數學+快速冪

day2-t2 二分+字首和優化

day2-t3 貪心

備註:觀察性質是一種思考方式,不是做題方法和技巧!是態度!

資料範圍:

對於30% 的資料,有 n ≤2 ;

對於50% 的資料,0 ≤a, b, g, k≤100;

對於100%的資料,有 0 ≤n ≤10,000 ,0≤a, b, g, k ≤100,000。

部分分

除了o(n)的演算法我想不到任何方法了,自古t1模擬題(noip2017被打臉)

乙個值得注意的優化

從上面的地毯往下面的地毯掃(也就是從後往前掃),掃到的第乙個則是滿足條件的最上面的地毯,break即可

**

for(int i=n;i>=1;i--)

}

資料範圍:

對於30% 的資料,有 n ≤100;

對於50% 的資料,有 n ≤1,000;

對於100%的資料,有 2 ≤n ≤200,000,0< k ≤50,0≤p ≤100 ,0 ≤最低消費≤100。

部分分

30%:o(n^3)列舉左端點,右端點,再是o(n)的check

50%:o(n^2*logn)或o(n^2),就是優化掉o(n)的check,提前預處理好區間最大最小值(線段樹,st表都可以)

100%:o(n*k),注意到若兩個相同顏色的客棧之間存在乙個滿足題意的咖啡館,則之後所有與這客棧顏色相同的都可計入答案。所以不難想到用乙個桶來統計每種顏色的次數和每種顏色的合法數即可

值得注意的是

要先更新合法桶再更新顏色桶

其實這個題目資料不強,o(n^2)可以過,只需注意到乙個優良性質」若兩個相同顏色的客棧之間存在乙個滿足題意的咖啡館,則之後所有與這客棧顏色相同的都可計入答案」,所以考慮優化,記錄所有的顏色相同的位置及下乙個同色出現的位置,然後如果找到乙個滿足題意的咖啡館,則直接加上後面客棧的個數然後break

**

for(int i=1;i<=n;i++)

}ans+=tongji[se];

color[se]++;

if(mon<=p)tongji[se]++;

}

來自某位大佬的題解報告

因為只有相同顏色才會產生貢獻

記錄一下上乙個相同顏色的位置,以及當前是否有滿足條件的咖啡店

用字首和處理即可

for(int i=1;i<=n;++i)

o(

n2∗k

) o(n

2∗k)

也能ac

a

c

for(rg int i=1;i<=k;i++)

for(rg int j=1;j<=b[0];j++)}}

}

資料範圍

對於30% 的資料,初始棋盤上的方塊都在棋盤的最下面一行;

對於100%的資料,0 < n≤5 。

部分分

對於30%:頂多只有5顆棋子,暴力模擬就好了,我還有什麼話可說

對於100%:

先講剪枝吧

總而言之,四條剪枝原則:

(1)交換兩個顏色相同的塊沒有意義

(2)乙個塊的左邊是非空塊時不需要考慮左移,因為會和之前的塊右移重複,即只有當左塊為空時才左移

(3)根據題目優先度的排序,可以知道,右移優先於左移,所以在dfs時先考慮右移

(4)如果有一種顏色當前的塊數目x滿足1<=x<=2,則此情況不合法

至於消的話,則可以做另外乙個棋盤來進行標記,先暫時不消(以防消少了的情況),再所有能消的棋子標記完後再一起消。

此題細節巨多,易打掛,請耐心除錯

資料範圍

對於30% 的資料,有 0 ≤k ≤10 ;

對於50% 的資料,有 a = 1,b = 1;

對於100%的資料,有 0 ≤k ≤1,000,0≤n, m ≤k ,且n + m = k ,0 ≤a ,b ≤1,000,000。

50%:不會,其實a=1,b=1就是裸的楊輝三角了

100%:由a=1,b=1可以發現,唯一區別就是再楊輝三角的係數上再乘以a^n*b^m

組合數是要求逆元的!!!

組合數是要求逆元的!!!

組合數是要求逆元的!!!

(重要的事情說三遍)

不求逆元會炸成30分!

資料範圍

對於10% 的資料,有 1 ≤n ,m≤10;

對於30% 的資料,有 1 ≤n ,m≤500 ;

對於50% 的資料,有 1 ≤n ,m≤5,000;

對於70% 的資料,有 1 ≤n ,m≤10,000 ;

對於100%的資料,有 1 ≤n ,m≤200,000,0 < wi, vi≤10^6,0 < s≤10^12,1 ≤li ≤ri ≤n 。

50%:不用字首和優化的加一些卡常就大概有60分吧

至於其餘的部分分我不會辣

100%:二分+字首和優化,對於每一次二分出來的標準值w計算一遍字首和,如果當前y > s,則說明w分小了,l=mid+1,若y < s,則說明w分大了,r=mid-1,若y = s,則剛好

開long long,然後更坑的是輸入值s是long long,讀入優化別打成int了!

資料範圍

對於10% 的資料,k=0 ;

對於20% 的資料,k=1 ;

對於40% 的資料,2 ≤ n ≤ 50,1 ≤ m ≤ 1,000,0 ≤ k ≤ 20,0 ≤ di ≤ 10,0 ≤ t i ≤ 500;

對於60% 的資料,1 ≤ n ≤ 100,1 ≤ m ≤ 1,000,0 ≤ k ≤ 100 ,0 ≤ di ≤ 100,0 ≤ t i ≤ 10,000 ;

對於100%的資料,1 ≤ n ≤ 1,000,1 ≤ m ≤ 10,000 ,0 ≤ k ≤ 100,000,0 ≤ di ≤ 100 ,0 ≤ t i ≤ 100,000。

不會部分分,所以直接來正解(部分分應該是給細節或者貪心打掛的人的分吧)

正解:

邊加速邊計算答案很麻煩所以我們把不用加速器的答案算出來再減去加速的時間。關鍵就是在**用加速器…我們要讓乙個加速器盡可能多的貢獻出它的價值,就要讓他造福更多的人。如果這條邊上經過的人很多的話,使用加速器會更划算。

每次找乙個能夠影響最多人的路徑。每個點出發時間一定在最後乙個人到達的時間之後因此每次找的時候,計算一下每一條邊最多能夠向後影響多少人,取最大值,然後重複計算o(nk)的複雜度可以接受

for(int i=1;ifor(int i=1;i<=m;++i)

for(int i=2;i<=n;++i)tt[i]=max(tt[i-1],lst[i-1])+d[i-1];

for(int i=1;i<=n;++i)ss[i]=ss[i-1]+down[i];

for(int i=1;i<=m;++i)ans+=tt[to[i]]-t[i];

us[n]=us[n-1]=n;//用乙個加速器可以影響的最後一條邊

tt[1]=lst[1];

while(k--)

}ans-=nn;d[mm]--;

}

thanks for your attention.

NOIP2011 聰明的質監員 題解

題目大意 額 貌似蠻清晰的,就不贅述了。思路 首先不難發現m越大y越小,因此可以二分答案 方向不要弄錯 二分出最小的不小於s的y即可。而計算y時可用字首和o n m 求得。兩種邊界情況也要考慮一下 同時long long不要少開 1 include2 include3 using namespace...

NOIP2011 觀光公交

題目 分析 設last i 表示來到第i個景點的乘客最晚的時間,time i 表示車到達第i個景點的最小時間。因為每個乘客到達的時間已經固定,所以要使總時間最小,就是使 time down i 最小,其中down i 代表每位乘客的目的地。先考慮不用加速器的情況。可以直接遞推求出答案,time i ...

NOIP2011 計算係數

1計算係數 給定乙個多項式 ax by k 請求出多項式展開後 x n y m 項的係數。輸入 輸入檔名為 factor.in。共一行,包含 5 個整數,分別為 a,b,k,n,m,每兩個整數之間用乙個空格隔開。輸出 輸出檔名為 factor.out。輸出共 1 行,包含乙個整數,表示所求的係數,這...