让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 ;
}

Naive Operations HDU6315 (杭电多校2G)的更多相关文章

  1. 可持久化线段树的学习(区间第k大和查询历史版本的数据)(杭电多校赛第二场1011)

    以前我们学习了线段树可以知道,线段树的每一个节点都储存的是一段区间,所以线段树可以做简单的区间查询,更改等简单的操作. 而后面再做有些题目,就可能会碰到一种回退的操作.这里的回退是指回到未做各种操作之 ...

  2. 杭电多校第二场 hdu 6315 Naive Operations 线段树变形

    Naive Operations Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 502768/502768 K (Java/Other ...

  3. 2018 Multi-University Training Contest 2 杭电多校第二场

    开始逐渐习惯被多校虐orz  菜是原罪 1004  Game    (hdoj 6312) 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6312 虽然披着 ...

  4. 2018 Multi-University Training Contest 1 杭电多校第一场

    抱着可能杭电的多校1比牛客的多校1更恐怖的想法 看到三道签到题 幸福的都快哭出来了好吗 1001  Maximum Multiple(hdoj 6298) 链接:http://acm.hdu.edu. ...

  5. 2018 杭电多校2 - Naive Operations

    题目链接 Problem Description In a galaxy far, far away, there are two integer sequence a and b of length ...

  6. 2018 Multi-University Training Contest 9 杭电多校第九场 (有坑待补)

    咕咕咕了太久  多校博客直接从第三场跳到了第九场orz 见谅见谅(会补的!) 明明最后看下来是dp场 但是硬生生被我们做成了组合数专场…… 听说jls把我们用组合数做的题都用dp来了遍 这里只放了用组 ...

  7. hdu6356 Glad You Came 杭电多校第五场 RMQ ST表(模板)

    Glad You Came Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) ...

  8. 2019杭电多校&CCPC网络赛&大一总结

    多校结束了, 网络赛结束了.发现自己还是太菜了,多校基本就是爆零和签到徘徊,第一次打这种高强度的比赛, 全英文,知识点又很广,充分暴露了自己菜的事实,发现数学还是很重要的.还是要多刷题,少玩游戏. 网 ...

  9. 杭电多校第一场-B-Operation

    题目描述 There is an integer sequence a of length n and there are two kinds of operations:0 l r: select ...

随机推荐

  1. 【kindle笔记】之 《黑客微百科》-2018-6-17

    前段时间复习六级的时候,从图书馆看到一本书,然后带回来了.今天开始读.今天是2018年6月17日. 严格来讲,一本不算kindle笔记的笔记,不过广义的啃豆笔记了解一下.哈哈. 首页说到的黑客理念是: ...

  2. 搭建RISC-V错误记录

    错误:riscv64-unknown-elf-gcc: Command not found 解决办法:将riscv64-unknown-elf-gcc文件拷贝到根目录的/bin目录下. 原因是make ...

  3. Linux reboot与init 6区别

    Reboot与init 6的区别 - flyingcloud_2008的专栏 - CSDN博客https://blog.csdn.net/flyingcloud_2008/article/detail ...

  4. ShowDoc上手

    ShowDoc是什么 每当接手一个他人开发好的模块或者项目,看着那些没有写注释的代码,我们都无比抓狂.文档呢?!文档呢?!Show me the doc !! 程序员都很希望别人能写技术文档,而自己却 ...

  5. js数据放入缓存,需要再调用

    再贴代码之前先描述下,这个技术应用的场景:一个页面的http请求次数能少点就少,这样大大提高用户体验.所以再一个页面发起一个请求,把所有数据都拿到后储存在缓存里面,你想用的时候再调用出来,这个是非常好 ...

  6. MyEclipse 10.X激活方法

    普遍的激活办法请参考: http://blog.csdn.net/miss_kun/article/details/51819206 http://jingyan.baidu.com/article/ ...

  7. 【学亮IT手记】利用字节流复制图片

  8. cordova微信支付回调App闪退

    这是cordova版本太高,不兼容这个插件所导致的.解决方案是修改$your_project/plugins/cordova-plugin-wechat/scripts/android-install ...

  9. 【纪录】Proxychain4 使用部署以及利用 ss 加速下载操作

    我觉得这个方案用来解决 linux 机器上面 apt-get 和 yum 国外源拉去取过慢的问题还是还不错的. 参看下面两个教程. Reference: https://brickyang.githu ...

  10. k8s使用glusterfs做存储

    一.安装glusterfs https://www.cnblogs.com/zhangb8042/p/7801181.html 环境介绍; centos 7 [root@k8s-m ~]# cat / ...