題目大意:
給出乙個數列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 資料物件是性質相同的資料元素的...