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 ...
随机推荐
- 51nod【1196】字符串的数量
超级神题! 有n种字符,若此种字符的编号( \(1\) ~ \(n\)),\(i*2>n\),则他后面可接任意字符.若不是,则他后面接的字符编号至少要是他的两倍. 问长度为m的字符串的个数. 这 ...
- tensorflow knn 预测房价 注意有 Min-Max Scaling
示例数据: 0.00632 18.00 2.310 0 0.5380 6.5750 65.20 4.0900 1 296.0 15.30 396.90 4.98 24.00 0.02731 0.00 ...
- 《java编程思想》:第五章,初始化与清理
知识点整理: 1.从概念上讲,‘初始化’与‘创建’是彼此独立的,但是在Java中,两者被捆绑在一起,不可分离. 2.区分重载的方法:每个重载的方法都有一个独一无二的参数类型列表. 甚至参数顺序的不同也 ...
- 递归------python实现列表创建二叉树
# -*- coding:utf-8 -*- '二叉树结点类' class TreeNode: def __init__(self, x): self.val = x self.left = None ...
- ACM学习历程—HDU5396 Expression(递推 && 计数)
Problem Description Teacher Mai has n numbers a1,a2,⋯,an and n−1 operators("+", "-&qu ...
- 【LeetCode】011 Container With Most Water
题目: Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, a ...
- bzoj 4310 跳蚤 —— 后缀数组+二分答案+贪心
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4310 二分答案——在本质不同的子串中二分答案! 如果二分到的子串位置是 st,考虑何时必须分 ...
- 【转】Android Menu
Menu由两种形式,Option menu和Context menu.前者是按下设备的Menu硬按钮弹出,后者是长按widget弹出. Option Menu 当我们按下Menu的硬件按钮时,Opti ...
- 4种方法实现C#无标题栏窗体的移动
首先C#无标题栏窗体的实现代码 在load时实现 无工具栏+无窗口标题 private void Form1_Load(object sender, EventArgs e) { this.Contr ...
- 导出数据到EXCEL并生成多个Sheet
一.准备工作 引用:Microsoft.Office.Interop.Excel 准备多个DataTable数据添加到DataSet中. 二.代码 public void CreateExcel(Da ...