UOJ#46. 【清华集训2014】玄学
分析
清华集训真的不是人做的啊嘤嘤嘤
我们可以考虑按操作时间把每个操作存进线段树里
如果现在点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】玄学的更多相关文章
- uoj #46[清华集训2014]玄学
uoj 因为询问是关于一段连续区间内的操作的,所以对操作构建线段树,这里每个点维护若干个不交的区间,每个区间\((l,r,a,b)\)表示区间\([l,r]\)内的数要变成\(ax+b\) 每次把新操 ...
- 【uoj#46】 [清华集训2014] 玄学
题目传送门:uoj46 题意简述:要求在序列上维护一个操作间支持结合律的区间操作,查询连续一段时间内的操作对单点的作用效果,\(n \leq 10^5,m \leq 6 \times 10^5 ...
- [UOJ46][清华集训2014]玄学
uoj description 给出\(n\)个变换,第\(i\)个变换是将区间中\(l_i,r_i\)的数\(x\)变成\((a_ix+b_i)\mod m\). 每次会新增一个变换,或者查询询问如 ...
- UOJ.41.[清华集训2014]矩阵变换(稳定婚姻)
题目链接 稳定婚姻问题:有n个男生n个女生,每个男/女生对每个女/男生有一个不同的喜爱程度.给每个人选择配偶. 若不存在 x,y未匹配,且x喜欢y胜过喜欢x当前的配偶,y喜欢x也胜过y当前的配偶 的完 ...
- bzoj 3816&&uoj #41. [清华集训2014]矩阵变换
稳定婚姻问题: 有n个男生,n个女生,所有女生在每个男生眼里有个排名,反之一样. 将男生和女生两两配对,保证不会出现婚姻不稳定的问题. 即A-1,B-2 而A更喜欢2,2更喜欢A. 算法流程: 每次男 ...
- UOJ46 清华集训2014玄学(线段树)
注意到操作有结合律,容易想到用一个矩形表示第i次操作对第j个位置的数的影响.那么修改是单行内的区间修改,而查询是单列内的区间查询.这样二维线段树上以列为外层行为内层直接打标记就可以维护.然后就喜闻乐见 ...
- uoj 41 【清华集训2014】矩阵变换 婚姻稳定问题
[清华集训2014]矩阵变换 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/41 Description 给出 ...
- AC日记——【清华集训2014】奇数国 uoj 38
#38. [清华集训2014]奇数国 思路: 题目中的number与product不想冲: 即为number与product互素: 所以,求phi(product)即可: 除一个数等同于在模的意义下乘 ...
- [UOJ#274][清华集训2016]温暖会指引我们前行
[UOJ#274][清华集训2016]温暖会指引我们前行 试题描述 寒冬又一次肆虐了北国大地 无情的北风穿透了人们御寒的衣物 可怜虫们在冬夜中发出无助的哀嚎 “冻死宝宝了!” 这时 远处的天边出现了一 ...
随机推荐
- 重温CLR(八 ) 泛型
熟悉面向对象编程的开发人员都深谙面向对象的好处,其中一个好处是代码重用,它极大提高了开发效率.也就是说,可以派生出一个类,让他继承基类的所有能力.派生类只需要重写虚方法,或添加一些新方法,就可定制派生 ...
- 关于quartus工程添加文件的说明
quartus工程中要添加bsf文件的话需要将源文件也一同添加进来,添加ip核需要添加qip文件,时序约束文件只有添加到工程中才有效果,而timequest分析时需要制定约束文件.
- NOIP2013DAY1题解
T1转圈游戏 十月のsecret 题解:快速幂 代码: #include<iostream> #include<cstring> #include<cstdio> ...
- 向HDFS中追加内容
向生成好的hdfs文件中追加内容,但是线上使用的版本是1.0.3,查看官方文档发现,在1.0.4版本以后才支持文件append 以下是向hdfs中追加信息的操作方法 如果你只在某一个driver中追加 ...
- 30G 的redis 如何优化
突然发现我们的redis 已经用了30G了,好吧这是个很尴尬的数字因为我们的缓存机器的内存目前是32G的,内存已经告竭.幸好上上周公司采购了90G的机器,现在已经零时迁移到其中的一台机器上了.(跑题下 ...
- DELPHI中使用UNIDAC连接ORACLE数据库
DELPHI中使用UNIDAC连接ORACLE数据库 最近在DELPHI中使用到UNIDAC连接到oracle数据库,这样可以不要安装oracle客户端,比较方便使用:所以简单学习了一下,主要是用 ...
- c++ 浅谈 new 的使用
实例用法: 创建对象: class U_Ptr smart; U_Ptr* ptr = new U_Ptr(); class U_Ptr smart(new U_Ptr(p)); int *p = n ...
- 低成本FPGA中实现动态相位调整
在FPGA中,动态相位调整(DPA)主要是实现LVDS接口接收时对时钟和数据通道的相位补偿,以达到正确接收的目的.ALTERA的高端FPGA,如STRATIX(r) 系列中自带有DPA电路,但低端的F ...
- PHP实现日志写入log.txt
引言:有时候调试,看不到效果,需要通过写入文件来实现. 案例: <?php $myfile = fopen("log.txt", "a+") or die ...
- 从零开始搭建包含多个子系统的Vue工程项目
本文以windows为例,介绍支持多个子系统的Vue工程项目的搭建过程,相对于单一系统的工程,多个子系统引入了如下一些问题: 项目目录结构设计 打包结果设计:每个子系统可以独立发布上线 多布局实现:多 ...