uoj

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

每次把新操作加入线段树中下一个叶子,然后如果某个节点里所有操作都加进去了,就条到父亲,把两个儿子的信息合并到父亲上.这里合并就是把两个区间集合合并成一个,例如两个区间\([a,c]\)和\([b,d](a\le b\le c\le d)\)会合并成\([a,b),[b,c),[c,d]\).合并出来的区间如果属于两个集合中元素的交,那么对应的\(ax+b\)就是\(a_r(a_l+b_l)+b_r=a_ra_lx+a_rb_l+b_r\).

查询时依次找到对应的线段树节点,然后在区间集合上二分出\(k\)元素所在的区间,把\(ans\)更新成\(a*ans+b\)即可

#include<bits/stdc++.h>
#define LL long long
#define uLL unsigned long long
#define db double using namespace std;
const int N=6e5+10;
LL rd()
{
LL x=0,w=1;char ch=0;
while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
int n,mod,m,q,tt,ans;
struct node
{
int l,r,a,b;
node(){}
node(int nl,int nr,int na,int nb){l=nl,r=nr,a=na,b=nb;}
node operator + (const node &bb) const {return node(max(l,bb.l),min(r,bb.r),1ll*a*bb.a%mod,(1ll*b*bb.a+bb.b)%mod);}
}a[N*40];
#define mid ((l+r)>>1)
int va[N],aq[N<<2][2];
void modif(int o,int l,int r,node x)
{
if(l==r){a[++tt]=x,aq[o][0]=aq[o][1]=tt;return;}
if(m<=mid) modif(o<<1,l,mid,x);
else modif(o<<1|1,mid+1,r,x);
if(m<r) return;
int l1=aq[o<<1][0],r1=aq[o<<1][1],l2=aq[o<<1|1][0],r2=aq[o<<1|1][1];
aq[o][0]=tt+1;
while(l1<=r1||l2<=r2)
{
if(l2>r2||(l1<=r1&&a[l1].r<a[l2].l)) a[++tt]=a[l1];
else if(l1>r1||(l2<=r2&&a[l2].r<a[l1].l)) a[++tt]=a[l2];
else
{
if(a[l1].l<a[l2].l) a[++tt]=node(a[l1].l,a[l2].l-1,a[l1].a,a[l1].b);
else if(a[l1].l>a[l2].l) a[++tt]=node(a[l2].l,a[l1].l-1,a[l2].a,a[l2].b);
if(tt>aq[o][0]) a[tt].l=max(a[tt].l,a[tt-1].r+1);
if(a[tt].l>a[tt].r) --tt;
a[++tt]=a[l1]+a[l2];
}
if(tt!=aq[o][0]) a[tt].l=max(a[tt].l,a[tt-1].r+1);
if(a[tt].l>a[tt].r) --tt;
if(l1<=r1&&l2<=r2&&a[l1].r==a[l2].r) ++l1,++l2;
else if(l2>r2||(l1<=r1&&a[l1].r<a[l2].r)) ++l1;
else ++l2;
}
aq[o][1]=tt;
}
void wk(int o,int x)
{
int ll=aq[o][0],rr=aq[o][1],z=0;
while(ll<=rr)
{
int md=(ll+rr)>>1;
if(a[md].l<=x) z=md,ll=md+1;
else rr=md-1;
}
if(a[z].r>=x) ans=(1ll*ans*a[z].a+a[z].b)%mod;
}
void quer(int o,int l,int r,int ll,int rr,int x)
{
if(ll<=l&&r<=rr){wk(o,x);return;}
if(ll<=mid) quer(o<<1,l,mid,ll,rr,x);
if(rr>mid) quer(o<<1|1,mid+1,r,ll,rr,x);
} int main()
{
int ty=rd()&1;
n=rd(),mod=rd();
for(int i=1;i<=n;++i) va[i]=rd();
q=rd();
for(int i=1;i<=q;++i)
{
int op=rd(),l=rd()^(ans*ty),r=rd()^(ans*ty);
if(op==1)
{
int aa=rd(),bb=rd();
++m;
modif(1,1,q,node(l,r,aa,bb));
}
else
{
int x=rd()^(ans*ty);
ans=va[x];
quer(1,1,q,l,r,x);
printf("%d\n",ans);
}
}
return 0;
}

uoj #46[清华集训2014]玄学的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. UOJ#46. 【清华集训2014】玄学

    传送门 分析 清华集训真的不是人做的啊嘤嘤嘤 我们可以考虑按操作时间把每个操作存进线段树里 如果现在点x正好使一个整块区间的右端点则更新代表这个区间的点 我们不难发现一个区间会因为不同的操作被分成若干 ...

随机推荐

  1. linu逻辑分区动态调整大小

    注意: 这个动态调整的方法是有丢数据风险的,要确保调整的源分区没有使用或者使用率很低.源分区中如果有重要的文件最好先备份 在centos 6.5上操作过 lvdisplay 查看已有的分区的大小 lv ...

  2. EBS AP 创建会计科目失败

    路径:应付款系统管理员/发票/发票 问题描述: 在AP发票界面录入一笔发票,验证发票,撤销发票,然后在AP发票界面的“活动”中创建会计科目,发现带出的并发请求“创建会计科目”正常跑完,但是通过“报表/ ...

  3. java加密算法相关

    简介 RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.1987年首次公布,当 ...

  4. Spring Annotations

    @Bean 这是一个方法注解,作用是实例化一个Bean并使用该方法的名臣命名.

  5. python调用系统命令的方法

    1.os模块 (1)system()方法 这个方法是直接调用标准C的system() 函数,在一个子终端运行系统命令 (2)poen()方法 这个方法执行命令后通过一个管道文件将结果返回 3.subp ...

  6. 连续子数组的最大和 java实现

    package findMax; /** * 连续子数组的最大和 * @author root * */ public class FindMax { static int[] data = {1,- ...

  7. 自动创建数据库(DELPHI+SQL SERVER)

    procedure TForm1.Btn_OKClick(Sender: TObject); var sqlconn:string; begin Sqlconn:='Provider=SQLOLEDB ...

  8. 网络分析:WireShark

    安装 WireShark 官网 过滤器 类别 显示过滤器模式 捕获过滤器模式 逻辑表达式 and:&& or:|| 成组:() 过滤实例 仅监听某域名 http.host == &qu ...

  9. H3C 模拟器 pc与sw直连 登录web

    配置与上一节相同 开启web功能,并登录 [sw1]ip http enable [sw1]local-user admin New local user added. [sw1-luser-mana ...

  10. python学习——数据结构

    数据结构简介 1,数据结构 数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成.简单来说,数据结构就是设计数据以何种方式组织并存贮在计算机中.比如:列表,集合与字 ...