题目

传送门

题解

首先转化成到(0,0)(0,0)(0,0)的斜率。

那么就是求多少个点是前缀最大值。

做法是线段树,用gao(i,x)gao(i,x)gao(i,x)表示在iii区间内,之前最大值为xxx的答案。

然后发现gao(p→r,p→l→max)gao(p\to r,p\to l\to max)gao(p→r,p→l→max)就是gao(p,0)−gao(p→l,0)gao(p,0)-gao(p\to l,0)gao(p,0)−gao(p→l,0),所以直接用数组存一下gao(i,0)gao(i,0)gao(i,0)。代码极短,30行。

CODE

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100005;
int n, m, ans[MAXN<<2];
double mx[MAXN<<2];
int query(int i, int l, int r, double v) {
if(l == r) return mx[i] > v;
if(mx[i] <= v) return 0;
int mid = (l + r) >> 1;
if(mx[i<<1] <= v) return query(i<<1|1, mid+1, r, v);
return query(i<<1, l, mid, v) + ans[i]-ans[i<<1];
}
void mdf(int i, int l, int r, int x, double v) {
if(l == r) { mx[i] = v; ans[i] = 1; return; }
int mid = (l + r) >> 1;
if(x <= mid) mdf(i<<1, l, mid, x, v);
else mdf(i<<1|1, mid+1, r, x, v);
mx[i] = max(mx[i<<1], mx[i<<1|1]);
ans[i] = ans[i<<1] + query(i<<1|1, mid+1, r, mx[i<<1]);
}
int main () {
scanf("%d%d", &n, &m);
int x, y;
while(m--) {
scanf("%d%d", &x, &y);
mdf(1, 1, n, x, 1.0*y/x);
printf("%d\n", ans[1]);
}
}

最新文章

  1. 常用的Meta标签写法和作用
  2. C++中 OOP相关的类型转换
  3. Windows Azure Service Bus (1) 基础
  4. php随笔(一)
  5. 阿里云oss上传图片
  6. Android 判断app是否在前台运行
  7. git的作用和原理(待续)
  8. BAT文件执行完成后如何删除自身的解决办法
  9. 代码实现Autolayout
  10. OSPF多区域配置
  11. composer 常用命令
  12. crtmpserver通常使用基本类演示
  13. Asp.Net MVC 之 Autofac 初步使用1
  14. BT656跟BT1120和BT709有什么区别
  15. Linux下yum安装MySQL yum安装MySQL指定版本
  16. uploadify在火狐下上传不了的解决方案,java版(Spring+SpringMVC+MyBatis)详细解决方案
  17. 微信小程序入门一
  18. python Request模块
  19. 工程无法正常调试运行unknown failure at android.os.Binder.execTransact
  20. LeetCode算法题-N-ary Tree Level Order Traversal(Java实现)

热门文章

  1. Hello World详解
  2. PAT(B) 1074 宇宙无敌加法器(Java)
  3. Missing android.support.FILE_PROVIDER_PATHS meta-data 报错原因分析
  4. go String接口方法
  5. IDEA好用插件推荐
  6. Code First 下自动更新数据库结构(Automatic Migrations)
  7. PHP Math常量
  8. java EE学习之数据库操作
  9. django css
  10. webstorm处理代码冲突