传送门

简单树状数组优化dp。

注意到k很小提示我们搜(d)(d)(d)索(p)(p)(p)。


先按第一维排序。

用f[i][j][0/1]f[i][j][0/1]f[i][j][0/1]表示第i个点结尾,有j段单调区间,最后一段单调递增/递减的方案数。

然后有f[i][j][0]=∑f[i′][j][0]+∑f[i′′][j−1][1]f[i][j][0]=\sum f[i'][j][0]+\sum f[i''][j-1][1]f[i][j][0]=∑f[i′][j][0]+∑f[i′′][j−1][1],其中yi′&lt;yi,yi′′&gt;yiy_{i'}&lt;y_i,y_{i''}&gt;y_iyi′​<yi​,yi′′​>yi​,f[i][j][1]f[i][j][1]f[i][j][1]的递推同理。

这个状态转移方程直接按y坐标建立树状数组优化就行了。

代码:

#include<bits/stdc++.h>
#define N 100005
#define ll long long
#define mod 100007
using namespace std;
inline ll read(){
	ll ans=0;
	char ch=getchar();
	while(!isdigit(ch))ch=getchar();
	while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
	return ans;
}
int n,k,maxn;
ll f[N][11][2],bit[N][11][2];
struct node{int x,y;}p[N];
inline bool cmp(node a,node b){return a.x<b.x;}
inline int lowbit(int x){return x&-x;}
inline void update(int x,int k,int op,ll v){for(int i=x;i<=maxn;i+=lowbit(i))bit[i][k][op]+=v;}
inline ll query(int x,int k,int op){ll ret=0;for(int i=x;i;i-=lowbit(i))(ret+=bit[i][k][op])%=mod;return ret;}
inline int max(int a,int b){return a>b?a:b;}
int main(){
	n=read(),k=read();
	for(int i=1;i<=n;++i)p[i].x=read(),p[i].y=read(),maxn=max(maxn,p[i].y);
	sort(p+1,p+n+1,cmp);
	for(int i=1;i<=n;++i){
		update(p[i].y,0,0,f[i][0][0]=1),update(p[i].y,0,1,f[i][0][1]=1);
		for(int j=1;j<=k;++j){
			f[i][j][0]=(query(p[i].y-1,j,0)+query(p[i].y-1,j-1,1))%mod;
			f[i][j][1]=((query(maxn,j,1)-query(p[i].y,j,1)+query(maxn,j-1,0)-query(p[i].y,j-1,0))%mod+mod)%mod;
			update(p[i].y,j,0,f[i][j][0]),update(p[i].y,j,1,f[i][j][1]);
		}
	}
	ll ans=0;
	for(int i=1;i<=n;++i)(ans+=f[i][k][0]+f[i][k][1])%=mod;
	printf("%lld",ans);
	return 0;
}

2018.09.28 bzoj3688: 折线统计(dp+树状数组)的更多相关文章

  1. BZOJ3688 折线统计【树状数组优化DP】

    Description 二维平面上有n个点(xi, yi),现在这些点中取若干点构成一个集合S,对它们按照x坐标排序,顺次连接,将会构成一些连续上升.下降的折线,设其数量为f(S).如下图中,1-&g ...

  2. 树形DP+树状数组 HDU 5877 Weak Pair

    //树形DP+树状数组 HDU 5877 Weak Pair // 思路:用树状数组每次加k/a[i],每个节点ans+=Sum(a[i]) 表示每次加大于等于a[i]的值 // 这道题要离散化 #i ...

  3. bzoj 1264 [AHOI2006]基因匹配Match(DP+树状数组)

    1264: [AHOI2006]基因匹配Match Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 793  Solved: 503[Submit][S ...

  4. 【bzoj2274】[Usaco2011 Feb]Generic Cow Protests dp+树状数组

    题目描述 Farmer John's N (1 <= N <= 100,000) cows are lined up in a row andnumbered 1..N. The cows ...

  5. 奶牛抗议 DP 树状数组

    奶牛抗议 DP 树状数组 USACO的题太猛了 容易想到\(DP\),设\(f[i]\)表示为在第\(i\)位时方案数,转移方程: \[ f[i]=\sum f[j]\;(j< i,sum[i] ...

  6. 2018 CCPC网络赛 1010 hdu 6447 ( 树状数组优化dp)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=6447 思路:很容易推得dp转移公式:dp[i][j] = max(dp[i][j-1],dp[i-1][j ...

  7. codeforces 597C C. Subsequences(dp+树状数组)

    题目链接: C. Subsequences time limit per test 1 second memory limit per test 256 megabytes input standar ...

  8. HDU 2227 Find the nondecreasing subsequences (DP+树状数组+离散化)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2227 Find the nondecreasing subsequences             ...

  9. ccpc_南阳 C The Battle of chibi dp + 树状数组

    题意:给你一个n个数的序列,要求从中找出含m个数的严格递增子序列,求能找出多少种不同的方案 dp[i][j]表示以第i个数结尾,形成的严格递增子序列长度为j的方案数 那么最终的答案应该就是sigma( ...

随机推荐

  1. <、>&、<& 重定向符

    <.>&.<& 重定向符 这三个命令也是管道命令,但它们一般不常用,你只需要知道一下就ok了,当然如果想仔细研究的话,可以自己查一下资料.(本人已查过,网上也查不到相 ...

  2. 22 网络编程--TCP和UDP实现聊天例子

    1.TCP简单的一次对话,单通信 客户端: import socket HOST = 'localhost' PORT = 50006 client = socket.socket(socket.AF ...

  3. JS时间转时间戳,时间戳转时间。时间显示模式。

    函数内容 // 时间转为时间戳 function date2timestamp(datetime) { var timestamp = new Date(Date.parse(datetime)); ...

  4. app.$mount("#app") 手动挂载

    $mount()手动挂载 当Vue实例没有el属性时,则该实例尚没有挂载到某个dom中: 假如需要延迟挂载,可以在之后手动调用vm.$mount()方法来挂载.例如: new Vue({ //el: ...

  5. Vote Disk 和 OCR概述

    Oracle Clusterware由2部分组成,分别是Voting Disk和 OCR. Voting Disk里面记录着节点成员的信息. 如RAC数据库中有哪些节点成员,节点增加或者删除时也同样会 ...

  6. 刚刚安装完nginx,服务启动,通过浏览器无法访问的问题

    查看Linux服务是否启动. ps -ef | grep nginx 解决办法:1,添加 80 段端口配置 firewall-cmd --zone=public --add-port=80/tcp - ...

  7. 页面中 json 格式显示 数据

    在页面中,有时候我们需要的不仅仅是将数据显示出来,而且要以以 json 的格式显示数据,如显示接口的时候 我们需要如下显示 这个时候,主要用到了 <pre> 标签 $.get(" ...

  8. 吴裕雄 实战PYTHON编程(9)

    import cv2 cv2.namedWindow("ShowImage1")cv2.namedWindow("ShowImage2")image1 = cv ...

  9. pyplot-常用图表

    pyplot-常用图表 介绍最常用的:折线图.散点图.柱状图.直方图.饼图 的绘制 需要学习的不只是如何绘图,更是什么样的数据用什么图表显示效果最好 折线图 折线图用于显示随时间或有序类别的变化趋势 ...

  10. JavaScript实现AOP(面向切面编程,装饰者模式)

    什么是AOP? AOP(面向切面编程)的主要作用是把一些跟核心业务逻辑模块无关的功能抽离出来,这些跟业务逻辑无关的功能通常包括日志统计.安全控制.异常处理等.把这些功能抽离出来之后, 再通过“动态织入 ...