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