让ci = ai / bi, 求sum(ci)的值,因为每次 ai 都是加一的,那么我可以用一颗线段树来维护每个 i 位置的 ai 距离达到 bi 还需要的数的最小值,更新是每次都减一,如果我某一个区间的最小值等于 0, 这就说明我这时候的ai已经满足了ai/bi==1的情况,那么对应的ci的位置就应该加一,所以我每次发现一个区间的最小值是0的话,我就 dfs 去找到为0的地方,把这里重新修改成bi,然后这个位置的答案+1就可以了

#include<map>
#include<set>
#include<ctime>
#include<cmath>
#include<stack>
#include<queue>
#include<string>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define first fi
#define second se
#define lowbit(x) (x & (-x)) typedef unsigned long long int ull;
typedef long long int ll;
const double pi = 4.0*atan(1.0);
const int inf = 0x3f3f3f3f;
const int maxn = ;
const int maxm = ;
const int mod = ;
using namespace std; int n, m, tol, T;
int a[maxn];
int b[maxn];
int c[maxn << ];
int sum[maxn << ];
int lazy[maxn << ]; void init() {
memset(a, , sizeof a);
memset(b, , sizeof b);
memset(c, , sizeof c);
memset(sum, inf, sizeof sum);
memset(lazy, , sizeof lazy);
} void pushup(int root) {
sum[root] = min(sum[root << ], sum[root << | ]);
c[root] = c[root << ] + c[root << | ];
} void pushdown(int root) {
if(lazy[root] != ) {
lazy[root << ] += lazy[root];
lazy[root << | ] += lazy[root];
sum[root << ] -= lazy[root];
sum[root << | ] -= lazy[root];
lazy[root] = ;
}
return ;
} void build(int left, int right, int root) {
if(left == right) {
sum[root] = b[left];
return ;
}
int mid = (left + right) >> ;
build(left, mid, root << );
build(mid+, right, root << | );
pushup(root);
} void dfs(int left, int right, int root) {
if(left == right) {
if(sum[root] == ) {
sum[root] = b[left];
c[root]++;
}
return ;
}
pushdown(root);
int mid = (left + right) >> ;
if(sum[root << ] == )
dfs(left, mid, root << );
if(sum[root << | ] == )
dfs(mid+, right, root << | );
pushup(root);
} void update(int left, int right, int prel, int prer, int root) {
if(prel <= left && right <= prer) {
lazy[root]++;
sum[root]--;
while(sum[root] == ) dfs(left, right, root);
return ;
}
pushdown(root);
int mid = (left + right) >> ;
if(prel <= mid) update(left, mid, prel, prer, root << );
if(prer > mid) update(mid+, right, prel, prer, root << | );
pushup(root);
} int query(int left, int right, int prel, int prer, int root) {
if(prel <= left && right <= prer) return c[root];
int mid = (left + right) >> ;
int ans = ;
if(prel <= mid) ans += query(left, mid, prel, prer, root << );
if(prer > mid) ans += query(mid+, right, prel, prer, root << | );
return ans;
} int main() {
while(~scanf("%d%d", &n, &m)) {
init();
for(int i=; i<=n; i++) scanf("%d", &b[i]);
build(, n, );
char str[];
while(m--) {
int l, r;
scanf("%s%d%d", str, &l, &r);
if(str[] == 'a') {
update(, n, l, r, );
} else if(str[] == 'q') {
int ans = query(, n, l, r, );
printf("%d\n", ans);
}
}
}
return ;
}

最新文章

  1. logstash file输入,无输出原因与解决办法
  2. Mysql命令大全
  3. 《UNIX环境高级编程第三版》apue.h等源码文件的编译安装
  4. JavaScript继承
  5. visor 发布
  6. grunt压缩合并代码
  7. 前端自动化工具 -- Gulp 使用简介
  8. [SAP ABAP开发技术总结]消息处理Messages
  9. 《Python 学习手册4th》 第八章 列表与字典
  10. 2002: [Hnoi2010]Bounce 弹飞绵羊 - BZOJ
  11. Html笔记(六)超链接
  12. javascrip cookie
  13. IAR Embedded Workbench for ARM 6.50.6 &amp; 6.60.1 破解补丁
  14. The Swift Programming Language-官方教程精译Swift(7)函数 -- Functions
  15. 1163: 零起点学算法70——Yes,I can!
  16. linux 编译安装详解
  17. 鹅厂优文 | 怎样用AI运维
  18. linux安装elk
  19. Linux:CPU使用率100%排查方法
  20. Linux服务器配置---安装vsftpd

热门文章

  1. 用Python删除本地目录下某一时间点之前创建的文件
  2. 【Python3练习题 016】 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
  3. babel(一)
  4. spring核心思想:IOC(控制反转)和DI(依赖注入)
  5. LLVM的安装
  6. 模仿jdk编译代码去除注释,多行注释
  7. B站弹幕姬(&#128020;)分析与开发(下篇)
  8. qtp自动化测试-条件语句 if select case
  9. Python——FTP上传和下载
  10. nginx 负载均衡(默认算法)