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