HDU 3474 單調佇列

2022-04-08 20:32:13 字數 1103 閱讀 2612

點選開啟鏈結

題意:給個成環的字串,現在要從乙個地方斷開這個環,然後可以向左或向右走,在走的過程中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...