[BZOJ2688]折线统计
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 5
3 2
4 4
2 3
1 1
Sample Output
HINT
对于100%的数据,n <= 50000,0 < k <= 10
基础的$n^2k$的dp很好想,然后你会发现每一个点的转移都是以所以y坐标小于或大于它的所有数为基础
这里可以用树状数组/线段树来优化转移、
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#define M 100010
#define mod 100007
using namespace std;
struct point{int x,y;}a[M];
bool cmp1(point a1,point a2) {return a1.x<a2.x;}
bool cmp2(point a1,point a2) {return a1.y<a2.y;}
int ans,n,m;
int f[M][][];
struct change_query
{
int val[M];
void insert(int loc,int v)
{
for(int i=loc;i<=n;i+=i&(-i))
(val[i]+=v)%=mod;
}
int query(int loc)
{
int ans=;
for(int i=loc;i>;i-=i&(-i)) (ans+=val[i])%=mod;
return ans;
}
int get(int l,int r) {return (query(r)-query(l-)+mod)%mod;}
}T[][];
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%d%d",&a[i].x,&a[i].y);
sort(a+,a++n,cmp2);
for(int i=;i<=n;i++) a[i].y=i;
sort(a+,a++n,cmp1);
for(int i=;i<=n;i++)
{
f[i][][]=f[i][][]=;
T[][].insert(a[i].y,f[i][][]);
T[][].insert(a[i].y,f[i][][]);
for(int k=;k<=m;k++)
{
int y=a[i].y;
if(y!=)
{
(f[i][k][]+=T[k][].get(,y-)+T[k-][].get(,y-))%=mod;//f[i][k][1]+=f[j][k][1]+f[j][k-1][0];
T[k][].insert(y,f[i][k][]);
}
if(y!=n)
{
(f[i][k][]+=T[k][].get(y+,n)+T[k-][].get(y+,n))%=mod;//f[i][k][0]+=f[j][k][0]+f[j][k-1][1];
T[k][].insert(y,f[i][k][]);
}
}
}
for(int i=;i<=n;i++) (ans+=f[i][m][]+f[i][m][])%=mod;
printf("%d",ans);
return ;
}
[BZOJ2688]折线统计的更多相关文章
- BZOJ3688: 折线统计
题解: 令f[i][j][0/1]表示前i个数有j段,最后一段是下降/上升的方案数 很容易列出状态转移方程(已按x轴排序) f[i][j][0]=sigma(f[k][j][0]+f[k][j-1][ ...
- 折线统计(line)
折线统计(line) 题目描述 二维平面上有n个点(xi, yi),现在这些点中取若干点构成一个集合S,对它们按照x坐标排序,顺次连接,将会构成一些连续上升.下降的折线,设其数量为f(S).如下图中, ...
- 【ybt金牌导航1-2-3】折线统计
折线统计 题目链接:ybt金牌导航1-2-3 题目大意 在一个图上有一些点,保证任意两个点的横纵坐标都不相同. 要你选一些集合,按 x 坐标排序依次连接,会构成一些连续上升下降的折线,问你折线数量是 ...
- [FJSC2014]折线统计
[题目描述] 二维平面上有n 个点(xi, yi),现在这些点中取若干点构成一个集合S,对它们按照x 坐标排序,顺次连接,将会构成一些连续上升.下降的折线,设其数量为f(S).如下图中,1->2 ...
- BZOJ3688 折线统计【树状数组优化DP】
Description 二维平面上有n个点(xi, yi),现在这些点中取若干点构成一个集合S,对它们按照x坐标排序,顺次连接,将会构成一些连续上升.下降的折线,设其数量为f(S).如下图中,1-&g ...
- 题解 bzoj3688【折线统计】
考虑 \(dp\) . 首先把所有节点按 \(x\) 从小到大排序是很有必要的. 记 f[i][j][0] 表示满足以第 \(i\) 个节点做折线结尾,选取的点集 \(S\) 满足 \(f(S)=j\ ...
- echarts 折线统计笔记
效果案例图 需要引入的js文件可以直接去官网下载 下面是代码 <!--第一步: 引入 ECharts 文件 --> <script src="static/js/myjs/ ...
- 2018.09.28 bzoj3688: 折线统计(dp+树状数组)
传送门 简单树状数组优化dp. 注意到k很小提示我们搜(d)(d)(d)索(p)(p)(p). 先按第一维排序. 用f[i][j][0/1]f[i][j][0/1]f[i][j][0/1]表示第i个点 ...
- BZOJ3688 折线统计 【dp + BIT】
题目链接 BZOJ3688 题解 将点排序 设\(f[i][j][0|1]\)表示以第\(i\)点结尾,有\(j\)段,最后一段上升或者下降的方案数 以上升为例 \[f[i][j][0] = \sum ...
随机推荐
- 使用RMySQL连接MySQL数据库(R-3.4.3)
1.安装DBI和RMySQL包(安装RMySQL时会依赖安装DBI) install.packages("RMySQL") 2.编写R脚本test.R # 使用RMySQL操作数据 ...
- svn搭建(linux下)
安装svn: 依赖包: yum install openssl openssl-devel 问题(可以忽略不计):configure: WARNING: we have configured with ...
- OVN实战---《The OVN Load Balancer》翻译
Overview 基于前面几篇文章的基础之上,我们接下来将要探索OVN中的load balancingz这一特性.但是在开始之前,我们先来回顾一下上一个lab中创建好的拓扑结构. The lab ne ...
- Shiro框架简介
Apache Shiro是Java的一个安全框架.对比另一个安全框架Spring Sercurity,它更简单和灵活. Shiro可以帮助我们完成:认证.授权.加密.会话管理.Web集成.缓存等. A ...
- 教你编译PHP7 (nginx+mysql+php7)
# 安装编译工具: yum install gcc automake autoconf libtool gcc-c++ # 安装基础库 yum install gd zlib zlib-devel o ...
- 八、网页版消息推送SDK-WebSockets
介绍 由于项目组需求.最近在研究消息推送服务平台.结合业务和使用场景分析最终选择的是 Mosquitto 消息服务器. Mosquitto 服务器的安装.配置.集群搭建 我就不在这多说了.有兴趣的可以 ...
- SDUT1607:Number Sequence(矩阵快速幂)
题目:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1607 题目描述 A number seq ...
- web Servlet 3.0 新特性之web模块化编程,web-fragment.xml编写及打jar包
web Servlet 3.0 模块化 原本一个web应用的任何配置都需要在web.xml中进行,因此会使得web.xml变得很混乱,而且灵活性差,因此Servlet 3.0可以将每个Servlet. ...
- android上传图片、视频、文件,服务端使用wcf接收
最近一直在搞android上传图片.视频.文件,服务端使用wcf接收,本文对调试中的遇到的问题进行记录. 首先android上传一些小图片是比较容易的一天下来差不多就能调试出来,但是上传一些大的文件时 ...
- Linux_Vi_命令
Linux Vi 命令 ************************************************************************* 在vi中使用命令的方法是:冒 ...