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