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个点结尾,有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′<yi,yi′′>yiy_{i'}<y_i,y_{i''}>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+树状数组)的更多相关文章
- BZOJ3688 折线统计【树状数组优化DP】
Description 二维平面上有n个点(xi, yi),现在这些点中取若干点构成一个集合S,对它们按照x坐标排序,顺次连接,将会构成一些连续上升.下降的折线,设其数量为f(S).如下图中,1-&g ...
- 树形DP+树状数组 HDU 5877 Weak Pair
//树形DP+树状数组 HDU 5877 Weak Pair // 思路:用树状数组每次加k/a[i],每个节点ans+=Sum(a[i]) 表示每次加大于等于a[i]的值 // 这道题要离散化 #i ...
- bzoj 1264 [AHOI2006]基因匹配Match(DP+树状数组)
1264: [AHOI2006]基因匹配Match Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 793 Solved: 503[Submit][S ...
- 【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 ...
- 奶牛抗议 DP 树状数组
奶牛抗议 DP 树状数组 USACO的题太猛了 容易想到\(DP\),设\(f[i]\)表示为在第\(i\)位时方案数,转移方程: \[ f[i]=\sum f[j]\;(j< i,sum[i] ...
- 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 ...
- codeforces 597C C. Subsequences(dp+树状数组)
题目链接: C. Subsequences time limit per test 1 second memory limit per test 256 megabytes input standar ...
- HDU 2227 Find the nondecreasing subsequences (DP+树状数组+离散化)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2227 Find the nondecreasing subsequences ...
- ccpc_南阳 C The Battle of chibi dp + 树状数组
题意:给你一个n个数的序列,要求从中找出含m个数的严格递增子序列,求能找出多少种不同的方案 dp[i][j]表示以第i个数结尾,形成的严格递增子序列长度为j的方案数 那么最终的答案应该就是sigma( ...
随机推荐
- Declaration terminated incorrectly 讨厌 这样就不可以了
#include "vcl.fctreeview.hpp"#include "RM_Class.hpp"#include "RM_Common.hpp ...
- Java编程最差实践
原文地址:http://www.odi.ch/prog/design/newbies.php 每天在写Java程序, 其实里面有一些细节大家可能没怎么注意, 这不, 有人总结了一个我们编程中常见的问题 ...
- VBA 选择文件
Private Function SelectFile(ByVal strFilter As String) As String Dim FileName As Variant '打开文 ...
- socket 网络连接基础
socket 客户端 import socket 1.client = socket.socket() # socket.TCP/IP 选择连接的类型,默认为本地连接 2.client.connec ...
- mysql 5.7.10使用dbforget Studio 连接异常
提示:The 'INFORMATION_SCHEMA.SESSION_VARIABLES' feature is disabled; see the documentation for 'show_c ...
- UI5-文档-2-开发环境
这一部分将指导您安装.配置和设置SAPUI5开发环境的最常见和推荐用例. 请注意:您可以在不同的平台上使用SAPUI5.各自平台的许可和维护条件也适用于SAPUI5.例如,如果在SAP云平台上使用SA ...
- unity VideoPlayer
Events(事件) started:在调用play()后立刻调用 prepareCompleted:播放器准备完成时 seekCompleted:缓冲完成时
- git 拉取某个分支到本地
git 拉取其实只需要 git fetch origin xxx. git pull origin xxx即可
- Java HashMap,LinkedHashMap,TreeMap
Java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类,分别是HashMap Hashtable LinkedHashMap 和TreeMapMap主要用于存储健值对,根据 ...
- 关于easyui-datagrid数据表格, 分页取出数据
在制作数据表格的时候有一个这样的属性, pagination是否显示分页列表, 分页显示的时候需要分别从数据库中取数据, 每页显示几行, 即只从数据库取出几行数据来显示, 具体代码如下 1, 显示页面 ...