传送门

分析

清华集训真的不是人做的啊嘤嘤嘤

我们可以考虑按操作时间把每个操作存进线段树里

如果现在点x正好使一个整块区间的右端点则更新代表这个区间的点

我们不难发现一个区间会因为不同的操作被分成若干块,每块对应序列上不同的区间

于是查询时对于每个线段树上区间查询时二分查找当前点在哪一块中即可

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
#define int long long
int n,m,a[],Q,tot,Ans,cnt,L[],R[];
struct node {
int le,ri,a,b;
};
node d[];
inline void PUSH(int wh,int le,int ri,int aa,int bb){
d[wh].le=le,d[wh].ri=ri,d[wh].a=aa,d[wh].b=bb;
}
inline void update(int wh,int le,int ri){
int i,j,k,be=;
L[wh]=cnt+;
for(i=L[le],j=L[ri];i<=R[le]&&j<=R[ri];){
if(d[i].ri>=d[j].ri){
PUSH(++cnt,be,d[j].ri,d[i].a*d[j].a%m,(d[j].a*d[i].b+d[j].b)%m);
be=d[j].ri+;
if(d[i].ri==d[j].ri)i++;
j++;
}else {
PUSH(++cnt,be,d[i].ri,d[i].a*d[j].a%m,(d[j].a*d[i].b%m+d[j].b)%m);
be=d[i].ri+;
i++;
}
}
R[wh]=cnt;
}
inline void build(int le,int ri,int wh,int pl,int x,int y,int k1,int k2){
if(le==ri){
L[wh]=cnt+;
if(x>)PUSH(++cnt,,x-,,);
PUSH(++cnt,x,y,k1,k2);
if(y<n)PUSH(++cnt,y+,n,,);
R[wh]=cnt;
return;
}
int mid=(le+ri)>>;
if(mid>=pl)build(le,mid,wh<<,pl,x,y,k1,k2);
else build(mid+,ri,wh<<|,pl,x,y,k1,k2);
if(ri==pl)update(wh,wh<<,wh<<|);
}
inline void work(int wh,int pl){
int le=L[wh],ri=R[wh];
while(ri-le>){
int mid=(le+ri)>>;
if(pl<=d[mid].ri)ri=mid;
else le=mid+;
}
Ans=(Ans*d[le].a%m+d[le].b)%m;
}
inline void q(int le,int ri,int wh,int x,int y,int k){
if(le>=x&&ri<=y){
work(wh,k);
return;
}
int mid=(le+ri)>>;
if(mid>=x)q(le,mid,wh<<,x,y,k);
if(mid<y)q(mid+,ri,wh<<|,x,y,k);
}
signed main(){
int i,j,k,t;
scanf("%lld",&t);
scanf("%lld%lld",&n,&m);
for(i=;i<=n;i++)scanf("%lld",&a[i]);
scanf("%lld",&Q);
for(i=;i<=Q;i++){
int le,ri,x,y;
scanf("%lld%lld%lld",&k,&le,&ri);
if(t&)le^=Ans,ri^=Ans;
if(k==){
scanf("%lld%lld",&x,&y);
tot++;
build(,Q,,tot,le,ri,x,y);
}else {
scanf("%lld",&x);
if(t&)x^=Ans;
Ans=a[x];
q(,Q,,le,ri,x);
printf("%lld\n",Ans);
}
}
return ;
}

UOJ#46. 【清华集训2014】玄学的更多相关文章

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

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

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

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

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

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

  4. UOJ.41.[清华集训2014]矩阵变换(稳定婚姻)

    题目链接 稳定婚姻问题:有n个男生n个女生,每个男/女生对每个女/男生有一个不同的喜爱程度.给每个人选择配偶. 若不存在 x,y未匹配,且x喜欢y胜过喜欢x当前的配偶,y喜欢x也胜过y当前的配偶 的完 ...

  5. bzoj 3816&&uoj #41. [清华集训2014]矩阵变换

    稳定婚姻问题: 有n个男生,n个女生,所有女生在每个男生眼里有个排名,反之一样. 将男生和女生两两配对,保证不会出现婚姻不稳定的问题. 即A-1,B-2 而A更喜欢2,2更喜欢A. 算法流程: 每次男 ...

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

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

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

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

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

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

  9. [UOJ#274][清华集训2016]温暖会指引我们前行

    [UOJ#274][清华集训2016]温暖会指引我们前行 试题描述 寒冬又一次肆虐了北国大地 无情的北风穿透了人们御寒的衣物 可怜虫们在冬夜中发出无助的哀嚎 “冻死宝宝了!” 这时 远处的天边出现了一 ...

随机推荐

  1. 剑指offer-第三章高质量代码(反转链表)

    题目:定义一个函数,输入一个链表的头节点,反转该链表并输出反转链表的头节点. 思路:对一个链表反转需要三个指针操作来保证链表在反转的过程中保证不断链,给链表一个行动指针pNode,对pNode指向的节 ...

  2. 十九、python沉淀之路--装饰器

    一.实现装饰器的预备知识 装饰器 = 高阶函数 + 函数嵌套 + 闭包 1.高价函数定义: 1.函数接收的参数是一个函数名    2.函数的返回值是一个函数名    3.满足上述条件任意一个,都可称之 ...

  3. YII缓存之数据缓存

    1.开启缓存组件 2. ================ 二 先在配置文件components数组中加上: 'cache'=>array( 'class'=>'CFileCache'), ...

  4. FastAdmin 社区 FAQ 帖子收集(F4NNIU 版 2018-08-12)

    FastAdmin 社区 FAQ 帖子收集 为什么Selectpage下拉列表在编辑时总是返回第一行的值? https://forum.fastadmin.net/thread/2399 根据条件值判 ...

  5. poj 3046 Ant Counting——多重集合的背包

    题目:http://poj.org/problem?id=3046 多重集合的背包问题. 1.式子:考虑dp[ i ][ j ]能从dp[ i-1 ][ k ](max(0 , j - c[ i ] ...

  6. Linux 定时任务 crontab 讲解

    linux 系统则是由 cron (crond) 这个系统服务来控制的.Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的.另 外, 由于使用者自己也可以设置计划任务,所以, ...

  7. dxjk中 支付宝二维码支付 git 存疑

    线上的vendor/latrell/alipay 文件拉取不了至本地,失去了git监控 要想本地使用 1.注释掉config/app.php 'providers' 下的Latrell模块 2.下载线 ...

  8. Ehcache/Redis/Tair缓存性能对比[转载]

    FW : http://xulingbo.net/?p=434 版权归许令波所有.此处只是一个转载. 后面介绍的不同方式都有测试数据,这些测试数据都是在同一的测试环境下得出的测试结果: 测试机器的配置 ...

  9. ITextSharp Table使用 (转)

    原文:http://www.cnblogs.com/LifelongLearning/archive/2011/05/16/2048116.html 表格是我们在制作文档时,经常使用的一个元素.对布局 ...

  10. SQL2008R转SQL2005

    1.SQL2008R生成 任务--生成脚本 “为服务器版本编写脚本”:SQL Server 2005 “要编写脚本的数据类型”:架构和数据 2.SQL2005还原超大sql语句文件 运行-cmd: o ...