题面描述

给定一个\(n\)阶排列\(b\),要求维护一个初值全为\(0\)的数组\(\{a_i\}\),支持\(q\)次如下操作:

  • 给出\(l,r\),将\(a_l,a_{l+1},......,a_{r-1},a_r\),全部+1
  • 给出\(l,r\),查询\(\sum_{i=l}^{r} \lfloor \frac{{b[i]}}{a[i]} \rfloor\)

    输入格式

    第一行输入两个整数\(n,q\)
    第二行\(n\)个正整数表示排列\(b\)。
    接下来\(q\)行,每行三个正整数\(op,l,r,op=1\)表示第一种操作,\(op=2\)表示第二种操作

    输出格式

    对于每次询问,输出一行一个非负整数表示答案。

    数据规模

    对于$%30 $的数据,\(1\leq n,q \leq 3000.\)
    对于另外\(\%30\)的数据,当\(op=2\)时,有\(l=1,r=n\)
    对于\(\%100\)的数据,\(1\leq n,q \leq 3\times 10^5,op\in\{1,2\},1\leq l \leq r \leq n.\)

    样例输入

    5 10
    1 5 2 4 3
    1 1 4
    2 1 4
    1 2 5
    1 3 5
    2 1 5
    1 2 4
    2 1 4
    1 2 5
    1 2 2
    2 1 5

    样例输出

    1
    2
    4
    6

    题解

    考试的时候爆掉了。。。卡常是真的恶心QAQ
    先考虑部分分的做法
    对于3000以内的数据,我们直接暴力循环。比较闲的同学可以考虑写两个线段树,一个用来更新a数组的值,另一个用来维护a[i]/b[i]。
    对于查询操作恒查询整个区间的数据,我们可以只维护一个线段树,用于维护a数组,并区间查询整个区间的ans即可。
    ---------------------------以下是正解部分-----------------------------
    观察原式可以发现,我们最后的取值要向下取整,则每一个位置\(i\)产生更多贡献的唯一办法就是使a[i]成为b[i]的k倍(k>0)。因此,我们用一个线段树记录b[i]的值,用数组记录b的原值,同时用另一棵线段树维护答案,每次op=1时使区间内的每一个b[i]全部-1。当b[i]=0时我们使当前位的贡献+1,并重置b[i]的值为初始值。每次单独变换的复杂度为\(O(\log n)\),每次查询时递归进第二棵线段树中查找,因此总的复杂度是\(O(q \log^2n)\)
    为什么要用减法而不是加法呢?
    如果用加法运算我们需要同时维护maxa和minb的值,而如果用减法只用维护一个min就好了

#include<bits/stdc++.h>
#define il inline
#define re register
typedef long long ll;
using namespace std;
const int maxn = 3e5 + 10;
int n, q, ans;
int b[maxn];
int trmin[maxn<<2], tradd[maxn<<2], lazy[maxn<<2];
//
il void init() {memset(lazy, 0, sizeof(lazy));memset(trmin, 0, sizeof(trmin));memset(tradd, 0, sizeof(tradd));
}
//
il void pushup(int id) {trmin[id] = min(trmin[id<<1], trmin[id<<1|1]);tradd[id] = tradd[id<<1] + tradd[id<<1|1];return ;
}
//
il void build(int id, int l, int r) {if(l == r) {trmin[id] = b[l];return;}int mid = (l+r)>>1;build(id<<1, l, mid);build(id<<1|1, mid+1, r);pushup(id);
}
il void pushdown(int id) {if (lazy[id]) {lazy[id << 1] += lazy[id];lazy[id << 1 | 1] += lazy[id];trmin[id << 1] -= lazy[id];trmin[id << 1 | 1] -= lazy[id];lazy[id] = 0;}
}
il void update(int id, int l, int r, int x, int y) {if(trmin[id] > 1 && x <= l && r <= y) {lazy[id]++;trmin[id]--;return ;}if(trmin[id] == 1 && l == r) {tradd[id]++;trmin[id] = b[l];lazy[id] = 0;return ;}pushdown(id);int mid = (l + r) >> 1;if (x <= mid)update(id << 1, l, mid, x, y);if (y > mid)update(id << 1 | 1, mid + 1, r, x, y);pushup(id);
}
il int query(int id, int l, int r, int x, int y) {if(x <= l && r <= y) return tradd[id];if(trmin[id] == 0) update(1, 1, n, x, y);pushdown(id);int sum = 0;int mid = (l+r) >> 1;if(x <= mid) sum += query(id<<1, l, mid, x, y);if(y > mid) sum += query(id<<1|1, mid+1, r, x, y);pushup(id);return sum;
}
signed main(){init();scanf("%d%d", &n, &q);for(re int i = 1; i <= n; ++i) scanf("%d", &b[i]);build(1, 1, n);int op, l, r;while(q--) {scanf("%d%d%d", &op, &l, &r);if(op == 1)update(1, 1, n, l, r);elseprintf("%d\n", query(1, 1, n, l, r));}return 0;
}

转载于:https://www.cnblogs.com/Chen574118090/p/11563154.html

[2019长沙长郡中学集训]加法相关推荐

  1. 2021高考长郡中学成绩单查询,2021年长沙各高中高考成绩排名及放榜最新消息

    一.2020年长沙各高中高考成绩排名及放榜最新消息 长沙一中(600分上线率全省第一,一本上线率稳定增长) 在2020年的高考中,长沙一中理科最高分为696分,因全省各方面的高考信息都需要进一步的核实 ...

  2. 湖南高中计算机专业考生,湖南18人被保送清华,分别来自6所重点高中,长郡中学升学率最高...

    今年共有371人被清华和北大保送 北京大学和清华大学作为国内最知名的两所学校,相信不少拔尖的考生都梦想着能考进这两所名校之一,里面凝聚了来自五湖四海的学霸,教师资源一流,学习环境和氛围都非常优越,每年 ...

  3. 湖南长沙湖南长沙长郡中学长郡中学——循环简单普及题开业了开业了!

    循环专题练习 1.给出一个正整数,求它是几位数,并从个位开始分别打印出各位上的数字.2.编写程序,判断任一大于2的整数是质数还是合数.3.编写程序输入一系列整数,用0作结束标志,统计其中有多少个整数, ...

  4. 2021长郡浏阳中学高考成绩查询,2021长沙市高中排名一览表

    2021长沙市高中排名一览表2021-04-15 15:43:40文/董玉莹 高中对于学生的学习是影响很大的,好的高中能提供学生好的学习环境.本文整理了长沙高中排名,来看看长沙都有哪些重点高中. 长沙 ...

  5. 学子随感——遇见长郡浏阳(2)

    学子随感 4 via G1705龚星羽 星期一,多云.最高气温37℃,东风一级.上午十点,当长郡浏阳的同学热情地一把接过我手中沉重的行李时,我还在痴痴地望着长郡浏阳宏伟的大楼,默默在心里感叹:&quo ...

  6. 2019长沙理工大学计算机专业分数线,2019长沙理工大学各省各批次录取分数线汇总...

    2017年长沙各高中高考喜报汇总(持续更新) 2017年高考,湖南长沙各个高中考试情况如何呢?2017年长沙各高中高考喜报汇总见下文. 2017年湖南高考状元(文理) 2017年湖南高考状元是谁?20 ...

  7. 学子随感——遇见长郡浏阳(1)

    学子随感 1 via G1705吴佳睿 七月中旬的长沙,早晨便已热浪翻涌.烈日下的动员仪式,更因着这暖阳而激情澎湃.从学姐学长的满满回忆中,我们早已预知这场不一样的旅程即将为我们带来快乐与艰辛.当坐上 ...

  8. 学子随感——遇见长郡浏阳(3)

    学子随感 8 via G1719郭霖茜 今天是我们走进新农村的第一天,带着美好的期待和向往,开启了我们"向往的生活".正如<平凡的世界>一书中说,只有永不遏制的奋斗,才 ...

  9. 西乡中学2021艺体生高考成绩查询,2019年西乡中学特长生评分标准

    2019年西乡中学特长生评分标准 田径项目考核内容及评分标准 (一)男子 田径专项技能分值对照表,涵盖:100米.200米.400米.800米.1500米.3000米.110米栏.跳高.跳远.三级跳远 ...

最新文章

  1. python下载mp4
  2. 改变linux终端颜色
  3. 跨Hadoop平台Hive表export和import迁移
  4. mysql pdo 查询一条数据,使用 PDO 关联查询 MySQL 数据
  5. 使用逻辑回归制作评分卡
  6. mxf转换工具(Aiseesoft MXF Converter) v9.2.36
  7. 思科交换机配置命令大全
  8. 手游服务器微信互通,使命召唤手游QQ和微信可以一起玩吗
  9. APP运营推广:新APP建设之后该怎么做好品牌运营?
  10. 导入Android 项目,按钮点击事件,添加okhttp三合一,android动态修改标题
  11. Lua基础入门—— 写出自己的魔兽世界插件
  12. 内存管理中的 RSS 和 VSZ意思
  13. 数据库MySQL备份命令,手动备份MySQL数据库
  14. Ansible剧本使用
  15. mysql中varchar与oracle中varchar2区别
  16. 简要分析git作用及应公司业务要求分析,什么是响应式和虚拟dom面试题
  17. Kindle 转换器
  18. 天呐!Linus两周搞出个Git,快来看看咋用滴!
  19. 第一次工业革命(二)——蒸汽机与工厂的出现
  20. linux运维管理之监控,Linux系统运维之运维监控.pdf

热门文章

  1. Oracle PURGE子句清除回收站中的对象
  2. 如何写好技术文档——来自Google十多年的文档经验
  3. Base64加密算法原理、具体例子及Java代码
  4. HttpRestful工具类
  5. VsCode 使用less
  6. windows 如何批量修改文件后缀名?
  7. 阿里图标库在旧有的iconfont中添加新的图标
  8. 一种用于黑色素瘤预后的自动肿瘤浸润淋巴细胞开源算法
  9. linux中隐藏得木马程序,Linux远控分析
  10. 【JavaWeb - 网页编程】一 HTML技术与CSS技术