bzoj3688 折線統計

2021-07-09 23:02:53 字數 1274 閱讀 3047

time limit: 10 sec  

memory limit: 256 mb

submit: 119  

solved: 66 [

submit][

status][

discuss]

二維平面上有n個點(xi, yi),現在這些點中取若干點構成乙個集合s,對它們按照x座標排序,順次連線,將會構成一些連續上公升、下降的折線,設其數量為f(s)。如下圖中,1->2,2->3,3->5,5->6(數字為下圖中從左到右的點編號),將折線分為了4部分,每部分連續上公升、下降。

現給定k,求滿足f(s) = k的s集合個數。

第一行兩個整數n和k,以下n行每行兩個數(xi, yi)表示第i個點的座標。所有點的座標值都在[1, 100000]內,且不存在兩個點,x座標值相等或y座標值相等

輸出滿足要求的方案總數 mod 100007的結果

5 15 53 2

4 42 3

1 119

對於100%的資料,n <= 50000,0 < k <= 10

首先我們將點按照x軸排序。

我們也可以將縱座標離散化。

然後就可以用動態規劃解決了。

令f[i][j][0]和f[i][j][1]分別表示前i個點,選擇j段,最後一段是下降或者上公升的方案數。

狀態轉移方程如下:

f[i][j][0]=∑(f[k][j][0]+f[k][j-1][1]) (ka[i].y)

f[i][j][1]=∑(f[k][j][1]+f[k][j-1][0]) (k

很明顯可以用樹狀陣列或者線段樹優化。

#include#include#include#include#include#include#define f(i,j,n) for(int i=j;i<=n;i++)

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

#define ll long long

#define maxn 100005

#define mod 100007

using namespace std;

struct dataa[maxn];

int n,m,b[maxn];

inline int read()

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

return x*f;

}inline bool cmp(data d1,data d2)

{ return d1.x

BZOJ3688 折線統計

portal time limit 10 sec memory limit 256 mb 二維平面上有n個點 xi,yi 現在這些點中取若干點構成乙個集合s,對它們按照x座標排序,順次連線,將會構成一些連續上公升 下降的折線,設其數量為f s 如下圖中,1 2,2 3,3 5,5 6 數字為下圖中從...

bzoj3688 折線統計

二維平面上有n個點 xi,yi 現在這些點中取若干點構成乙個集合s,對它們按照x座標排序,順次連線,將會構成一些連續上公升 下降的折線,設其數量為f s 如下圖中,1 2,2 3,3 5,5 6 數字為下圖中從左到右的點編號 將折線分為了4部分,每部分連續上公升 下降。現給定k,求滿足f s k的s...

BZOJ3688 折線統計(dp bit優化)

傳送門n2 k 的dp是比較好想好寫的 f i,j,0 1 表示劃分了i段,以第j個結尾,最後一段是上公升0 下降1的方案數 f i,j,0 k i 1j 1 y k j f i,k,0 k i 1j 1 y k y j f i 1,k,1 f i,j,1 k i 1 j 1 y k j f i 1...