[二分]
期望得分:70
實際得分:10
列舉最高的高度可能為多少+二分。o(logm)
列舉最高高度應該位於哪一列上.o(n)
左右擴散列舉出需要用的積木總數,與m相比較。
容易發現合法的高度的最高值,最終需要搭建乙個金字塔。
1,3,5,7…
正解是預處理出每一列作為最高列的左右邊界。
然後再二分最大高度。
check出每個數是否合法即可。
考場做法的錯誤在於:並不要堆成完全的金字塔形狀。
例如上圖,其實只需要綠色部分就夠了。
居然這麼還能苟到10分。。
但是離正解很近了啊啊啊。
#includeusingview codenamespace
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*/
[貪心,鍊錶]
期望得分:30
實際得分:0
知道是個貪心。對於每個n[i],貪心選擇較大的前n[i]個m[i]減去1。
正解做法是對貪心進行優化。
正解的鍊錶做法好玄妙好棒哦。
能這麼做是因為值域就在[1,m]範圍內,而且每次變化就在相鄰的兩個元素之間。
這樣可以用鍊錶快速維護相鄰兩個數的關係。
據說還有網路流的寫法。不想寫。我不會。
#includeusingview codenamespace
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
*/
[樹形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...