传送门

分析

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

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

如果现在点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. RabbitMQ学习系列二-C#代码发送消息

    RabbitMQ学习系列二:.net 环境下 C#代码使用 RabbitMQ 消息队列 http://www.80iter.com/blog/1437455520862503 上一篇已经讲了Rabbi ...

  2. mysql8之与标准sql的区别

    一  mysql8概述 在研究mysql8新特性的时候,越来越感觉mysql8朝sql server看齐.看来对于中小型企业级应用也挺有兴趣,但是没有企业级的应用套件,有知道的麻烦告知.本文不探讨my ...

  3. Asp.net页面间传值方式汇总

    七种传值方式,分别是:URL传值,Session传值,Cookie传值,Server.Transfer传值,Application传值,利用某些控件的PostBackUrl属性和使用@Previous ...

  4. python的正则re模块

    一. python的正则 python的正则模块re,是其内置模块,可以直接导入,即import re.python的正则和其他应用的正则及其相似,有其他基础的话,学起来还是比较简单的. 二. 正则前 ...

  5. linux下修改ip地址

    1.more  /etc/sysconfig/network-scripts/ifcfg-eth0 2.ifconfig eth0 192.168.1.211 netmask 255.255.255. ...

  6. FastAdmin 后台 UserRule 勾选不完整 Bug 修复

    FastAdmin 后台 UserRule 勾选不完整 Bug 修复 当用户权限的级选择时出现有部分没有选中. 修复来自在 qmit 1 public static function getTreeL ...

  7. mybatis排序

    排序的时候#和$的分别 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by ...

  8. laravel 二维码生成器包 QrCode 的使用

    在laravel中使用 QrCode 生成二维码 https://laravelacademy.org/post/2605.html 我在本机的windows下composer require 没有成 ...

  9. jenkin执行权限问题

    jenkins执行报错 stderr: Permission denied, please try again. Permission denied, please try again. Permis ...

  10. php-fpm使用

    /usr/local/php/sbin/php-fpm  --help -c <path>|<file> Look for php.ini file in this direc ...