题目链接:UOJ

这题的时间线段树非常的妙。

对时间建立线段树,修改的时候在后面加,每当填满一个节点之后就合并进它的父亲。

对于一个节点维护序列,发现这是一个分段函数,合并就是归并排序。于是就形成了差不多这样的一个结构。

查询的时候在分段函数上二分。

因为每个断点至多被合并\(\log n\)次,所以时间复杂度是\(O(n\log^2n+m\log n)\)

#include<bits/stdc++.h>
#define Rint register int
using namespace std;
typedef long long LL;
const int N = 100003;
int id, tot, n, m, mod, val[N];
struct Node {
int a, b, r;
inline Node(int _a = 0, int _b = 0, int _r = 0): a(_a), b(_b), r(_r){}
inline Node operator * (const Node &o) const {
return Node((LL) a * o.a % mod, ((LL) b * o.a + o.b) % mod, min(r, o.r));
}
inline bool operator < (const Node &o) const {
if(r != o.r) return r < o.r;
if(a != o.a) return a < o.a;
return b < o.b;
}
};
vector<Node> seg[N << 2];
inline void add(int x, int l, int r, int a, int b){
seg[x].push_back(Node(1, 0, l - 1)); seg[x].push_back(Node(a, b, r)); if(r < n) seg[x].push_back(Node(1, 0, n));
}
inline void merge(vector<Node> &res, const vector<Node> A, const vector<Node> B){
int p = 0, q = 0;
while(p < A.size() && q < B.size()){
res.push_back(A[p] * B[q]);
if(A[p].r == B[q].r) ++ p, ++ q;
else if(A[p].r < B[q].r) ++ p;
else ++ q;
}
}
inline void change(int x, int L, int R, int l, int r, int a, int b){
if(L == R){add(x, l, r, a, b); return;}
int mid = L + R >> 1;
if(tot <= mid) change(x << 1, L, mid, l, r, a, b);
else change(x << 1 | 1, mid + 1, R, l, r, a, b);
if(tot == R) merge(seg[x], seg[x << 1], seg[x << 1 | 1]);
}
int ans;
inline void query(int x, int L, int R, int l, int r, int k){
if(l <= L && R <= r){
auto it = lower_bound(seg[x].begin(), seg[x].end(), Node(0, 0, k));
ans = ((LL) ans * (it -> a) + (it -> b)) % mod;
return;
}
int mid = L + R >> 1;
if(l <= mid) query(x << 1, L, mid, l, r, k);
if(mid < r) query(x << 1 | 1, mid + 1, R, l, r, k);
}
int main(){
scanf("%d%d%d", &id, &n, &mod);
for(Rint i = 1;i <= n;i ++)
scanf("%d", val + i);
scanf("%d", &m);
for(Rint i = 1;i <= m;i ++){
int opt, l, r, a, b;
scanf("%d%d%d%d", &opt, &l, &r, &a);
if(id & 1) l ^= ans, r ^= ans;
if(opt == 1){
scanf("%d", &b); ++ tot;
change(1, 1, n, l, r, a, b);
} else if(opt == 2){
if(id & 1) a ^= ans;
ans = val[a];
query(1, 1, n, l, r, a);
printf("%d\n", ans);
}
}
}

UOJ46 【清华集训2014】玄学 【时间线段树】的更多相关文章

  1. UOJ46 清华集训2014玄学(线段树)

    注意到操作有结合律,容易想到用一个矩形表示第i次操作对第j个位置的数的影响.那么修改是单行内的区间修改,而查询是单列内的区间查询.这样二维线段树上以列为外层行为内层直接打标记就可以维护.然后就喜闻乐见 ...

  2. [UOJ46][清华集训2014]玄学

    uoj description 给出\(n\)个变换,第\(i\)个变换是将区间中\(l_i,r_i\)的数\(x\)变成\((a_ix+b_i)\mod m\). 每次会新增一个变换,或者查询询问如 ...

  3. 【uoj#46】 [清华集训2014] 玄学

      题目传送门:uoj46   题意简述:要求在序列上维护一个操作间支持结合律的区间操作,查询连续一段时间内的操作对单点的作用效果,\(n \leq 10^5,m \leq 6 \times 10^5 ...

  4. uoj #46[清华集训2014]玄学

    uoj 因为询问是关于一段连续区间内的操作的,所以对操作构建线段树,这里每个点维护若干个不交的区间,每个区间\((l,r,a,b)\)表示区间\([l,r]\)内的数要变成\(ax+b\) 每次把新操 ...

  5. UOJ #164. 【清华集训2015】V | 线段树

    题目链接 UOJ #164 题解 首先,这道题有三种询问:区间加.区间减(减完对\(0\)取\(\max\)).区间修改. 可以用一种标记来表示--标记\((a, b)\)表示把原来的值加上\(a\) ...

  6. LOJ 164 【清华集训2015】V——线段树维护历史最值

    题目:http://uoj.ac/problem/164 把操作改成形如 ( a,b ) 表示加上 a 之后对 b 取 max 的意思. 每个点维护当前的 a , b ,还有历史最大的 a , b 即 ...

  7. 【题解】【LibreOJ Round #6】花团 LOJ 534 时间线段树分治 背包

    Prelude 题目链接:萌萌哒传送门(/≧▽≦)/ Solution 如果完全离线的话,可以直接用时间线段树分治来做,复杂度\(O(qv \log q)\). 现在在线了怎么办呢? 这其实是个假在线 ...

  8. uoj 41 【清华集训2014】矩阵变换 婚姻稳定问题

    [清华集训2014]矩阵变换 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/41 Description 给出 ...

  9. AC日记——【清华集训2014】奇数国 uoj 38

    #38. [清华集训2014]奇数国 思路: 题目中的number与product不想冲: 即为number与product互素: 所以,求phi(product)即可: 除一个数等同于在模的意义下乘 ...

随机推荐

  1. go 基本IO接口

    package main import ( "fmt" "io" "strings" ) func ReadFrom(reader io.R ...

  2. CSS 各种形状

    制作圆形: 要使用CSS来制作一个圆形,我们需要一个div,被给它设置一个ID <div id="circle"></div>  圆形在设置CSS时要设置宽 ...

  3. 7 批量查询mget、批量修改bulk

    注意:当执行多条数据查询.增删改时,一定要用mget.bulk,提升性能,减少网络传输   mget   回顾:查询单个文档 GET /beauties/my/2   mget 查询多个文档: 不同 ...

  4. 一个 Vim 重度用户总结的 vim 超全指南

    我本人是 Vim 的重度使用者,就因为喜欢上这种双手不离键盘就可以操控一切的feel,Vim 可以让我对文本的操作更加精准.高效. 对于未使用过 Vim 的朋友来说,可能还无法体会到这种感觉.由于使用 ...

  5. rabbitMq 学习笔记(二) 备份交换器,过期时间,死信队列,死信队列

    备份交换器 备份交换器,英文名称为 Altemate Exchange,简称庙,或者更直白地称之为"备胎交换器". 生产者在发送消息的时候如果不设置 mandatory 参数, 那 ...

  6. Wenaox 一款轻量性能好的微信小程序状态管理库

    感慨一下!!! 从开始开发 wenaox 从开始到现在,,时不时更新一下,改一改 bug,却发现已经快 1 年了 orz 虽然很少人用 hhh,但偶尔也会有人提一些问题,我就知道还有人用的~ 感兴趣的 ...

  7. springMVC + mybatis 下出现JDBC Connection *** will not be managed by Spring错误

    仔细查看配置中是否有如下类似的配置 execution(* com.ciguo.service.*.*(..)) <aop:config> <aop:pointcut id=&quo ...

  8. STM32F10x芯片类型 STM32F10X_LD STM32F10X_MD STM32F10X_HD STM32F10X_XL STM32F10X_CL

    stm32f10x.h 固件库stm32f10x.h中有如下解释 #if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) & ...

  9. 尚硅谷韩顺平Linux教程学习笔记

    目录 尚硅谷韩顺平Linux教程学习笔记 写在前面 虚拟机 Linux目录结构 远程登录Linux系统 vi和vim编辑器 关机.重启和用户登录注销 用户管理 实用指令 组管理和权限管理 定时任务调度 ...

  10. 【CMDB】高级配置

    思路: 一份默认配置,一份用户自定义配置,将两者结合,自定义优先级大于默认配置 目录结构 ''' 用户自定义的配置文件,settings.py ''' USER = 'xiaoming' PASSWO ...