點選開啟鏈結
題意:給個成環的字串,現在要從乙個地方斷開這個環,然後可以向左或向右走,在走的過程中c的數量要始終保持大於j的數量,問共有多少個這樣的端點
思路:沒有思路,參考了大神的思路,大神說這是水題,弱哭~~~~,這裡解釋一下l和r陣列的含義應該就可以自己把**敲出來了,貌似單調佇列考的就是這個呢,l陣列儲存的是從0到i的最小num值,num為字首和,這裡設c為1,j為-1然後求字首和,r陣列是從最後以為到i的最小num值,然後對於判斷的條件,這道題寫兩遍就行了,一次是全都向左走,另一次是全都向右走,寫了乙個第二個基本完全一樣,說一下判斷條件,對於當前節點i,它可以的情況是它到右側的最小值=0,即r[i+1]-num[i]>=0,num[i]及它前面的c和j全部去掉了,然後r[i+1]減去它就是後面最小的情況,只有大於等於0才可以繼續,然後是後邊的那部分加上前邊的部分,即num[len]-num[i]+l[i]>=0,後面剩下的和與前邊最小的相加,若小於0則說明不可以,反之你懂得,然後另乙個方向處理的相同
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int inf=0x3f3f3f3f;
const ll inf=0x3f3f3f3f3f3f3f3fll;
const int maxn=1000010;
char str[maxn];
int l[maxn],r[maxn],num[maxn],vis[maxn];
void init(int len)
int main()
num[0]=0;
int t=0;
for(int i=len-1;i>=0;i--)
init(len);
if(l[len]>=0) vis[0]=1;
for(int i=1;i=0&&num[len]-num[i]+l[i]>=0) vis[len-i]=1;
}int ans=0;
for(int i=0;i
HDU 3474 Necklace 單調佇列
一串項鍊由c和j組成,可以從某乙個位置切斷,從左或者往右收集,問有多少種合法的切割方案,滿足任意時刻c的數量不小於j的數量。單調佇列維護最小值。include include include include using namespace std const int maxn 2000010 cha...
HDU3415單調佇列
這題是單調佇列的典型運用。至於單調佇列,就是乙個雙端佇列,在隊首 f 出隊,在隊尾 b 出隊入隊,我們要維護整個佇列的元素是單調的,比如,我們要動態查詢從左向右的區間的最小值,那麼我們就要在佇列中維護乙個單調遞增的序列,從左向右列舉,佇列的元素還有乙個id值,代表這個元素在原序列中的位置,然後左邊的...
HDU 3415單調佇列
這個題目屬於常見題型,給定一組環狀數列,求出其中長度不超過k的數字之和的最大值。用到了字首和的技巧,比如要求i,j間所有數字之和,可以提前在輸入的時候計算出從0 i的數字之和及從0 j的數字之和,那麼sum i j sum j sum i 現在的問題是求出最大的sum i j 那麼我們可以固定sum...