BZOJ3688 折線統計

2021-07-27 17:39:26 字數 1583 閱讀 5586

portal

time limit: 10 sec  

memory limit: 256 mb

二維平面上有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 5

3 24 4

2 31 1

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

先按x座標排序 f[

i][j

][0/

1]表示前

i 個構成

j個折線,最後乙個折線為上公升/下降的方案數。 f[

i][j

][0]

=∑i−

1k=1

f[k]

[j][

0]+f

[k][

j−1]

[1](

y[k]

i]) f[

i][j

][1]

=∑i−

1k=1

f[k]

[j][

1]+f

[k][

j−1]

[0](

y[k]

>y[

i])

用個樹狀陣列維護一下就好了

#include

#include

#include

#define n 50005

#define mod 100007

#define inf 1000000001

using

namespace

std;

typedef

long

long ll;

int read()

while(isdigit(ch))

return x*f;

}int n,m,tot,ans;

int hash[n],szsz[11][2][n];

int f[n][11][2];

class pointe[n];

bool

operator

void update(int x,int y,int j,int k)

}int query(int x,int j,int k)

return rtn;

}void input_init()

int find(int x)

return rtn;

}void dp()

}for(int i=1;i<=n;i++)

printf("%d\n",ans);

}int main()

bzoj3688 折線統計

time limit 10 sec memory limit 256 mb submit 119 solved 66 submit status discuss 二維平面上有n個點 xi,yi 現在這些點中取若干點構成乙個集合s,對它們按照x座標排序,順次連線,將會構成一些連續上公升 下降的折線,設...

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...