题目链接:

题意:有两个操作

操作1:给出n个操作,将区间为l到r的数字改为x

操作2:给出q个操作,输出进行了操作1中的第x到x+y-1操作后的结果

解法:

把询问离线,按照r从小到大排序

每次询问的时候,用珂朵莉树推平区间

求和,这个我们用树状数组维护即可

树状数组求出>=l的和

  1. #include <bits/stdc++.h>
  2. #define IT set<node>::iterator
  3. using namespace std;
  4. typedef long long ll;
  5. const int M = 5e5 + ;
  6. int n, m, q;
  7. ll anss[M], bit[M];
  8. struct node{
  9. int l, r, w;
  10. mutable ll v;
  11. bool operator < (const node &rhs) const {
  12. return l < rhs.l;
  13. }
  14. };
  15. struct note{
  16. int l, r, id;
  17. ll v;
  18. }a[M], b[M];
  19. set <node> s;
  20. void add(int i, ll x) {
  21. if(!i) return;
  22. while(i <= m) {
  23. bit[i] += x;
  24. i += i & (-i);
  25. }
  26. }
  27. ll query(int i) {
  28. ll ans = ;
  29. while(i) {
  30. ans += bit[i];
  31. i -= i & (-i);
  32. }
  33. return ans;
  34. }
  35. IT split(int pos) {
  36. IT it = s.lower_bound(node{pos});
  37. if(it != s.end() && it->l == pos) return it;
  38. it--;
  39. int L = it->l, R = it->r, w = it->w;
  40. ll V = it->v;
  41. s.erase(it);
  42. s.insert(node{L, pos - , w, V});
  43. return s.insert(node{pos, R, w, V}).first;
  44. }
  45. void modify(int l, int r, int w, ll v) {
  46. IT it2 = split(r + ), it1 = split(l), it3 = it1;
  47. for(; it1 != it2; it1++) add(it1->w, -(it1->v) * (it1->r - it1->l + ));
  48. s.erase(it3, it2);
  49. s.insert(node{l, r, w, v});
  50. add(w, v * (ll)(r - l + ));
  51. }
  52. bool cmp(note p, note q) {
  53. return p.r < q.r;
  54. }
  55. int main(){
  56. scanf("%d%d%d", &m, &n, &q);
  57. s.insert(node{, n, , });
  58. for(int i = ; i <= m; i++) scanf("%d%d%lld", &a[i].l, &a[i].r, &a[i].v);
  59. for(int i = ; i <= q; i++) scanf("%d%d", &b[i].l, &b[i].r), b[i].id = i;
  60. sort(b + , b + q + , cmp);
  61. int j = ;
  62. for(int i = ; i <= q; i++) {
  63. while(j <= b[i].r && j <= m) modify(a[j].l, a[j].r, j, a[j].v), j++;
  64. //printf("anss %lld %lld\n", query(n), query(b[i].l - 1));
  65. anss[b[i].id] = query(m) - query(b[i].l - );
  66. }
  67. for(int i = ; i <= q; i++) printf("%lld\n", anss[i]);
  68. return ;
  69. }

Comet OJ - Contest #14 转转的数据结构题 珂朵莉树+树状数组的更多相关文章

  1. [数据结构]ODT(珂朵莉树)实现及其应用,带图

    [数据结构]ODT(珂朵莉树)实现及其应用,带图 本文只发布于博客园,其他地方若出现本文均是盗版 算法引入 需要一种这样的数据结构,需要支持区间的修改,区间不同值的分别操作. 一般的,我们会想到用线段 ...

  2. Comet OJ - Contest #14

    Rank38. 还是比较不满意吧,C卡了太久,E没调出来,D也没空去做了. A 签到题. #include<bits/stdc++.h> using namespace std; #def ...

  3. Comet OJ - Contest #14题解

    Contest14的本质:区间覆盖+Tarjan( A 把距离公式两边平方即可 注意要long long code #include <algorithm> #include <io ...

  4. Comet OJ - Contest #6 C 一道树题 数学 + 推导

    Code: #include <bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) ...

  5. Comet OJ - Contest #4 D求和 思维题

    Code: #include <bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) ...

  6. Comet OJ - Contest #11 D isaster 重构树+倍增+dfs序+线段树

    发现对于任意一条边,起决定性作用的是节点编号更大的点. 于是,对于每一条边,按照节点编号较大值作为边权,按照最小生成树的方式插入即可. 最后用线段树维护 dfs 序做一个区间查询即可. Code: # ...

  7. [转]我的数据结构不可能这么可爱!——珂朵莉树(ODT)详解

    参考资料: Chtholly Tree (珂朵莉树) (应某毒瘤要求,删除链接,需要者自行去Bilibili搜索) 毒瘤数据结构之珂朵莉树 在全是珂学家的珂谷,你却不知道珂朵莉树?来跟诗乃一起学习珂朵 ...

  8. Comet OJ - Contest #11 题解&赛后总结

    Solution of Comet OJ - Contest #11 A.eon -Problem designed by Starria- 在模 10 意义下,答案变为最大数的最低位(即原数数位的最 ...

  9. Comet OJ - Contest #4--前缀和

    原题:Comet OJ - Contest #4-B https://www.cometoj.com/contest/39/problem/B?problem_id=1577传送门 一开始就想着暴力打 ...

随机推荐

  1. Redis缓存雪崩、击穿、穿透

    参考大佬 前言 Redis在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在Redis的使用和原理方面对小伙伴们进行360°的刁难.作为一个在互联网公司面一次拿一次offer的面霸(请允 ...

  2. redis-集群(codis和Cluster)

    codis 和 cluster 对比图: codis工作图: cluster工作图:(去中心化)

  3. 「UR#5」怎样更有力气

    「UR#5」怎样更有力气 解题思路 考虑没有限制的情况,一定是把操作离线下来,按照边权从小到达做.可以发现,如果没有限制,完全图是多余的,直接拿树边进行合并就可以了.我们要做这么一件事情,把每个点属于 ...

  4. Teamviewer显示“未就绪,请检查您的连接”解决办法

    打开TeamViewer一直提示“未就绪,请检查您的连接”,一直会弹出一个框提示检查网路设置什么. 解决办法:修改DNS为114.114.114.114,然后TeamViewer就显示网络正常. 为什 ...

  5. MyBatis和spring整合简单实现

    spring和MyBatis整合: 导入spring和MyBatis的整合jar包,以及其依赖jar包: 导入MyBatis和spring的整合jar包. spring的核心jar包. 定义Mybat ...

  6. 回归写博客时间-----CeliaTodd

    2019-10-17-19:28:01 记录自己的学习路程 国庆期间本来是有持续写博客的,但是有各种原因就没时间写博客了, 但是学习的进度还是没有落下的,现在正式回归写博客的时间了. 但现在不是写Py ...

  7. 【开发工具】- 推荐一款好用的文本编辑器[Sublime Text]

    作为一个程序员除了IDE外,文本编辑器也是必不可少的一个开发工具.之前一直在用的是NotePad++.EditPlus,这两款编辑器,但是总感觉差点什么,昨天在知乎上看到有人推荐Sublime Tex ...

  8. js数据类型及变量知识(一)

    1.js中基本数据类型有哪些?    基本数据类型:        undefined.number.string.boolean.null.[object] object[引用数据类型]       ...

  9. echarts自动播放图形

    echarts中要做到自动播放的功能,首先是要实现能缩放的功能,而缩放的功能是由配置项dataZoom来控制的,而dataZoom中分为inside和slider,分别是内置的控制器和外部的控制器,内 ...

  10. 已知IP地址算子网掩码

    子网掩码计算方法有两种: 方法一:利用子网数来计算: 1.首先,将子网数目从十进制数转化为二进制数: 2.接着,统计得到的二进制数的位数,设为N: 3.最后,先求出此IP地址对应的地址类别的子网掩码. ...