題意:求一個直條圖中的矩形最大面積做法:唉,DP,線段樹想了一大堆...還是看了大神,迴歸源頭,迭代啊。就是求出每個矩形向左向右最遠可以到的地方。這些矩陣裡面有一個傳遞關係,如果a可以到達b,那麼a可以到達b可以到達的所有地方#include<cstdio>#include<cstring>#define LL long longconst int LMT=100005;int h[LMT],l[LMT],r[LMT];int n;LL ans;LL max(LL
題意:給一個矩陣,求第x步時能否從起點走到終點。一開始死活都想不到啊。。。什麼時候maybe啊。。。都怪我英語差。題目中的 "Other time such as staying and resting can be ignored"意思是這樣的時間是完全不用考慮的,即使是你的室友在撒謊要考慮maybe的時候,maybe是因為在那樣的時間下從起點還可以走到另外的點,也可以走到終點。#include<cstdio>#include<cstring>const int
題意:求兩個長度為l的車庫最多能容納的車子,如果有一輛車方不進去就停止。做法:雙塔DP啊,只是這次選擇的狀態是兩座塔的高度,用來記錄的是最終塔的高度,和放進去車的數量DFS那裡不知怎麼的,去掉一個條件就A了,求大神講解啊#include<cstdio>#include<cstring>const int LMT=10007;bool dp[2][LMT];int car[502],sum[502];int pre[502][LMT];inline int min(int
題意:審判囚犯了,要在n選擇m個人組成陪審團,每個人對那個囚犯有一個好感值,厭惡值。為了保證審判,陪審團要保證公正,所以在保證所有人的好感值和與厭惡值和的差值最小,然後確保好感值和厭惡值和的總值最大。做法:記錄的狀態是當前好感值和厭惡值的差值,當前好感值的和與厭惡值的和,DFS求出選擇方案。o(︶︿︶)o 唉,最後取答案的之後,竟然把n寫成了i,wa多次#include<cstdio>#include<cstring>const int LMT=202;const
題意:這題比上題水太多,這次的小姑娘過了w就一睡不醒,另外都一樣。做法:一樣的枚舉w,自是現在的每個能遇到每個客人時的w因該是以這個客人和0時刻為斷點的時間段中的一個最大的時間段(不能在見到這個客人之前睡著啊),枚舉好之後,還有向前看這個姑娘最終睡著的時刻。#include<cstdio>#include<cstring>const int LMT=100003;double t[LMT],p[LMT],lev[LMT];double max(double
題意:求一個序列中所有數位和,其中數值相同的只能計算一次。做法:可以先儲存所有的請求,然後按照它們的右邊界排序,在查詢的同時更新區間。這裡其實有一點點DP的味道,在它進行某個查詢之前,保證所有的重複數字都被刪除光了,並且有不能影響其他查詢,所以呢,只能從最近的那個操作進行計算。1次query即可#include<cstdio>#include<cstring>#include<algorithm>#define left
做法:這裡的區間合并要考慮左區間的最右值和右區間的最右值,看兩個區間是否可以靠相合形成一個新序列#include<cstdio>#include<cstring>#define left l,m,x<<1#define right m+1,r,x<<1|1const int LMT=100003;int msum[LMT<<2],lsum[LMT<<2],rsum[LMT<<2],rnum[LMT<<