题目描述

巨酱有 n 副耳机,他把它们摆成了一列,并且由 1 到n依次编号。每个耳机有一个玄学值,反映了各自的一些不可名状的独特性能。玄学值都是 0 到 m-1 间的整数。在外界的作用下(包括但不限于换线、上放、更换电源为核电、让kAc叔叔给它们讲故事),这些耳机的玄学值会发生改变。特别地,巨酱观察发现,每种作用 o 对应了两个整数 ao与 bo,在这种作用之后,玄学值原本为 x 的耳机,其玄学值恰会变成 (aox+bo)modm。

巨酱对他手头耳机的表现并不满意,遗憾的是,最近他并不有钱,无法任性,不能赶紧买买买以满足自己。手头紧张的他准备拟定一个相对经济的方案,通过各种作用来改善他手头玩具的性能。具体地说,为了尽快完成方案的制订,巨酱希望自己能高效地完成以下工作:

巨酱想到了一种操作,能让耳机的玄学值由 x 变为 (ax+b)modm,并且他计划对编号为 i 到 j 的耳机执行这种操作。
巨酱想知道如果将(并且仅将)自己的第 i 个到第 j 个计划按顺序付诸行动,编号为 k 的耳机的玄学值将会变成多少。
出于著名算法竞赛选手的矜持,巨酱表示自己才不需要你的帮助。但是如果巨酱真的厌倦了自己的玩具,它们就会被50包邮出给主席。为了不让后者白白捡到便宜,你考虑再三还是决定出手。

题解

二进制分组的思想。

用线段树维护时间的操作序列,每次操作一个一个往线段树里面插,等到一个线段被插满的时候用归并来维护区间的信息。查询的时候如果一个线段没有被插满就递归下去。定位到一个区间的时候在区间里面归并出来的信息二分。

代码

 1 #include <cstdio>
 2
 3 #define maxn 100010
 4 #define maxm 600010
 5 #define R register
 6 int x[maxn], tnum;
 7 struct Seg {
 8     int l, r, a, b;
 9 } p[maxn * 200];
10 int lef[maxm << 2], rig[maxm << 2], pcnt, ta, tb, ql, qr, n, m, k, ans;
11 void update(R int o, R int l, R int r)
12 {
13     lef[o] = pcnt + 1;
14     for (R int i = lef[o << 1], j = lef[o << 1 | 1], head = 1; i <= rig[o << 1] || j <= rig[o << 1 | 1]; )
15         if (p[i].r <= p[j].r)
16         {
17             p[++pcnt] = (Seg) {head, p[i].r, 1ll * p[i].a * p[j].a % m, (1ll * p[j].a * p[i].b + p[j].b) % m};
18             head = p[i].r + 1;
19             p[i].r == p[j].r ? ++j : 0; ++i;
20         }
21         else
22         {
23             p[++pcnt] = (Seg) {head, p[j].r, 1ll * p[i].a * p[j].a % m, (1ll * p[j].a * p[i].b + p[j].b) % m};
24             head = p[j].r + 1; ++j;
25         }
26     rig[o] = pcnt;
27 }
28 int find(R int o, R int t, R int &s)
29 {
30     R int l = lef[o], r = rig[o];
31     while (l < r)
32     {
33         R int mid = l + r >> 1;
34         if (t <= p[mid].r) r = mid;
35         else l = mid + 1;
36     }
37 //    printf("%d %d t %d s %d %d %d\n", p[l].l, p[l].r, t, s, p[l].a, p[l].b);
38     s = (1ll * s * p[l].a + p[l].b) % m;
39 }
40 void modify(R int o, R int l, R int r, R int t)
41 {
42     if (l == r)
43     {
44         lef[o] = pcnt + 1;
45         ql > 1 ? p[++pcnt] = (Seg) {1, ql - 1, 1, 0}, 1: 0;
46         p[++pcnt] = (Seg) {ql, qr, ta, tb};
47         qr < n ? p[++pcnt] = (Seg) {qr + 1, n, 1, 0}, 1: 0;
48         rig[o] = pcnt;
49         return ;
50     }
51     R int mid = l + r >> 1;
52     if (t <= mid) modify(o << 1, l, mid, t);
53     else modify(o << 1 | 1, mid + 1, r, t);
54
55     if (t == r) update(o, l, r);
56 }
57 void query(R int o, R int l, R int r)
58 {
59     if (ql <= l && r <= qr)
60     {
61         find(o, k, ans);
62         return ;
63     }
64     R int mid = l + r >> 1;
65     if (ql <= mid) query(o << 1, l, mid);
66     if (mid < qr) query(o << 1 | 1, mid + 1, r);
67 }
68 int main()
69 {
70     R int type; scanf("%d%d%d", &type, &n, &m);
71     for (R int i = 1; i <= n; ++i) scanf("%d", &x[i]);
72     R int Q; scanf("%d", &Q);
73     for (R int QQ = 1; QQ <= Q; ++QQ)
74     {
75         R int opt, l, r; scanf("%d%d%d", &opt, &l, &r);
76         type & 1 ? l ^= ans, r ^= ans : 0;
77         if (opt == 1)
78         {
79             scanf("%d%d", &ta, &tb); ++tnum; ql = l; qr = r;
80             modify(1, 1, Q, tnum);
81         }
82         else
83         {
84             scanf("%d", &k); type & 1 ? k ^= ans : 0; ql = l; qr = r;
85             ans = x[k];
86             query(1, 1, Q);
87             printf("%d\n", ans);
88         }
89     }
90     return 0;
91 }

转载于:https://www.cnblogs.com/cocottt/p/7044635.html

【UOJ #46】 【清华集训2014】玄学相关推荐

  1. [BZOJ3811][UOJ#36][清华集训2014]玛里苟斯(期望 + 线性基)

    Address BZOJ 3811 UOJ #36 Solution 看到异或,首先想到拆位 下面 xor ( A ) \text{xor}(A) xor(A) 表示子集 A A A 的异或和, b ...

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

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

  3. 清华集训2014 玛里苟斯

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

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

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

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

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

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

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

  7. UOJ#37. 【清华集训2014】主旋律

    题目大意: 传送门 题解: 神题--Orz. 首先正难则反. 设$f_S$表示选取点集状态为s时,这部分图可以构成非强联通图的方案数. 设$p_{S,i}$表示点集s缩点后有i个入度为0点的方案数,保 ...

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

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

  9. UOJ46. 【清华集训2014】玄学

    传送门 Sol 考虑对于操作时间建立线段树,二进制分组 那么现在主要的问题就是怎么合并信息 你发现一个性质,就是每个修改只会在整个区间内增加两个端点 那么我们二进制分组可以得到每个区间内最多只有区间长 ...

最新文章

  1. 损失函数(损失函数、代价函数、目标函数)、​​​​​​​MSE、0-1损失函数、绝对误差损失函数、分位数损失函数、Huber损失函数、感知损失函数、Hinge损失函数、指数损失函数、对数损失函数
  2. tweak 项目 快速搭建CocoaAsyncSocket(建连、断开、重连、心跳、通用请求)
  3. 谈谈Java运行机制
  4. MTK深圳公司嵌入式软件工程师笔试题(含部分答案)
  5. UVa1467 Installations(贪心)
  6. Silverlight DataGrid超出列表高度时自动滚屏
  7. JS对象与Dom对象与jQuery对象之间的区别
  8. VTK:vtkSelectPolyData选择多数据用法实战
  9. 移动开发新利器 | 一文深入了解 Flutter 界面开发
  10. 深入react技术栈(8):事件系统
  11. Java和SOA的面试总结和个人理解
  12. Gartner 2018 年WAF魔力象限报告:云WAF持续增长,Bot管理与API安全拥有未来
  13. js储存数据sessionStorage,localStorage
  14. 写给新入职的毕业生们
  15. Linux内核等待队列wait_queue学习
  16. 线程中sleep导致崩溃是一种错觉
  17. 使用yuicompressor-maven-plugin压缩js及css文件
  18. 笔记本电池不充电了 无法充电 如何激活
  19. esxi install DS3615XS
  20. 【涨粉10万】CSDN年度总结——再见2021

热门文章

  1. PG::My-CMSMS
  2. 在VirtualBox安装华为openGauss(基于华为指导手册)
  3. ppt编写一个抽奖系统
  4. 人生苦短_感叹人生苦短的句子
  5. macOS Mojave 尝鲜记,一文知晓 macOS 升级重装的正确姿势
  6. FixtureTool
  7. 虚幻4(UE4)BSP画刷
  8. 苹果8p电池多少毫安的_iPhone12续航实测,不比安卓机差多少,苹果优化能力一流|iphone12|续航|安卓机|电池|安卓手机...
  9. 商务智能:实现企业全球竞争优势的数据分析方法
  10. 微信小程序模板消息41003 page路径错误解决办法