資料結構 two pointers 985E

2021-09-17 05:03:24 字數 2212 閱讀 6356

題目大意:

給出乙個數列a,要求將數列a中的元素分成若干個部分

要求:1.每個部分的最大元素最多比最小元素大d

2.每個部分最少有k個元素

3.每個元素都恰好屬於某一部分

求有無這樣的劃分

1 ≤ k ≤ n ≤ 5·1e5, 0 ≤ d ≤ 1e9,1 ≤ a

i ≤ 1e9

思考:當然第一步是排個序了,所以劃分就相當於是劃分成子數列了

然後嘛:

考慮到以第i個元素結尾的情況,

它的右邊界是i,左邊界是在[x,i-k+1]內,x是滿足a[i]-a[x]<=d的最大x

也就是說,只有前乙個子數列是以[x-1, (i-k+1 -1)] 結尾,那才有可能是以i結尾

因此dp[i]=

所以可以說單點的值影響了區間(後面的)的值,或者單點的值收到區間(前面的)的影響

於是需要單點修改,區間查詢

這個時候愚笨的我第一想到的的就是線段樹:

就知道線段樹,這個時候要介紹一種資料結構?了:two - pointers

這玩意可以分兩種:

1.單點修改,區間查詢:

其實這就是字首和,單點修改就是修改原陣列中的元素,

需要區間查詢時,就需要計算對應的字首和,用l[j]-l[i-1]計算[i,j]內的和

2.區間修改,單點查詢

然而這玩意還是字首和,對於每乙個區間修改

就a[le]+=inc,a[ri+1]-=inc;

然後計算字首和,

得出字首和l[i]就是經過區間修改後第i個元素的值

然而:這玩意不是乙個強的資料結構了,

要求(限制):

1.離線或順序

先做完全部修改,再查詢

或者像本題一樣,修改的點是有序的,並且只查詢修改過了的點(咋感覺有點像生產者-消費者問題捏)

2.沒了

最後給個**:

//problem:

//date:

//skill:

//bug:

/definations/

//迴圈控制

#define clr(a) memset((a),0,sizeof(a))

#define f(i,a,b) for(int i=a;i<=int(b);++i)

#define f2(i,a,b) for(int i=a;i>=int(b);--i)

#define re(i,n) for(int i=0;i#define pb push_back

#define x first

#define y second

using namespace std;

const int inf = 0x3f3f3f3f;

const long long llinf = 0x3f3f3f3f3f3f3f3f;

options//

typedef long long ll;

#define stdcpph

#define cpp_io

#ifdef stdcpph

#include#else

#include#include#include#include#include#include#include#ifdef cpp_io

#include#include#include#else

#include#endif

#endif

basic functions//

templateinline void in(inint &x)

while (c >= '0'&&c <= '9')

x *= f;

}templateinline void out(inint x)

added functions//

const int maxn = int(5e5+4);

int a[maxn];

ll l[maxn];

int dp[maxn];//以i結尾

int n, k, d;

ll g(int x)

ll s(int x, int y)

code/

int main()

l[i] = l[i - 1] + dp[i];

} cout << (dp[n] ? "yes" : "no") << endl;

} ///

return 0;

}

資料結構 資料結構緒論

資料結構是相互間存在一種或多種特定關係的資料元素的集合。程式設計 資料結構 演算法 資料結構是一門研究非數值計算的程式設計問題中的操作物件,以及他們之間的關係和操作等相關問題的學科。資料元素是組成資料的 有一定意義的基本單位,是計算機中通常作為整體處理,也被稱為記錄。乙個資料元素可以由若干個資料項組...

資料結構 資料結構演算法

分治法 對於乙個規模為n的問題,若該問題可以容易地解決 比如說規模n較小 則直接解決 否則將其分解為k個規模較小的子問題,這些子問題互相獨立且與原問題形式相同,遞迴地解這些子問題,然後將各子問題的解合併得到原問題的解。動態規劃法 這種演算法也用到了分治思想,它的做法是將問題例項分解為更小的 相似的子...

資料結構 01 資料與資料結構

1.資料data 資料是描述客觀事物的符號,是計算機中可以操作的物件,是能被計算機識別,並輸入給計算機處理的符號集合。2.資料元素data elements 資料元素是組成資料的 有一定意義的基本單位,在計算機中通常作為整體進行處理。3.資料物件data object 資料物件是性質相同的資料元素的...