HDU 6319題解 資料結構之雙端佇列)

2021-08-21 22:33:13 字數 2118 閱讀 5950

題意:給定乙個序列a[1..n],對於每個長度為m的連續子區間,求出區間a的最大值以及從左往右掃瞄該區間時a 的最大值的變化次數。(實際上不是輸出這個,具體的看原題吧)

1 ≤ m ≤ n ≤ 107 

題解:使用雙端佇列,由右向左維護乙個單調非遞減佇列。由區間[l, l+m)滑動到[l-1, l+m-1)時,如果a[l-1] <= a[l],則直接給a[l-1]插入到佇列首,若a[l-1] > a[i],則從佇列首將比a[l-1]小的值pop掉,然後將a[i-1]插到隊首。如果a[l+m-1]和隊尾元素相等,則將隊尾pop掉,如果不等就不用管。每push乙個非重複元素,cnt+1,每pop掉乙個數字及其所有的重複部分,cnt-1。

這樣,每個元素至多都只會被push一次,pop一次,時間複雜度o(n)

ac**:

#include#include#include#include#include#include#include#include#include#include#include#include#define ll long long

#define debug printf("debug\n")

#define for(i, s, n) for(int i = s; i < n; ++ i)

#define for(i, s, n) for(int i = s; i > n; -- i)

#define mem(a, n) memset((a), (n), sizeof(a))

const int inf = 0x3f3f3f3f;

const ll inf = 0x3f3f3f3f3f3f3f3fll;

const int mod = 1e9+7;

const int maxn = 1e7+10;

using namespace std;

typedef vectorv;

typedef vectorvv;

inline void read(int& x)

}int a[maxn];

int cnt[maxn];

int maxnum[maxn];

int dq[2*maxn];

int head = maxn, tail = maxn;

inline void dqclear()

inline void pushfront(const int& x)

inline void pushback(const int& x)

inline void popfront()

inline void popback()

inline int getfront()

inline int getback()

inline bool isempty()

int main()

else if(a[i] == maxnum)

pushback(a[i]);

}ansa += n^maxnum;

ansb += n^cnt;

for(i, n-1, 0)

int tmpmax = maxnum;

maxnum = getback();

if(maxnum != tmpmax) -- cnt;

if(a[i] < a[i+1])

else

while(!isempty() && getfront() < a[i]);

pushfront(a[i]);

++ cnt;

maxnum = getback();

}ansa += i^maxnum;

ansb += i^cnt;

}// ll ansa = 0, ansb = 0;

// for(i, 1, n+1)

// ansa += maxnum[i]^i, ansb += cnt[i]^i;

printf("%lld %lld\n", ansa, ansb);

}return 0;

}

題解 資料結構 樹狀陣列2

接著上文 說 上文題目打太多了,卡的很 這道題如果還像上一題那樣建樹狀陣列,必然超時 我們要發揮自己模仿的天分,使得原封不動地搬下來就可以a了 前面說到跟上題一樣建樹狀陣列要超時,那我們倒過來,使得單點訪問變為sum,區間修改變為update,有同學肯定想到了差分陣列 沒錯就是他 我們在區間修改,就...

暑期前專題題解 資料結構 J

並查集的乙個好題目,因為石頭剪刀布的三角關係,我們可以用0表示兩個同類,1表示被它的父親克制,2表示克制它的父親,那麼乙個節點和爺爺節點的關係就變成了,re x re pre x 3 因為並查集帶壓縮路徑,所以最後join時,最多存在乙個四邊形的關係,討論x和y的根節點是否相同即可。如下 inclu...

資料結構之雙鏈表

前面我們介紹了單鏈表,單鏈表的優點是沒有空間的限制,可以隨意開闢空間。但與我們這次要講的雙鏈表相比,就有點相形見絀了。因為哪怕是單鏈表,在進行查詢 插入 排序等等時都要進行線性表的遍歷,而我們往往需要的是目標節點的前乙個節點,所以經常一不小心就錯過了我們需要的節點,或者經常需要乙個當前節點的備份,以...