[UOJ46][清华集训2014]玄学-程序员宅基地

uoj

description

给出\(n\)个变换,第\(i\)个变换是将区间中\(l_i,r_i\)的数\(x\)变成\((a_ix+b_i)\mod m\)
每次会新增一个变换,或者查询询问如果进行编号\([s,t]\)的操作,第\(k\)个数会变成多少。
\(n\le10^5,q\le6\times10^5\)

sol

二进制分组。
按顺序把变化插入线段树,如果线段树的某个满了就向上归并两个儿子的变换。
\(a_j(a_ix+b_i)+b_j=a_ia_jx+a_jb_i+b_j\)就是两个变换的合并。
查询的时候找到线段树的对应节点(这些节点一定都是合并好了的),然后在维护出的变化序列上二分找到第\(k\)个位置,直接算即可。

code

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int gi(){
    int x=0,w=1;char ch=getchar();
    while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
    if (ch=='-') w=0,ch=getchar();
    while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
    return w?x:-x;
}
const int N = 1e5+5;
struct node{int p,a,b;}t[N*30];
int Type,n,m,q,mod,val[N],L[N<<2],R[N<<2],cnt,ans;
void modify(int x,int l,int r,int ql,int qr,int a,int b){
    if (l==r){
        L[x]=cnt+1;
        if (ql>1) t[++cnt]=(node){ql-1,1,0};
        t[++cnt]=(node){qr,a,b};
        if (qr<n) t[++cnt]=(node){n,1,0};
        R[x]=cnt;return;
    }
    int mid=l+r>>1;
    if (m<=mid) modify(x<<1,l,mid,ql,qr,a,b);
    else modify(x<<1|1,mid+1,r,ql,qr,a,b);
    if (m<r) return;
    int i=L[x<<1],j=R[x<<1],u=L[x<<1|1],v=R[x<<1|1];
    L[x]=cnt+1;
    while (i<=j&&u<=v){
        t[++cnt]=(node){min(t[i].p,t[u].p),1ll*t[i].a*t[u].a%mod,(1ll*t[i].b*t[u].a+t[u].b)%mod};
        if (t[i].p==t[u].p) ++i,++u;else if (t[i].p<t[u].p) ++i;else ++u;
    }
    R[x]=cnt;
}
void calc(int x,int k){
    int l=L[x],r=R[x],res=0;
    while (l<=r){
        int mid=l+r>>1;
        if (t[mid].p>=k) res=mid,r=mid-1;
        else l=mid+1;
    }
    ans=(1ll*ans*t[res].a+t[res].b)%mod;
}
void query(int x,int l,int r,int ql,int qr,int k){
    if (l>=ql&&r<=qr) {calc(x,k);return;}
    int mid=l+r>>1;
    if (ql<=mid) query(x<<1,l,mid,ql,qr,k);
    if (qr>mid) query(x<<1|1,mid+1,r,ql,qr,k);
}
int main(){
    Type=gi()&1;n=gi();mod=gi();
    for (int i=1;i<=n;++i) val[i]=gi();
    q=gi();while (q--){
        int op=gi(),l=gi(),r=gi();
        if (Type) l^=ans,r^=ans;
        if (op==1){
            int a=gi(),b=gi();++m;
            modify(1,1,100000,l,r,a,b);
        }else{
            int k=gi();if (Type) k^=ans;
            ans=val[k];
            query(1,1,100000,l,r,k);
            printf("%d\n",ans);
        }
    }
    return 0;
}

转载于:https://www.cnblogs.com/zhoushuyu/p/9452267.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/abcyan1235/article/details/101608598

智能推荐

reactos操作系统实现(162)_co_intcreatewindowex-程序员宅基地

文章浏览阅读2.2k次。co_IntCreateWindowEx函数主要用创建一个显示的窗口,具体实现代码如下:#001 HWND APIENTRY#002 co_IntCreateWindowEx(DWORD dwExStyle,#003 PUNICODE_STRINGClassName,#004 PUN_co_intcreatewindowex

opentsdb源码编译 本地调试环境搭建_opentsdb编译-程序员宅基地

文章浏览阅读895次。opentsdb源码编译 本地调试环境搭建opentsdb源码编译及调试环境搭建前言源码编译过程调试环境搭建opentsdb源码编译及调试环境搭建以下介绍opentsdb源码编译和本地调试环境搭建过程。官网地址: http://opentsdb.net/docs/build/html/development/development.html.前言OpenTSDB is a distrib..._opentsdb编译

pip 异常问题_pipexception:-程序员宅基地

文章浏览阅读2.1k次。使用pip安装出现报错 Exception:Traceback (most recent call last): File "C:\Users\csprock\Anaconda3\lib\site-packages\pip\basecommand.py", line 215, in main status = self.run(options, args) File "..._pipexception:

华为笔记本开发android,华为二合一笔记本支持Android可能是鸡肋!-程序员宅基地

文章浏览阅读923次。原标题:华为二合一笔记本支持Android可能是鸡肋!华为手机销量猛增无疑让华为高兴,不过面对华为提出提出其消费者BG要在5年内实现千万收入,压力颇大,单靠手机业务显然难以实现,在小米推出笔记本的示范效应下,华为推出笔记本是很正常的情况,在过去几年,华为一直都在学习小米的营销模式。 让人诧异的是华为的二合一笔记本产品是一个双系统产品,即是加上键盘是使用Windows系统的笔记本,拆掉键盘就是And..._android开发用华为笔记本怎么样

【工具】使用git提交项目到码云_git首次提交代码到码云-程序员宅基地

文章浏览阅读1.3k次。1、下载git客户端工具(.exe) 点击安装 2、找到你存放项目的根目录(例如:e:/gittest) 3、在该根目录下,右键,选择“Git Bash Here” 4、出现命令行,输入初始化命令: git init5、使用命令行添加帮助文件6、进行基本设置git config –global user.name “用户名” (这里的用户名是你要设置的git的全局姓名..._git首次提交代码到码云

高并发C/S的TCP版本golang实现_golang tcp高并发-程序员宅基地

文章浏览阅读682次。前面一篇文章写到的实现服务器只能连接一个客户端,没有发挥出go语言的协程特性,所以又可用如下方法实现高并发,多个客户端连接来完成:package mainimport ( "fmt" "net" "strings")func main() { // 创建监听套接字 listener, err := net.Listen("tcp", "127.0.0.1:8001") if err != nil { fmt.Println("listen err", err) return_golang tcp高并发

随便推点

如何制作可用于Windows虚拟机的macOS安装镜像_esddmg-程序员宅基地

文章浏览阅读3.8k次。macOS系统的安装镜像文件默认都是dmg文件,不能直接使用于Windows下的虚拟机安装,所以需要制作成Windows下可以识别的ISO或者CDR格式。一、下载DMG安装镜像以下载 macOS Sierra为例,可以从苹果官网页面的第4节下载 macOS Sierra找到下载链接。二、在macOS中双击安装..._esddmg

LATEX公式行间距调整_latex 公式 距离大-程序员宅基地

文章浏览阅读1.2w次,点赞4次,收藏11次。LATEX默认的行间公式与上下文本间距过大。以book类为例,公式和文本之间的间距由\abovedisplayskip 和\belowdisplayskip两个距离来控制的。book类10号字体的定义为:\renewcommand\normalsize{%\@setfontsize\normalsize\@xpt\@xiipt\abovedisplayskip 10\p@ \@plus2\p@ \@minus5\p@\abovedisplayshortskip \z@ \@plus3\p@.._latex 公式 距离大

IDEA 设置文档注释_idea文档注释-程序员宅基地

文章浏览阅读2.6k次,点赞9次,收藏12次。IDEA 设置文档注释1、参考资料IDEA类和方法注释模板设置(非常详细)idea注释模版配置(吐血推荐!!!)2、类文档注释2.1、设置类文档注释模板在【File and Code Templates】页面设置类(Class)的文档注释/** *@ClassName ${NAME} *@Description TODO *@Author ${USER} *@Date ${DATE} ${TIME} *@Version 1.0 */2.2、使用类文档注释注意:只有新建_idea文档注释

按经纬度产生的距离来排序-程序员宅基地

文章浏览阅读394次,点赞10次,收藏4次。表里有经纬度,传入经纬度,如何按距离排序

图像去噪数据集_dnd数据集-程序员宅基地

文章浏览阅读2.8w次,点赞29次,收藏189次。Introduction目前效果出色的深度去噪方法大都采用监督学习的方法,需要采集输入-输出图像对(noisy/noise-free images pairs)建立训练数据集。数据集的建立是关键的任务。数据集的质量将直接决定去噪结果的质量。如何获取尽量多场景的图像数据,如何获得高质量的参考图像(ground truth),是目前研究的热点。The State of ArtsMe..._dnd数据集

推荐文章

热门文章

相关标签