题目链接: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. 缓存的设计及PHP实现LFU

    1. 恒定缓存性能有哪些因素? 命中率.缓存更新策略.缓存最大数据量. 命中率:指请求缓存次数和缓存返回正确结果次数的比例.比例越高,缓存的使用率越高,用来衡量缓存机智的好坏和效率.如果数据频繁更新, ...

  2. C# 中关于重载与重写的区别及用法

    1.重载(overload): 在同一个作用域(一般指一个类)的两个或多个方法函数名相同,参数列表不同的方法叫做重载,它们有三个特点(俗称两必须一可以): 方法名必须相同 参数列表必须不相同 返回值类 ...

  3. DDL和DML 的区别

    DDL (Data Definition Language 数据定义语言) create table 创建表 alter table 修改表 drop table 删除表 truncate table ...

  4. C# vb .net实现扭曲角特效滤镜图像处理

    在.net中,如何简单快捷地实现Photoshop滤镜组中的扭曲角效果呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第一 ...

  5. openssl jia adress

    ???????????????????????????????????????????openssl证IP 首先创建openssl.cnf, 内容如下. 其中organizationalUnitNam ...

  6. ZIP压缩与解压

    /**//* * Gary Zhang -- cbcye@live.com * www.cbcye.com * www.quicklearn.cn * cbcye.cnblogs.com */ usi ...

  7. String字符串常用方法

    1.  charAt(int index)-->返回 char指定索引处的值(注意索引从0开始) String str1="abc"; char c=str1.charAt( ...

  8. React Native 开发豆瓣评分(三)集成 Redux

    什么是 redux redux 是一个用于管理 js 应用状态(state)的容器.比如组件 A 发生了变化,组件 B 要同时做出响应.常见的应用场景就是用户的登录退出操作:未登录状态,个人中心显示登 ...

  9. UI5-技术篇-JS函数eval动态执行

    <html lang="en"> <head> <meta charset="utf-8" /> <title> ...

  10. Air for ANE:一星期的调试笔记

    来源:http://blog.csdn.net/hero82748274/article/details/8656674 第一次尝试ANE的东西,让我感觉到很折腾人.adobe 出的这个方案虽然可以解 ...