题目链接

BZOJ3688

题解

将点排序

设\(f[i][j][0|1]\)表示以第\(i\)点结尾,有\(j\)段,最后一段上升或者下降的方案数

以上升为例

\[f[i][j][0] = \sum\limits_{k = 1}^{i - 1}\sum\limits_{y_k < y_i}f[k][j][0] + \sum\limits_{k = 1}^{i - 1}\sum\limits_{y_k < y_i}f[k][j - 1][1]
\]

\(bit\)优化成\(O(knlogn)\)

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
#include<cmath>
#include<map>
#define LL long long int
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define cls(s,v) memset(s,v,sizeof(s))
#define mp(a,b) make_pair<int,int>(a,b)
#define cp pair<int,int>
#define lbt(x) (x & -x)
using namespace std;
const int maxn = 100005,maxm = 100005,INF = 0x3f3f3f3f,P = 100007;
inline int read(){
int out = 0,flag = 1; char c = getchar();
while (c < 48 || c > 57){if (c == '-') flag = 0; c = getchar();}
while (c >= 48 && c <= 57){out = (out << 1) + (out << 3) + c - 48; c = getchar();}
return flag ? out : -out;
}
int f[maxn][12][2],N = 100000;
int S[2][2][maxn],n,x[maxn],y[maxn],id[maxn],K;
void add(int* s,int u,int v){while (u <= N) s[u] = (s[u] + v) % P,u += lbt(u);}
int query(int* s,int u){int re = 0; while (u) re = (re + s[u]) % P,u -= lbt(u); return re;}
int sum(int* s,int l,int r){return query(s,r) - query(s,l - 1);}
inline bool cmp(const int& a,const int& b){return x[a] < x[b];}
int main(){
n = read(); K = read();
REP(i,n) x[i] = read(),y[i] = read(),id[i] = i;
sort(id + 1,id + 1 + n,cmp);
REP(i,n) f[i][0][0] = f[i][0][1] = 1;
for (int k = 1; k <= K; k++){
cls(S,0);
for (int i = 1; i <= n; i++){
int u = id[i];
f[u][k][0] = (sum(S[1][0],1,y[u]) + sum(S[0][1],1,y[u])) % P;
f[u][k][1] = (sum(S[1][1],y[u],N) + sum(S[0][0],y[u],N)) % P;
add(S[0][0],y[u],f[u][k - 1][0]);
add(S[1][0],y[u],f[u][k][0]);
add(S[0][1],y[u],f[u][k - 1][1]);
add(S[1][1],y[u],f[u][k][1]);
}
}
int ans = 0;
for (int i = 1; i <= n; i++) ans = (ans + f[i][K][0] + f[i][K][1]) % P;
printf("%d\n",(ans + P) % P);
return 0;
}

最新文章

  1. 更改localhost默认打开的index.html的地址三步曲
  2. MVC数据传递和多表单
  3. [.net 面向对象编程基础] (23) 结束语
  4. GCC编译器使用
  5. AngularJS开发指南2:AngularJS初始化过程
  6. Hibernate之基于外键映射的一对一(1-1)关联关系
  7. iOS 限制textField输入的长度
  8. css应用三
  9. Vector2.Angle 的 bug
  10. Hive 编程之DDL、DML、UDF、Select总结
  11. mysql和postgresql转义字符探究
  12. JDK源码分析(3)之 ArrayList 相关
  13. html之css选择器学习
  14. [原]Jenkins(二)---jenkins之Git+maven+jdk+tomcat
  15. C# DataTable 通过Linq分组
  16. 异常+远程控制Linux-14
  17. 基于Axis1.4的webservice接口开发(接口调用)
  18. CSS相对定位|绝对定位(五)之z-index篇——张鑫旭
  19. [svc][op]磁盘Inode详解-重要
  20. HBase参数优化

热门文章

  1. bcd引导Ubuntu
  2. maven摘除jar包中配置文件
  3. fdisk命令详解
  4. Dingo Api 1.0在laravel5.2中的简单应用
  5. Aspose.words Java基于模板生成word之循环图片
  6. TeamWork#2,Week 5,Our Measurement of Contribution to the Team
  7. 2017-2018-2 1723 『Java程序设计』课程 结对编程练习-四则运算-最后阶段
  8. Spring笔记②--各种属性注入
  9. keras+theano+tensorflow+darknet
  10. 【搜索】POJ-3187 枚举全排列