当前位置: 首页 > news >正文

CF1638E Colorful Operations Sol

题目链接

使用 BIT + ODT 维护的模版题。

套路

不妨将每一个点的答案拆成 \(a_x + val_{col}\),表示 \(x\) 之前累计起来的答案加上当前节点在当前颜色所产生的答案。

这个东西看似不好维护,实则可以通过一个巧妙的变化完成:记 \(tag_c\) 动态的维护当前颜色加上的值的总和。

考虑刻画一下一个点更换颜色的过程(假设节点 \(u\) 的颜色从 \(x\) 变成了 \(y\)):

  1. 加上 \(tag_x\)(下面的操作会说明这样为什么是正确的)
  2. 减去 \(tag_y\)

上面的东西显然是可以使用树状数组维护的。

然后在查询时,输出 \(a_x + tag_{col}\)。发现我们通过这样的操作,成功以一种类似于将前缀和拆开的方式,成功让 \(x\) 能够正确的记录答案。

操作实现

回到本题,具体讲讲这道题怎么操作。

对于操作1,可以转化为 ODT 的区间推平,区间修改。

对于操作2,直接将对应 tag 增加。

对于操作3,按上面所讲方式输出即可。

Code

#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false);cin.tie(0),cout.tie(0)
#define File(s) freopen(s".in","r",stdin);freopen(s".out","w",stdout)
#define LL long long
#define fi first
#define se second
#define IT set<node>::iterator
const int N = 1e6 + 10;
LL tag[N];
int n,Q;
struct BIT{LL tre[N];int lowbit(int x){ return x & (-x);}void update(int x,LL k){while(x <= n){tre[x] += k;x += lowbit(x);}return ;}LL query(int x){LL sum = 0;while(x){sum += tre[x];x -= lowbit(x);}return sum;}
}tre;
struct ODT{struct node{int l,r;mutable LL v;node(int L,int R=-1,int v=0):l(L),r(R),v(v){};bool operator < (const node &o) const{return l < o.l;}};set<node> st;IT split(int pos){IT it = st.lower_bound(node(pos));if(it != st.end() && it -> l == pos) return it;it -- ;int L,R;LL val;L = it -> l;R = it -> r;val = it -> v;st.erase(it);st.insert(node(L,pos-1,val));return st.insert(node(pos,R,val)).fi;}void assign(int l,int r,LL c){IT itr = split(r+1),itl = split(l);IT it = itl;for(;itl!=itr;itl++){int L = itl->l,R = itl->r,val = itl->v;tre.update(L,tag[val]);tre.update(R+1,-tag[val]);}tre.update(l,-tag[c]);tre.update(r+1,tag[c]);st.erase(it,itr);st.insert(node(l,r,c));return ;}int get_tag(int x){IT it = st.lower_bound(node(x));if(it != st.end() && it->l == x) return it -> v;it -- ;return it -> v;}
}odt;
int main(){IOS;cin >> n >> Q;odt.st.insert(ODT::node(1,n,1));while(Q -- ){string s;cin >> s;if(s == "Color"){int l,r,c;cin >> l >> r >> c;odt.assign(l, r, c);}else if(s == "Add"){int c;LL x;cin >> c >> x;tag[c] += x;}else{int x;cin >> x;cout << tre.query(x) + tag[odt.get_tag(x)] << "\n";}}return 0;
}

练习

P9320 EGOI 2022 Tourists / 乌托邦旅行团

http://www.jsqmd.com/news/846991/

相关文章:

  • KMS智能激活终极解决方案:告别Windows和Office激活烦恼
  • ESP32智能垃圾桶项目复盘:我是如何用FreeRTOS信号量和硬件定时器优化控制的
  • Windows 11 LTSC系统完整恢复Microsoft Store应用商店终极技术方案
  • Perplexity视频教程查询黄金公式(含动态权重算法+语义增强词库V2.3)
  • IMX6ULL网络启动全解析:从uboot环境变量到NFS根文件系统挂载的完整链路
  • 贵阳适合女生就读的职业学校综合排行一览 - 奔跑123
  • 2026年热门抠图软件怎么选?好用的抠图工具实测对比与推荐指南
  • 别再死记硬背了!用Qt Designer拖拽搞定输入和显示控件(附完整信号槽连接代码)
  • BilibiliDown终极教程:三步搞定B站视频批量下载的完整方案
  • 终极风扇控制指南:5分钟掌握FanControl的完整使用方法
  • 从信噪比到有效位数:5个动态参数搞定高速ADC(如LTC2380)性能评估
  • 1.3e2
  • 安装pycharm需要先安装python吗 装pycharm前需要装python吗
  • 网盘直链下载助手终极指南:一键获取9大网盘真实下载地址,告别限速烦恼
  • 3步搞定电脑风扇噪音!FanControl实战手册让散热与静音完美平衡
  • 2024年数学建模竞赛进阶指南:从新手到高手的赛事路径规划与实战策略
  • 影刀RPA跨境店群运营架构:TEMU与TikTok Shop高并发浏览器自动化与分布式调度系统实战教程
  • GitHub神级项目推荐:30+款AI编程工具系统提示词全公开,Cursor/Manus/Devin/Windsurf内部指令一网打尽
  • BMS实战:基于SH367309的IIC通信协议详解与SOC估算融合
  • Cesium实战:手把手封装一个带交互提示的测量工具(距离/面积/高度)
  • PlotSquared 终极指南:3步搞定 Minecraft 领地管理系统
  • 告别臃肿:如何用轻量级工具解放华硕笔记本的硬件控制权
  • 高通平台GPS性能调优实战:从CN0值到追踪灵敏度,一份给硬件工程师的避坑清单
  • 初创公司如何借助 Taotoken 多模型与透明计费控制 AI 应用开发成本
  • 影刀RPA跨境店群运营架构:Python高并发分布式调度系统与Chromium内核级别指纹环境隔离教程
  • ESP32-C3深度睡眠唤醒踩坑记:GPIO0~5始终低电平?手把手教你用Arduino框架正确配置RTC GPIO
  • Cadence Virtuoso 仿真手记:从I/V曲线到μCox、λ参数提取的保姆级避坑指南
  • 从电路开关到LabVIEW布尔:用硬件思维彻底搞懂‘机械动作’的6种模式
  • 避开这3个Visio隐藏坑,你画的深度学习架构图也能像顶会论文一样专业
  • 保姆级教程:在Qt 6.5桌面应用中集成WebRTC实现一对一视频通话(附完整源码)