四校聯考 20171001

2022-03-26 00:12:06 字數 2316 閱讀 4209

[二分]

期望得分:70

實際得分:10

列舉最高的高度可能為多少+二分。o(logm)

列舉最高高度應該位於哪一列上.o(n)

左右擴散列舉出需要用的積木總數,與m相比較。

容易發現合法的高度的最高值,最終需要搭建乙個金字塔。

1,3,5,7…                        

正解是預處理出每一列作為最高列的左右邊界。

然後再二分最大高度。

check出每個數是否合法即可。

考場做法的錯誤在於:並不要堆成完全的金字塔形狀。

例如上圖,其實只需要綠色部分就夠了。

居然這麼還能苟到10分。。

但是離正解很近了啊啊啊。

#includeusing

namespace

std;

#define ll long long

#define file "block"inline

void

file()

inline

intread()

while(ch >= '

0' && ch <= '9')

return x*f;

}const

int mxn = 1e5 + 5

;int

n,m;

inta[mxn];

intl[mxn],r[mxn];

intmx;

ll s[mxn];

inline

bool check(int

h)

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

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

return

false;}

intmain()

printf(

"%d\n

",l-1

);

return0;

}/*8 4342

1332

4*//*3 10033

3*/

view code

[貪心,鍊錶]

期望得分:30

實際得分:0

知道是個貪心。對於每個n[i],貪心選擇較大的前n[i]個m[i]減去1。

正解做法是對貪心進行優化。

正解的鍊錶做法好玄妙好棒哦。

能這麼做是因為值域就在[1,m]範圍內,而且每次變化就在相鄰的兩個元素之間。

這樣可以用鍊錶快速維護相鄰兩個數的關係。

據說還有網路流的寫法。不想寫。我不會。

#includeusing

namespace

std;

#define ll long long

#define file "cake"inline

void

file()

inline

intread()

while(ch >= '

0' && ch <= '9')

return x*f;

}const

int mxn = 2.5*1e6 + 19

;int

m,n,md,nd,m0,n0;

inline

bool cmp(int x,int

y)int

x[mxn],y[mxn];

intl[mxn],r[mxn];

inline

void del(int

x) int

main()

while(s >= i+y[cur])

ans +=(ll)min(i,s);

if(s >i)

else

}}

printf(

"%d\n

",ans);

return0;

} /*

5 8 1 2 3 4

*/

view code

[樹形dp]

可能的得分:30

實際得分:0

暴力就是看圖模擬吧。但是沒寫就是了。

狀態不佳。。。不給自己找客觀原因吧。

四校聯考(20170910)

ditoly出的題目果然喪,待我一天啃一題。廢話不多說,開更 我是分割線 t1 最大值 max 問題描述 小c有n個區間,其中第i個區間為 li,ri 小c想從每個區間中各選出乙個整數,使得所有選出的數and起來得到的結果最大,請你求出這個值。輸入格式 第一行乙個正整數n,表示區間個數。接下來n行,...

四校聯考 傳遞

題解 如果乙個圖是競賽圖那麼如果存在邊,那麼a一定能走到b,反之亦然 還有,如果在圖p中存在邊,那麼圖q中一定不存在邊或 基圖是完全圖 那麼,如果圖p中存在邊,圖q一定不能從a走到b或者從b走到a 既然如此,因為圖p 圖q是完全圖 所以,對於點u和點v,u和v之間的邊要不然在p裡,要不然在q裡,所以...

四校聯考 點

題目描述 有n個點,初始時沒有邊。有m個操作,操作分為兩種 1 在i和j之間增加一條無向邊,保證1 i,j n。2 刪去最後新增的k條邊,保證k 當前邊數。你想要知道最多能選取多少個兩兩不連通的點,以及選取的方案數。在每次操作後輸出這兩個值。方案數對998244353取模。輸入資料 第一行兩個整數n...