传送门

Sol

考虑对于操作时间建立线段树,二进制分组
那么现在主要的问题就是怎么合并信息
你发现一个性质,就是每个修改只会在整个区间内增加两个端点
那么我们二进制分组可以得到每个区间内最多只有区间长度级别段,每一段的修改都是一样的
那么可以直接一层层归并上来
最后询问就是二分每一个线段树的节点的询问段即可
修改复杂度 \(\Theta(n log n)\) 询问复杂度 \(\Theta(n log^2 n)\)

# include <bits/stdc++.h>
using namespace std;
typedef long long ll;namespace IO {const int maxn((1 << 21) + 1);char ibuf[maxn], *iS, *iT, obuf[maxn], *oS = obuf, *oT = obuf + maxn - 1, c, st[55];int f, tp;char Getc() {return (iS == iT ? (iT = (iS = ibuf) + fread(ibuf, 1, maxn, stdin), (iS == iT ? EOF : *iS++)) : *iS++);}void Flush() {fwrite(obuf, 1, oS - obuf, stdout);oS = obuf;}void Putc(char x) {*oS++ = x;if (oS == oT) Flush();}template <class Int> void In(Int &x) {for (f = 1, c = Getc(); c < '0' || c > '9'; c = Getc()) f = c == '-' ? -1 : 1;for (x = 0; c <= '9' && c >= '0'; c = Getc()) x = (x << 3) + (x << 1) + (c ^ 48);x *= f;}template <class Int> void Out(Int x) {if (!x) Putc('0');if (x < 0) Putc('-'), x = -x;while (x) st[++tp] = x % 10 + '0', x /= 10;while (tp) Putc(st[tp--]);}
}using IO :: In;
using IO :: Out;
using IO :: Putc;
using IO :: Flush;const int maxn(1e5 + 5);int n, q, m, a[maxn], type, cnt, nowl[maxn << 2], nowr[maxn << 2], tot, ans;struct Mdy {int r, a, b;
} mdy[maxn * 30];void Modify(int x, int l, int r, int ql, int qr, int a, int b) {if (l == r) {nowl[x] = tot + 1;if (ql > 1) mdy[++tot] = (Mdy){ql - 1, 1, 0};mdy[++tot] = (Mdy){qr, a, b};if (qr < n) mdy[++tot] = (Mdy){n, 1, 0};nowr[x] = tot;return;}register int mid = (l + r) >> 1, l1, r1, l2, r2;cnt <= mid ? Modify(x << 1, l, mid, ql, qr, a, b) : Modify(x << 1 | 1, mid + 1, r, ql, qr, a, b);if (cnt < r) return;nowl[x] = tot + 1, l1 = nowl[x << 1], r1 = nowr[x << 1], l2 = nowl[x << 1 | 1], r2 = nowr[x << 1 | 1];while (l1 <= r1 && l2 <= r2) {mdy[++tot] = (Mdy){min(mdy[l1].r, mdy[l2].r), (ll)mdy[l1].a * mdy[l2].a % m, ((ll)mdy[l1].b * mdy[l2].a + mdy[l2].b) % m};if (mdy[l1].r == mdy[l2].r) ++l1, ++l2;else mdy[l1].r < mdy[l2].r ? ++l1 : ++l2;}nowr[x] = tot;
}inline void Calc(int x, int p) {register int l = nowl[x], r = nowr[x], cur = 0, mid;while (l <= r) mdy[mid = (l + r) >> 1].r >= p ? cur = mid, r = mid - 1 : l = mid + 1;ans = ((ll)ans * mdy[cur].a + mdy[cur].b) % m;
}void Query(int x, int l, int r, int ql, int qr, int p) {if (ql <= l && qr >= r) {Calc(x, p);return;}register int mid = (l + r) >> 1;if (ql <= mid) Query(x << 1, l, mid, ql, qr, p);if (qr > mid) Query(x << 1 | 1, mid + 1, r, ql, qr, p);
}int main() {register int i, j, op, p, l, r;In(type), In(n), In(m);for (i = 1; i <= n; ++i) In(a[i]);In(q);while (q--) {In(op);if (op == 1) {In(l), In(r), In(i), In(j);if (type & 1) l ^= ans, r ^= ans;++cnt, Modify(1, 1, 100000, l, r, i, j);}else {In(l), In(r), In(p);if (type & 1) l ^= ans, r ^= ans, p ^= ans;ans = a[p], Query(1, 1, 100000, l, r, p);Out(ans), Putc('\n');}}return Flush(), 0;
}

转载于:https://www.cnblogs.com/cjoieryl/p/10088740.html

UOJ46. 【清华集训2014】玄学相关推荐

  1. 【清华集训2014】Sum)(类欧几里得算法)

    [清华集训2014]Sum 然后本质上我们需要求解的就是那个带根号式子的奇偶性,然后我们发现这个式子很像是类欧几里得算法,求解一个斜率为无理数直线下的整点个数,然后我们直接对于一般形式求解,那么就是每 ...

  2. 清华集训2014 玛里苟斯

    清华集训2014 玛里苟斯 求子集异或和k次方的期望. 异或考虑按位算贡献. 对于\(K=1\),考虑异或和\(\frac{x}{2}\)就是答案. 证明简单来说就是,你可以先打一个概率\(dp\)分 ...

  3. 【清华集训 2014】玛里苟斯(组合计数 + 线性基)

    题目链接:[清华集训 2014]玛里苟斯 推荐博客:[BZOJ 3811]玛里苟斯:线性基(详细证明) 首先想到将kkk分类讨论. k=1" role="presentation& ...

  4. 玛里苟斯[清华集训2014 Day1]

    玛里苟斯[清华集训2014 Day1] 魔法之龙玛里苟斯最近在为加基森拍卖师的削弱而感到伤心,于是他想了一道数学题. S 是一个可重集合,S={a1,a2,-,an}. 等概率随机取 S 的一个子集  ...

  5. 【清华集训2014】【BZOJ3811】玛里苟斯

    Description 魔法之龙玛里苟斯最近在为加基森拍卖师的削弱而感到伤心,于是他想了一道数学题. S 是一个可重集合,S={a1,a2,-,an}. 等概率随机取 S 的一个子集 A={ai1,- ...

  6. 【清华集训2014】【线段树】玄学

    [描述] 巨酱有n副耳机,他把它们摆成了一列,并且由1到n依次编号.每个耳机有一个玄学值,反映了各自的一些不可名状的独特性能.玄学值都是0到m−1间的整数.在外界的作用下(包括但不限于换线.上放.更换 ...

  7. 【UOJ #46】 【清华集训2014】玄学

    题目描述 巨酱有 n 副耳机,他把它们摆成了一列,并且由 1 到n依次编号.每个耳机有一个玄学值,反映了各自的一些不可名状的独特性能.玄学值都是 0 到 m-1 间的整数.在外界的作用下(包括但不限于 ...

  8. UOJ37. 【清华集训2014】主旋律

    http://uoj.ac/problem/37 题解 题目是让我们求出有多少个边集可以使这张图强连通. 先补集转化一下,求这张图不强连通的方案数. 我们考虑这样的图缩完点之后的情况,既然不强连通,那 ...

  9. 清华集训2014 day2 task1 简单回路

    题目 如题. 算法 就是刚学习的插头DP. 从前往后和从后往前分别进行一次DP. 要点 合法的括号序列只有103个 如何合并两次dp的信息 一开始犯傻了,以为当且仅当两个轮廓线的状态相同才是合法的方案 ...

最新文章

  1. 数据分析工具Pandas(2):Pandas的索引操作
  2. 实验三:实现一个大素数生成算法
  3. 实例告诉你如何把 if-else 重构成高质量代码!
  4. 服务器导出服务器时间转换浏览器端时区
  5. 吴恩达深度学习笔记3-Course1-Week3【浅层神经网络】
  6. 因为没钱买衣服,我女朋友不要我了......
  7. 后端解决跨域问题---SpringBoot
  8. 前端学习(1701):前端系列javascript之闭包
  9. 从编程语言排行来看:C/C++一直占有前三之位,为何C++不会消亡?
  10. 10、32位 x86处理器编程架构
  11. Servlet容器如何处理请求资源路径
  12. 中低频量化交易策略研发05_推进分析
  13. 比较好玩的动态添加网页元素
  14. HTML中常用的列表标签
  15. w ndows摄像头驱动怎么安,win10摄像头驱动程序怎么下载安装
  16. thinkserver TS250安装centos7.5经验
  17. 计算机解码原理图,diy制作改进的CS4398解码 DAC PCB和原理图纸
  18. windows下安装yarn
  19. [Hive SQL] 实现分组排序、分组topN
  20. bugly怎么读_腾讯Bugly学习了解

热门文章

  1. MysqL数据库密码的管理
  2. NYOJ-199 无线网络覆盖
  3. ON REG EXPRESSION.SYNTAX
  4. 用FDISK进行硬盘分区
  5. python自然语言处理.词性标注
  6. cmd运行Java中文乱码,无法加载主类Error: Could not find or load main class
  7. UOJ37. 【清华集训2014】主旋律
  8. [洛谷P4171][JSOI2010]满汉全席
  9. 实验一、词法分析实验
  10. 提高工作效率:15个有用的项目管理工具