CF981G Magic multisets

近似某月赛 Erisrqnis

首先想到树套树,空间爆炸,排除。

用一棵线段树维护区间集合答案,支持 × 2 \times 2 ×2 和 + 1 +1 +1 操作。

怎样维护区间集合添加操作呢,观察到加的数都是同一个数,考虑一个数据结构,建 n n n 个,维护每个颜色的出现区间,加数即区间推平。

考虑到经典 trick 颜色端均摊,即 ODT,每次推平最多增加 O ( 1 ) \mathcal O(1) O(1) 个区间,每个区间删除 O ( 1 ) \mathcal O(1) O(1) 次,时间复杂度均摊正确。

综上,ODT 维护颜色的出现区间,线段树维护答案。

时间复杂度 O ( n ) \mathcal O(n) O(n)。

#include <bits/stdc++.h>using namespace std;typedef long long ll;
#define he putchar('\n')
#define ha putchar(' ')namespace Fread
{const int SIZE = 1 << 23;char buf[SIZE], *S, *T;inline char getchar(){if (S == T){T = (S = buf) + fread(buf, 1, SIZE, stdin);if (S == T)return '\n';}return *S++;}
}namespace Fwrite
{const int SIZE = 1 << 23;char buf[SIZE], *S = buf, *T = buf + SIZE;inline void flush(){fwrite(buf, 1, S - buf, stdout);S = buf;}inline void putchar(char c){*S++ = c;if (S == T)flush();}struct NTR{~NTR(){flush();}} ztr;
}#ifdef ONLINE_JUDGE
#define getchar Fread::getchar
#define putchar Fwrite::putchar
#endifinline int read()
{int x = 0;char c = getchar();while(c < '0' || c > '9')c = getchar();while(c >= '0' && c <= '9'){x = (x << 3) + (x << 1) + (c ^ 48);c = getchar();}return x;
}inline void write(int x)
{if(x < 0){putchar('-');x = -x;}if(x > 9) write(x / 10);putchar(x % 10 + 48);
}const ll _ = 2e5 + 1, mod = 998244353;int n, q;int tr[_ << 2], t1[_ << 2], t2[_ << 2];void build(int o, int l, int r)
{if(l == r) return;int mid = (l + r) >> 1;t1[o] = 0, t2[o] = 1;build(o << 1, l, mid), build(o << 1 | 1, mid + 1, r);
}void push1(int o, int l, int r, ll v)
{if(!v) return;t1[o] = (t1[o] + v) % mod;tr[o] = (tr[o] + 1ll * (r - l + 1) * v) % mod;
}void push2(int o, ll v)
{if(v == 1) return;t1[o] = 1ll * t1[o] * v % mod;t2[o] = 1ll * t2[o] * v % mod;tr[o] = 1ll * tr[o] * v % mod;
}void pushdown(int o, int l, int r)
{int mid = (l + r) >> 1;push2(o << 1, t2[o]), push2(o << 1 | 1, t2[o]), t2[o] = 1;push1(o << 1, l, mid, t1[o]), push1(o << 1 | 1, mid + 1, r, t1[o]), t1[o] = 0;
}void upd(int o, int l, int r, int L, int R, int v, int id)
{if(L <= l && r <= R){if(id == 1) push1(o, l, r, v);else push2(o, v);return;}pushdown(o, l, r);int mid = (l + r) >> 1;if(L <= mid) upd(o << 1, l, mid, L, R, v, id);if(R > mid) upd(o << 1 | 1, mid + 1, r, L, R, v, id);tr[o] = (tr[o << 1] + tr[o << 1 | 1]) % mod;
}int qry(int o, int l, int r, int L, int R)
{if(L <= l && r <= R) return tr[o];pushdown(o, l, r);int mid = (l + r) >> 1, res = 0;if(L <= mid) res = qry(o << 1, l, mid, L, R);if(R > mid) res = (res + qry(o << 1 | 1, mid + 1, r, L, R)) % mod;return res % mod;
}struct Odt
{#define It set<odt>::iteratorstruct odt{int l, r, v;odt(int L = 0, int R = 0, int V = 0) { l = L, r = R, v = V; }friend bool operator < (const odt &a, const odt &b) { return a.l < b.l; }};set<odt> s;void init() { s.insert(odt(1, n, 0)); }It split(int x){It it = s.lower_bound(odt(x, 0, 0));if(it != s.end() && it -> l == x) return it;--it;int L = it -> l, R = it -> r, V = it -> v;s.erase(it), s.insert(odt(L, x - 1, V));return s.insert(odt(x, R, V)).first;}void assign(int l, int r){It itr = split(r + 1), itl = split(l);for(It it = itl; it != itr; ++it)if(!(it -> v)) upd(1, 1, n, it -> l, it -> r, 1, 1);else upd(1, 1, n, it -> l, it -> r, 2, 0);s.erase(itl, itr), s.insert(odt(l, r, 1));}
} t[_];signed main()
{n = read(), q = read();build(1, 1, n);for(int i = 1; i <= n; ++i) t[i].init();int opt, l, r, x;while(q--){opt = read(), l = read(), r = read();if(opt == 1)x = read(), t[x].assign(l, r);elsewrite(qry(1, 1, n, l, r)), he;}return 0;
}

CF981G Magic multisets相关推荐

  1. CodeForces - 981G Magic multisets

    假设我们可以对每个位置快速维护一个数组,记录每个位置有哪些值是已经出现了的,哪些值是没有出现的,这样就可以决定修改的时候到底是 *2 还是 +1了. 但是很可惜,并不存在功能这么强大的数组,所以只能另 ...

  2. Educational Codeforces Round 9 F. Magic Matrix 最小生成树

    F. Magic Matrix 题目连接: http://www.codeforces.com/contest/632/problem/F Description You're given a mat ...

  3. 我花了三个小时写了一道题的六千字题解....(POJ 2888 Magic Bracelet)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 前置知识:小学生都能看懂的群论从入门到升天教程 <群论全家桶> 一道简单的题目 Probl ...

  4. 安装报错_RG Magic Bullet安装报错修复方法

    RG Magic Bullet安装报错修复方法 安装和谐版红巨星插件发现有很大的概率报错.这几天重装电脑被这个插件搞得头大.网上查了一些排除错误的方法,基本错误可以靠删除一些重复的文件夹和老版本来修复 ...

  5. magic系统将来能升鸿蒙,荣耀30和V30将首批搭载Magic UI 4.0 后续可升级鸿蒙系统

    腾讯科技讯 9月10日下午15点30分,华为消费者业务软件部总裁王成录在华为开发者大会上发表了题为<连接无限可能-全场景终端软件发布>的主题演讲,EMUI 11和Magic UI 4.0同 ...

  6. 全球首个Magic Leap One体验:吓到你不敢进房间

    来源:智东西 概要:业内备受关注的AR技术公司Magic Leap,在获得19亿美元融资历经七年之后,终于放出其第一款头盔产品Magic Leap One,很快在科技圈.VR圈引起刷屏式关注. 昨夜, ...

  7. 吊打Magic Leap,微软HoloLens 2不只为炫技

    近几日网上关于HoloLens 2的话题颇多.Infinite Retina联合创始人,拥有40多万关注者的Robert Scoble发推写道,HoloLens 2一出,Magic Leap就没那么& ...

  8. 新产品扑朔迷离,Magic Leap又跑去收购3D扫描公司

    Magic Leap收购Dacuda的3D扫描资产,很可能是为了解决其产品的位置追踪问题. 对于神秘的AR公司Magic Leap来说,他们的一举一动都会成为科技圈的头条,上周被外媒曝出产品原型机,不 ...

  9. 终于要揭开神秘面纱?Magic Leap将要展示产品

    Magic Leap准备下周召开董事会,并且会在会议上展示Magic Leap的原型机 "PEQ ". 自打去年年底被爆出产品无法小型化的问题之后,Magic Leap沉寂了一段时 ...

最新文章

  1. java好用的hbase库_Hbase入库基于java
  2. Python中的*args和**kwargs是什么?该如何使用?
  3. id 怎么获取jira 评论_一篇文章教会你使用Python定时抓取微博评论
  4. python到底能用来做啥-Python那么火,到底能用来做什么?
  5. 19 个 JavaScript 常用的简写技术
  6. Google首席软件工程师Joshua Bloch谈如何设计一款优秀的API【附PPT】
  7. 那些年我用过的SAP IDE 1
  8. 自主学习 提问的智慧——学习中遇到难题怎么破?
  9. 前端node 和vue开发之环境搭建
  10. 重磅!K8S 1.18版本将内置支持SideCar容器。
  11. java空心菱形_java 空心菱形
  12. java图形用户登录界面_Java简单登录图形界面
  13. 【飞秋】使用C++语言创建Silverlight中的VisualState
  14. javaSE----for,wile ,do while循环的应用
  15. 【ISL-1】统计学习概览
  16. beetl java例子_初识Java模板引擎Beetl之简单示例
  17. Windows Phone 7 使用Perst数据库的Demo——流水账
  18. 酒店管理系统需求分析
  19. NPDP|程序员转产品经理好转吗?
  20. ESP32-C3入门教程 IoT篇⑤——阿里云 物联网平台 EspAliYun RGB LED 实战之设备生产流程

热门文章

  1. 开发ASP.NET博客的第四步——用VS2005建立解决方案(二)(转)
  2. 【转存】WIN10自带虚拟机Hyper-v的使用与创建Linux虚拟机
  3. java写冒泡排序及时间复杂度
  4. 使用canvas画图形
  5. 多人编辑同一个md_HackMD:支持协作的超级好用在线Markdown编辑器
  6. B站直播从0到1000万的技术演进
  7. 连续型随机变量函数的分布
  8. html5有哪些新特性、移除了那些元素?如何处理HTML5新标签的浏览器兼容问题?如何区分 HTML 和HTML5?
  9. 什么是动态语言和静态语言?静态语言动态语言的区别
  10. json Schema 数据校验工具