uoj46玄学
复杂度辣鸡没人权
疯狂爆oj
感觉要被众多uoj用户骂了
#include <bits/stdc++.h>
#define ll long long
#define LS ls[now]?ls[now]:(tr[++NODE]=stru(),ls[now]=NODE)
#define RS rs[now]?rs[now]:(tr[++NODE]=stru(),rs[now]=NODE)
#define mid (l+r>>1)
using namespace std;
int MOD,NODE,KEY,n,m,opt,l,r,x,y;
int root[];
int ls[],rs[],st[],L[],R[],X[],Y[];
struct stru
{
long long k,b;
stru()
{
k=;b=;
}
stru(int K,int B)
{
k=K;b=B;
}
} tr[],alb[];
stru merge(stru x,stru y)
{
return stru(x.k*y.k%MOD,(x.b*y.k+y.b)%MOD);
}
bool is(stru p)
{
return(p.k!= || p.b!=);
}
void add(int now,int l,int r,int x,int y,int p,int q)
{
if(l==x && r==y)
{
tr[now]=merge(tr[now],stru(p,q));
return;
}
if(is(tr[now]))
{
tr[LS]=merge(tr[LS],tr[now]);
tr[RS]=merge(tr[RS],tr[now]);
tr[now]=stru();
}
if(x<=mid) add(LS,l,mid,x,min(mid,y),p,q);
if(y>mid) add(RS,mid+,r,max(mid+,x),y,p,q);
}
int read()
{
int x=;char c=getchar();
while (c<''||c>'')c=getchar();
while (c>=''&&c<='')x=x*+c-'',c=getchar();
return x;
}
int main()
{
KEY=read();
n=read();MOD=read();
for(int i=;i<=n;i++)
st[i]=read();
m=read();
int N=;
int lastans=;
for(int i=,j=,J=;i<=m;i++)
{
opt=read();l=read();r=read();x=read();
if(KEY&)
l^=lastans,r^=lastans;
if(opt==)
{
y=read();
L[++j]=l;R[j]=r;X[j]=x;Y[j]=y;
if(j%N==)
root[++J]=++NODE;
add(root[J],,n,l,r,x,y);
}
if(opt==)
{
if(KEY&)
x^=lastans;
int k,K;ll ret=st[x];
for(k=l;k%N!= && k<=r;k++)
if(L[k]<=x && x<=R[k])
ret=(ret*X[k]+Y[k])%MOD;
if(k<=r)
{
for(K=k/N+;K*N<=r;K++)
{
int now=root[K],l=,r=n,top=;
while(l<r)
{
if(is(tr[now]))
alb[++top]=tr[now];
if(x<=mid)
now=LS,r=mid;
else
now=RS,l=mid+;
}
stru tem=tr[now];
for(int i=top;i;i--)
tem=merge(tem,alb[i]);
// tem=que(root[])
ret=(tem.k*ret+tem.b)%MOD;
}
for(k=(K-)*N+;k<=r;k++)
if(L[k]<=x && x<=R[k])
ret=(ret*X[k]+Y[k])%MOD;
}
printf("%d\n",ret);
// puts("OK");
lastans=ret;
}
}
return ;
}
uoj46玄学的更多相关文章
- UOJ46 玄学
题目 一个比较自然的想法是线段树维护二进制分组. 因为我们询问的是一段连续的操作的积,所以我们可以建一棵线段树,每个节点存储当前区间各个操作的积. 这里的操作的积指的是把一系列操作做完之后区间每个位置 ...
- 【BZOJ3821/UOJ46】玄学(二进制分组,线段树)
[BZOJ3821/UOJ46]玄学(二进制分组,线段树) 题面 BZOJ UOJ 题解 呜,很好的题目啊QwQ. 离线做法大概可以线段树分治,或者直接点记录左右两次操作时的结果,两个除一下就可以直接 ...
- [UOJ46][清华集训2014]玄学
uoj description 给出\(n\)个变换,第\(i\)个变换是将区间中\(l_i,r_i\)的数\(x\)变成\((a_ix+b_i)\mod m\). 每次会新增一个变换,或者查询询问如 ...
- UOJ46. 【清华集训2014】玄学
传送门 Sol 考虑对于操作时间建立线段树,二进制分组 那么现在主要的问题就是怎么合并信息 你发现一个性质,就是每个修改只会在整个区间内增加两个端点 那么我们二进制分组可以得到每个区间内最多只有区间长 ...
- UOJ46. 【清华集训2014】玄学 [线段树,二进制分组]
UOJ 思路 模拟赛出了这题,结果我没学过二进制分组--一波主席树然后空间就爆炸了-- 用线段树维护时间序列,每个节点维护\(a_i\to x_i\times a_i+b_i,i\in [1,n]\) ...
- UOJ46 清华集训2014玄学(线段树)
注意到操作有结合律,容易想到用一个矩形表示第i次操作对第j个位置的数的影响.那么修改是单行内的区间修改,而查询是单列内的区间查询.这样二维线段树上以列为外层行为内层直接打标记就可以维护.然后就喜闻乐见 ...
- UOJ46 【清华集训2014】玄学 【时间线段树】
题目链接:UOJ 这题的时间线段树非常的妙. 对时间建立线段树,修改的时候在后面加,每当填满一个节点之后就合并进它的父亲. 对于一个节点维护序列,发现这是一个分段函数,合并就是归并排序.于是就形成了差 ...
- 洛谷P2832 行路难 分析+题解代码【玄学最短路】
洛谷P2832 行路难 分析+题解代码[玄学最短路] 题目背景: 小X来到了山区,领略山林之乐.在他乐以忘忧之时,他突然发现,开学迫在眉睫 题目描述: 山区有n座山.山之间有m条羊肠小道,每条连接两座 ...
- C++玄学预编译优化
#pragma GCC diagnostic error "-std=c++11" #pragma GCC optimize("-fdelete-null-pointer ...
随机推荐
- c macro pair
成对使用的macro, 不过也有机会用错, 死都不知道怎么死的, 这宏... #define pthread_cleanup_push(func, val) \ { \ struct __darwin ...
- 三:JMS消息服务规范
一:JMS是什么?--->JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API--->用于在两个应用程 ...
- Scala学习——array与arraybuffer的区别(初)
1.由于Array是不可变的,所以不能直接地对其元素进行删除操作,只能通过重赋值或过滤生成新的Array的方式来删除不要的元素. 而ArrayBuffer是可变的,本身提供了很多元素的操作,当然包括删 ...
- Redis实现求交集操作结果缓存的设计方案
Redis的集合操作 实话说,Redis提供的集合操作是我选择它成为内存数据库的一个主要理由,它弥补了传统关系型数据库在这方面带来的复杂度,使得只需要简单的一个命令就可以完成一个复杂SQL任务,并且交 ...
- Spring boot 学习 四:spring boot 配置文件 application.yml
一 关于端口: spring boot的默认端口是8080, 如果想更改的话,在配置文件中做如下配置.ServerProperties.class会去读取这个值. server: port: 另外一种 ...
- 14 vue学习 postcssrc eslintrc.js babelrc
一 .postcssrc.js 众所周知为兼容所有浏览器,有的CSS属性需要对不同的浏览器加上前缀,然而有时添加一条属性,需要添加3~4条类似的属性只是为了满足浏览器的兼容,这不仅会增加许多的工作量 ...
- C#操作SQL Server中的Image类型数据
该例子是一个对SQL Server数据类型的一个操作例子,具有写入.读取功能. 1:准备数据库 1)创建数据库 Test 2)创建表 Table_1 (分别有2个字段:id(Int).photo(Im ...
- Balloon Comes! hdu(小数位数处理)
Balloon Comes! Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Submission(s): A ...
- 使用API修改控制台输出的颜色(前景色和背景色)
1.api原型 SetConsoleTextAttribute BOOL WINAPI SetConsoleTextAttribute( _In_ HANDLE hConsoleOutput, // ...
- 3、scala数组
一.Array .Array Buffer 1.Array 在Scala中,Array代表的含义与Java中类似,也是长度不可改变的数组. 此外,由于Scala与Java都是运行在JVM中,双方可以互 ...