Comet OJ - Contest #14 转转的数据结构题 珂朵莉树+树状数组
题意:有两个操作
操作1:给出n个操作,将区间为l到r的数字改为x
操作2:给出q个操作,输出进行了操作1中的第x到x+y-1操作后的结果
解法:
把询问离线,按照r从小到大排序
每次询问的时候,用珂朵莉树推平区间
求和,这个我们用树状数组维护即可
树状数组求出>=l的和
- #include <bits/stdc++.h>
- #define IT set<node>::iterator
- using namespace std;
- typedef long long ll;
- const int M = 5e5 + ;
- int n, m, q;
- ll anss[M], bit[M];
- struct node{
- int l, r, w;
- mutable ll v;
- bool operator < (const node &rhs) const {
- return l < rhs.l;
- }
- };
- struct note{
- int l, r, id;
- ll v;
- }a[M], b[M];
- set <node> s;
- void add(int i, ll x) {
- if(!i) return;
- while(i <= m) {
- bit[i] += x;
- i += i & (-i);
- }
- }
- ll query(int i) {
- ll ans = ;
- while(i) {
- ans += bit[i];
- i -= i & (-i);
- }
- return ans;
- }
- IT split(int pos) {
- IT it = s.lower_bound(node{pos});
- if(it != s.end() && it->l == pos) return it;
- it--;
- int L = it->l, R = it->r, w = it->w;
- ll V = it->v;
- s.erase(it);
- s.insert(node{L, pos - , w, V});
- return s.insert(node{pos, R, w, V}).first;
- }
- void modify(int l, int r, int w, ll v) {
- IT it2 = split(r + ), it1 = split(l), it3 = it1;
- for(; it1 != it2; it1++) add(it1->w, -(it1->v) * (it1->r - it1->l + ));
- s.erase(it3, it2);
- s.insert(node{l, r, w, v});
- add(w, v * (ll)(r - l + ));
- }
- bool cmp(note p, note q) {
- return p.r < q.r;
- }
- int main(){
- scanf("%d%d%d", &m, &n, &q);
- s.insert(node{, n, , });
- for(int i = ; i <= m; i++) scanf("%d%d%lld", &a[i].l, &a[i].r, &a[i].v);
- for(int i = ; i <= q; i++) scanf("%d%d", &b[i].l, &b[i].r), b[i].id = i;
- sort(b + , b + q + , cmp);
- int j = ;
- for(int i = ; i <= q; i++) {
- while(j <= b[i].r && j <= m) modify(a[j].l, a[j].r, j, a[j].v), j++;
- //printf("anss %lld %lld\n", query(n), query(b[i].l - 1));
- anss[b[i].id] = query(m) - query(b[i].l - );
- }
- for(int i = ; i <= q; i++) printf("%lld\n", anss[i]);
- return ;
- }
Comet OJ - Contest #14 转转的数据结构题 珂朵莉树+树状数组的更多相关文章
- [数据结构]ODT(珂朵莉树)实现及其应用,带图
[数据结构]ODT(珂朵莉树)实现及其应用,带图 本文只发布于博客园,其他地方若出现本文均是盗版 算法引入 需要一种这样的数据结构,需要支持区间的修改,区间不同值的分别操作. 一般的,我们会想到用线段 ...
- Comet OJ - Contest #14
Rank38. 还是比较不满意吧,C卡了太久,E没调出来,D也没空去做了. A 签到题. #include<bits/stdc++.h> using namespace std; #def ...
- Comet OJ - Contest #14题解
Contest14的本质:区间覆盖+Tarjan( A 把距离公式两边平方即可 注意要long long code #include <algorithm> #include <io ...
- Comet OJ - Contest #6 C 一道树题 数学 + 推导
Code: #include <bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) ...
- Comet OJ - Contest #4 D求和 思维题
Code: #include <bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) ...
- Comet OJ - Contest #11 D isaster 重构树+倍增+dfs序+线段树
发现对于任意一条边,起决定性作用的是节点编号更大的点. 于是,对于每一条边,按照节点编号较大值作为边权,按照最小生成树的方式插入即可. 最后用线段树维护 dfs 序做一个区间查询即可. Code: # ...
- [转]我的数据结构不可能这么可爱!——珂朵莉树(ODT)详解
参考资料: Chtholly Tree (珂朵莉树) (应某毒瘤要求,删除链接,需要者自行去Bilibili搜索) 毒瘤数据结构之珂朵莉树 在全是珂学家的珂谷,你却不知道珂朵莉树?来跟诗乃一起学习珂朵 ...
- Comet OJ - Contest #11 题解&赛后总结
Solution of Comet OJ - Contest #11 A.eon -Problem designed by Starria- 在模 10 意义下,答案变为最大数的最低位(即原数数位的最 ...
- Comet OJ - Contest #4--前缀和
原题:Comet OJ - Contest #4-B https://www.cometoj.com/contest/39/problem/B?problem_id=1577传送门 一开始就想着暴力打 ...
随机推荐
- Redis缓存雪崩、击穿、穿透
参考大佬 前言 Redis在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在Redis的使用和原理方面对小伙伴们进行360°的刁难.作为一个在互联网公司面一次拿一次offer的面霸(请允 ...
- redis-集群(codis和Cluster)
codis 和 cluster 对比图: codis工作图: cluster工作图:(去中心化)
- 「UR#5」怎样更有力气
「UR#5」怎样更有力气 解题思路 考虑没有限制的情况,一定是把操作离线下来,按照边权从小到达做.可以发现,如果没有限制,完全图是多余的,直接拿树边进行合并就可以了.我们要做这么一件事情,把每个点属于 ...
- Teamviewer显示“未就绪,请检查您的连接”解决办法
打开TeamViewer一直提示“未就绪,请检查您的连接”,一直会弹出一个框提示检查网路设置什么. 解决办法:修改DNS为114.114.114.114,然后TeamViewer就显示网络正常. 为什 ...
- MyBatis和spring整合简单实现
spring和MyBatis整合: 导入spring和MyBatis的整合jar包,以及其依赖jar包: 导入MyBatis和spring的整合jar包. spring的核心jar包. 定义Mybat ...
- 回归写博客时间-----CeliaTodd
2019-10-17-19:28:01 记录自己的学习路程 国庆期间本来是有持续写博客的,但是有各种原因就没时间写博客了, 但是学习的进度还是没有落下的,现在正式回归写博客的时间了. 但现在不是写Py ...
- 【开发工具】- 推荐一款好用的文本编辑器[Sublime Text]
作为一个程序员除了IDE外,文本编辑器也是必不可少的一个开发工具.之前一直在用的是NotePad++.EditPlus,这两款编辑器,但是总感觉差点什么,昨天在知乎上看到有人推荐Sublime Tex ...
- js数据类型及变量知识(一)
1.js中基本数据类型有哪些? 基本数据类型: undefined.number.string.boolean.null.[object] object[引用数据类型] ...
- echarts自动播放图形
echarts中要做到自动播放的功能,首先是要实现能缩放的功能,而缩放的功能是由配置项dataZoom来控制的,而dataZoom中分为inside和slider,分别是内置的控制器和外部的控制器,内 ...
- 已知IP地址算子网掩码
子网掩码计算方法有两种: 方法一:利用子网数来计算: 1.首先,将子网数目从十进制数转化为二进制数: 2.接着,统计得到的二进制数的位数,设为N: 3.最后,先求出此IP地址对应的地址类别的子网掩码. ...