动态规划 BZOJ3688 折线统计

3688: 折线统计

Time Limit: 10 Sec  Memory Limit: 256 MB
Submit: 234  Solved: 118
[Submit][Status][Discuss]

Description

二维平面上有n个点(xi, yi),现在这些点中取若干点构成一个集合S,对它们按照x坐标排序,顺次连接,将会构成一些连续上升、下降的折线,设其数量为f(S)。如下图中,1->2,2->3,3->5,5->6(数字为下图中从左到右的点编号),将折线分为了4部分,每部分连续上升、下降。
 
现给定k,求满足f(S) = k的S集合个数。

Input

第一行两个整数n和k,以下n行每行两个数(xi, yi)表示第i个点的坐标。所有点的坐标值都在[1, 100000]内,且不存在两个点,x坐标值相等或y坐标值相等

Output

输出满足要求的方案总数 mod 100007的结果

Sample Input

5 1

5 5

3 2

4 4

2 3

1 1

Sample Output

19

HINT

对于100%的数据,n <= 50000,0 < k <= 10

Source

显然是要先按x坐标排序,这不是废话吗2333……y坐标也可以离散了在做,不过没必要

f[i][j][0]/[1]表示前i个点中,选择j段,最后一段为上升/下降的方案数

f[i][j][0]=∑(f[ii][j][0]+f[ii][j-1][1]) (ii<i且node[i].y<node[ii].y)

另一个同理

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 int n,k,ans;
 7 struct data{
 8     int x,y;
 9 }node[100010];
10 int f[100010][15][2],t[100010][15][2];
11 bool cmp(const data&aa,const data&bb){
12     return aa.x<bb.x;
13 }
14 void add(int pos,int kk,int tt,int val){
15     for(int i=pos;i<=100000;i+=i&(-i)) t[i][kk][tt]=(t[i][kk][tt]+val)%100007;
16 }
17 int ask(int pos,int kk,int tt){
18     int rt=0;
19     for(int i=pos;i;i-=i&(-i)) rt=(rt+t[i][kk][tt])%100007;
20     return rt;
21 }
22 int main(){
23     scanf("%d%d",&n,&k);
24     for(int i=1;i<=n;i++) scanf("%d%d",&node[i].x,&node[i].y);
25     sort(node+1,node+n+1,cmp);
26     for(int i=1;i<=n;i++){
27         f[i][0][0]=f[i][0][1]=1;
28         add(node[i].y,0,0,1);
29         add(node[i].y,0,1,1);
30         for(int kk=1;kk<=k;kk++){
31             f[i][kk][0]=(f[i][kk][0]+ask(node[i].y-1,kk,0)+ask(node[i].y-1,kk-1,1))%100007;
32             f[i][kk][1]=(f[i][kk][1]+ask(100000,kk,1)-ask(node[i].y,kk,1)+ask(100000,kk-1,0)-ask(node[i].y,kk-1,0))%100007;
33             if(f[i][kk][1]<0) f[i][kk][1]+=100007;//!!!
34             add(node[i].y,kk,0,f[i][kk][0]);
35             add(node[i].y,kk,1,f[i][kk][1]);
36         }
37     }
38     for(int i=1;i<=n;i++){
39         ans=(ans+f[i][k][0])%100007;
40         ans=(ans+f[i][k][1])%100007;
41     }
42     printf("%d\n",ans);
43     return 0;
44 }
时间: 2024-11-05 17:19:56

动态规划 BZOJ3688 折线统计的相关文章

BZOJ3688: 折线统计

题解: 令f[i][j][0/1]表示前i个数有j段,最后一段是下降/上升的方案数 很容易列出状态转移方程(已按x轴排序) f[i][j][0]=sigma(f[k][j][0]+f[k][j-1][1])(k<i&&a[k]>a[i]) f[i][j][1]=sigma(f[k][j][1]+f[k][j-1][1])(k<i&&a[k]<a[i]) 很明显可以用树状数组优化. 代码: 1 #include<cstdio> 2 #inc

BZOJ3688折线统计 dp+线段树

Description 二 维平面上有n个点(xi, yi),现在这些点中取若干点构成一个集合S,对它们按照x坐标排序,顺次连接,将会构成一些连续上升.下降的折线,设其数量为f(S).如下图 中,1->2,2->3,3->5,5->6(数字为下图中从左到右的点编号),将折线分为了4部分,每部分连续上升.下降.   现给定k,求满足f(S) = k的S集合个数. Input 第一行两个整数n和k,以下n行每行两个数(xi, yi)表示第i个点的坐标.所有点的坐标值都在[1, 1000

题解【bzoj3688 折线统计】

考虑 \(dp\) . 首先把所有节点按 \(x\) 从小到大排序是很有必要的. 记 f[i][j][0] 表示满足以第 \(i\) 个节点做折线结尾,选取的点集 \(S\) 满足 \(f(S)=j\) ,且最后一段折线指向右上 \(()\) 的方案数. 记 f[i][j][1] 表示满足以第 \(i\) 个节点做折线结尾,选取的点集 \(S\) 满足 \(f(S)=j\) ,且最后一段折线指向右下 \(()\) 的方案数 . 状态转移方程:(我觉得挺显然的,感性理解一下就行了 \[ f[i][

[FJSC2014]折线统计

[题目描述] 二维平面上有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, 100

BZOJ 3688 折线统计

dp[i][j][0/1]一下,然后发现可以BIT搞.注意外层for所有点. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 50050 #define mod 100007 using namespace std; int n,k,f[maxn][12][2],t[maxn<<1][12][2],mx=0; struct

echarts图表变形解决方案

在同一页面的多个echarts图在查询或切换图片时可能会变形,如图 解决方案是添加以下几行代码 /*在查询或切换统计图时图片有可能会变形,于是每次调getEchartsData()都给每个chart的宽度定义成初始值*/ $("#myChart2").css( 'width', $("#myChart2").width()); $("#myChart3").css( 'width', $("#myChart3").width(

大神刷题表

9月27日 后缀数组:[wikioi3160]最长公共子串 dp:NOIP2001统计单词个数 后缀自动机:[spoj1812]Longest Common Substring II [wikioi3160]最长公共子串 [spoj7258]Lexicographical Substring Search 扫描线+set:[poj2932]Coneology 扫描线+set+树上删边游戏:[FJOI2013]圆形游戏 结论:[bzoj3706][FJ2014集训]反色刷 最小环:[poj1734

BZOJ 3688

3688: 折线统计 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 119  Solved: 66[Submit][Status][Discuss] Description 二维平面上有n个点(xi, yi),现在这些点中取若干点构成一个集合S,对它们按照x坐标排序,顺次连接,将会构成一些连续上升.下降的折线,设其数量为f(S).如下图中,1->2,2->3,3->5,5->6(数字为下图中从左到右的点编号),将折线分为了4部分,每

JFreeChart在Struts2中实现折线图统计

在Struts2中,用JFreeChart实现折线图统计 前段时间学习了一下JFreeChart,现在来整理一下自己所作的实例. 下面分别用两种方式来实现: 一种是以java应用程序的方式,一种是以web项目程序的方式 需要加入的jar包有:  jcommon-1.0.17.jar . jfreechart-1.0.14.jar(前两个是JFreeChart中所带的,在下载的JFreeChart的lib目录下) . struts2-jfreechart-plugin-2.3.16.3.jar(这