牛客题目线段树

news2025/2/24 14:04:06

主要是操作三,怎么计算

那么只需要维护区间和和区间平方和即可,1/2用逆元

多个标记注意标记之间有没有影响,mod其实很简单的,但是我标记没处理好一直wa,mod乱搞一下,我mod很丑

#include<iostream>
#include<algorithm>
#include<vector>
#define INF (1ll<<60)
using namespace std;
typedef long long ll;
const int N=1e5+9;
ll a[N];
ll n,m,mod;
struct node{
	ll val,pfval,mul,add;
}seg[N<<2];
ll tl(ll x){
	return x<<1;
}
ll tr(ll x){
	return x<<1|1;
}
ll qmi(ll a,ll b){
    ll res=1;
    while(b){
        if(b&1){
            res=res*a%mod;
        }
        b>>=1;
        a=a*a%mod;
    }
    return res%mod;
}
ll inv(ll x){
    return qmi(x,mod-2)%mod;
}
void pushup(int id){
	seg[id].val=(seg[tl(id)].val%mod)+(seg[tr(id)].val%mod);
	seg[id].pfval=(seg[tl(id)].pfval%mod)+(seg[tr(id)].pfval%mod);
}
void build(int id,int l,int r){
	seg[id].mul=1;
    seg[id].add=0;
	if(l==r){
		seg[id].val=a[l]%mod;
		seg[id].pfval=a[l]*a[l]%mod;
	}else{
		int mid=(l+r)>>1;
		build(tl(id),l,mid);
		build(tr(id),mid+1,r);
		pushup(id);
	}
}
bool inrange(int L,int R,int l,int r){
	return L>=l && R<=r;
}
bool outofrange(int L,int R,int l,int r){
	return L>r || l>R;
}
void maketag(int id,int l,int r,ll v,int opt){
	if(opt==1){
        v%=mod;
		seg[id].val*=v;
        seg[id].val%=mod;
        seg[id].mul*=v;
        seg[id].mul%=mod;
        v=(v%mod)*v%mod;
		seg[id].pfval*=v;
        (seg[id].add*=v)%=mod;
        seg[id].pfval%=mod;
	}else{
        v%=mod;
		seg[id].pfval+=((v%mod)*v%mod)*(r-l+1)%mod+2*(v%mod)*(seg[id].val%mod);
        seg[id].pfval%=mod;
        seg[id].val+=(r-l+1)*(v%mod);  
        seg[id].val%=mod;
		seg[id].add+=v;
        seg[id].add%=mod;
	}
}
void pushdown(int id,int l,int r){
	int mid=(l+r)>>1;
    if(seg[id].mul!=1){
        maketag(tl(id),l,mid,seg[id].mul,1);
	    maketag(tr(id),mid+1,r,seg[id].mul,1);
    }
    if(seg[id].add){
        maketag(tl(id),l,mid,seg[id].add,2);
	    maketag(tr(id),mid+1,r,seg[id].add,2);
    }
	seg[id].mul=1;
	seg[id].add=0;
}
ll querysum(int id,int L,int R,int l,int r){
	if(inrange(L,R,l,r)){
		return seg[id].val%mod;
	}else if(!outofrange(L,R,l,r)){
		int mid=(L+R)>>1;
		pushdown(id,L,R);
		return querysum(tl(id),L,mid,l,r)%mod+querysum(tr(id),mid+1,R,l,r)%mod;
	}else{
		return 0;
	}
}
ll querypfsum(int id,int L,int R,int l,int r){
	if(inrange(L,R,l,r)){
		return seg[id].pfval%mod;
	}else if(!outofrange(L,R,l,r)){
		int mid=(L+R)>>1;
		pushdown(id,L,R);
		return querypfsum(tl(id),L,mid,l,r)%mod+querypfsum(tr(id),mid+1,R,l,r)%mod;
	}else{
		return 0;
	}
}
void modifymul(int id,int L,int R,int l,int r,ll v){
	if(inrange(L,R,l,r)){
		maketag(id,L,R,v,1);
	}else if(!outofrange(L,R,l,r)){
		int mid=(L+R)>>1;
		pushdown(id,L,R);
		modifymul(tl(id),L,mid,l,r,v);
		modifymul(tr(id),mid+1,R,l,r,v);
		pushup(id);
	}
}
void modifyadd(int id,int L,int R,int l,int r,ll v){
	if(inrange(L,R,l,r)){
		maketag(id,L,R,v,2);
	}else if(!outofrange(L,R,l,r)){
		int mid=(L+R)>>1;
		pushdown(id,L,R);
		modifyadd(tl(id),L,mid,l,r,v);
		modifyadd(tr(id),mid+1,R,l,r,v);
		pushup(id);
	}
}
void solve(){
    cin>>n>>m>>mod;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        a[i]%=mod;
    }
    build(1,1,n);
    for(int i=1;i<=m;i++){
        int opt;
        cin>>opt;
        if(opt==1){
            int l,r,v;
            cin>>l>>r>>v;
            modifyadd(1,1,n,l,r,v);
        }else if(opt==2){
            int l,r,v;
            cin>>l>>r>>v;
            modifymul(1,1,n,l,r,v);
        }else{
            int l,r;
            cin>>l>>r;
            ll res1=querysum(1,1,n,l,r)%mod;
            res1=res1*res1%mod;
            ll res2=querypfsum(1,1,n,l,r)%mod;
            res2%=mod;
            ll ans=(((res1-res2)%mod+mod)%mod)*inv(2)%mod;
            cout<<ans%mod<<'\n';
        }
    }
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    int t;
    cin>>t;
    while(t--){
        solve();
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1810772.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

根据阿里文档编写【springAI+通义千问】出现的 “Can not find api-key” 异常

昨天晚上照着阿里的文档开始了我的首次【springAI 通义千问】之旅&#xff0c;不料刚开始就被狠狠地搞了一下&#xff0c;主要原因是文档有误导致程序无法按着预期运行。 按着文档一步步配置好以后&#xff0c;启动后报错信息如下&#xff1a; 照着文档&#xff08;如下图&a…

脉动圆形加载动画

效果图: 完整代码: <!DOCTYPE html> <html> <head><meta charset="UTF-8" /><title>脉动圆形加载动画</title><style type="text/css">body {background: #ECF0F1;display: flex;justify-content: center;al…

AI大模型:未来5~10年的技术革命与机遇

引言 在当今科技飞速发展的时代&#xff0c;AI大模型无疑成为了一个热门话题。它不仅仅是一个技术名词&#xff0c;更是未来5&#xff5e;10年内不可避免的技术革命。AI大模型以其强大的数据处理能力、深度学习能力以及广泛的应用前景&#xff0c;正在改变我们的生活和工作方式…

人大京仓数据库关闭大小写敏感

人大京仓数据库关闭大小写敏感 1、先删除data&#xff08;Kingbase\ES\V8\&#xff09;文件夹下的所有文件夹 2、接着找到initdb.exe所在位置&#xff0c;我的位置是在这里D:\Kingbase\ES\V8\Server\bin&#xff0c;然后输入cmd,运行一下 initdb -E UTF-8 -D C:\Kingbase\ES…

秋招突击——6/10——复习{(树形DP)树的最长路径、}——新作{电话号码的字母组合}

文章目录 引言复习树形DP——树的最长路径思路分析参考思路求图的最长的直径的通用方法证明 树形DP分析方法问题 参考代码使用一维数组模拟邻接表存储树形结构或者稀疏图 新作电话号码的组合思路分析参考实现 总结 引言 中间面试了两天&#xff0c;去上海呆了一天&#xff0c;…

1992-2012年美国西海岸的海面高度异常数据集

Gridded Altimeter Fields with Enhanced Coastal Coverage 具有增强海岸覆盖范围的网格化测高场 简介 具有增强的海岸覆盖范围的网格化高度计场数据产品包含美国西海岸的海面高度异常&#xff08;SSHA 或 SLA&#xff09;以及北纬 35.25 度-48.5 度和东经 227.75 度-248.5 …

Java版商城:Spring Cloud+SpringBoot b2b2c实现多商家入驻、一件代发及免 费小程序商城搭建

1. 涉及平台 平台管理、商家端&#xff08;pc端、手机端&#xff09;、买家平台&#xff08;h5/公众号、小程序、app端&#xff08;ios/android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 spring cloud、spring boot、mybatis、redis 3. 前端框架…

PHP短链接短网址生成源码

下载地址&#xff1a;PHP短链接短网址生成源码 V3.0(11月14日更新) 1.更换用户中心模板 2.首页可以更换模板&#xff08;暂时只有俩套&#xff09; 3.增加首页背景更换 4.logo可以在后台设置 5.更换后台模板 6.优化访问统计功能 7.删除了几个没什么用的东西 8.数据表已支持全…

ARM32开发--串口库封装(初级)

知不足而奋进望远山而前行 目录 文章目录 前言 目标 内容 开发流程 文件目录创建 分组创建 接口定义 完整代码 总结 前言 在嵌入式软件开发中&#xff0c;封装抽取流程和抽取封装策略是非常重要的技术&#xff0c;能够提高代码的复用性和可维护性。本文将介绍如何在文…

操作系统安全:Windows系统安全配置,Windows安全基线检查加固

「作者简介」&#xff1a;2022年北京冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础对安全知识体系进行总结与归纳&#xff0c;著作适用于快速入门的 《网络安全自学教程》&#xff0c;内容涵盖系统安全、信息收集等…

使用 C# 学习面向对象编程:第 4 部分

C# 构造函数 第 1 部分仅介绍了类构造函数的基础知识。 在本课中&#xff0c;我们将详细讨论各种类型的构造函数。 属性类型 默认构造函数构造函数重载私有构造函数构造函数链静态构造函数析构函数 请注意构造函数的一些基本概念&#xff0c;并确保你的理解非常清楚&#x…

Spring Boot 分片上传、断点续传、大文件上传、秒传,应有尽有

文件上传是一个老生常谈的话题了&#xff0c;在文件相对比较小的情况下&#xff0c;可以直接把文件转化为字节流上传到服务器&#xff0c;但在文件比较大的情况下&#xff0c;用普通的方式进行上传&#xff0c;这可不是一个好的办法&#xff0c;毕竟很少有人会忍受&#xff0c;…

怎么隐藏文件夹?4个方法保护文件!

“我在使用电脑时&#xff0c;想将一个比较重要的文件夹隐藏&#xff0c;但是不知道应该怎么操作&#xff0c;请大家给我出出主意。” 在数字化时代&#xff0c;我们的电脑和手机中存储着大量个人信息和敏感数据。其中&#xff0c;一些文件夹可能包含了不愿被他人轻易发现的私密…

【全篇】C语言从入门到入土

【全篇】C语言从入门到入土 文章目录 【全篇】C语言从入门到入土第一章 前言如何去学习&#xff0c;学习方法论 第二章 初识1.代码编译工具2.c程序的基础框架3.数据的表现形式变量1.要先定义后使用&#xff08;变量名的定义是由自己决定的&#xff0c;一般倾向于顾文生义&#…

Bankless:为什么 AI 需要 Crypto 的技术?

原文标题&#xff1a;《Why AI Needs Crypto’s Values》 撰文&#xff1a;Arjun Chand&#xff0c;Bankless 编译&#xff1a;Chris&#xff0c;Techub News 原文来自香港Web3媒体&#xff1a;Techub News 人工智能革命的梦想一直是一把双刃剑。 释放人工智能的潜力可以解…

MySQL高性能(MySQL锁)

MySQL性能系列 MySQL锁 前言1. 死锁机制2. 思维导图与锁划分介绍3. 粒度划分锁3.1. 全局锁3.2. 页级锁&#xff08;Page-level locking&#xff09;3.3. 表级锁&#xff08;Tables-level lock&#xff09;○ 共享锁&#xff08;表级&#xff09;○ 排他锁&#xff08;表级&…

JS 实现动态规划

function getPaths(m, n) {// m * n 二维数组&#xff0c;模拟网格const map new Array(m)for (let i 0; i < m; i) {map[i] new Array(n)}// 如果只走第一行&#xff0c;就只有一条路径。所以第一行所有 item 都填充 1map[0].fill(1)// 如果只走第一列&#xff0c;也只有…

vulnhub靶场:PWNOS: 2.0 (PRE-RELEASE)多种渗透方法

本文介绍靶机PWNOS: 2.0 的渗透方法&#xff0c;由于靶机系统比较老&#xff0c;尝试了几种不同的角度获得shell和提权。 1 环境搭建 根据提示信息&#xff0c;需要将网段设置为10.10.10.0/24&#xff0c;靶机ip为10.10.10.100。可以配置仅主机模式或NAT模式网卡&#xff0c;…

王学岗鸿蒙开发(北向)——————(十三)音乐播放器

AudioRenderer适合录音 AVPlayer:简单的本地单曲播放 MP3文件放置的地方 import media from ohos.multimedia.media import common from ohos.app.ability.common; Entry Component struct Index {//第1步&#xff1a;avPlayer:media.AVPlayer nullasync onPageShow(){//第…

Parallels Desktop 虚拟机必备软件有哪些 虚拟机软件有什么作用和用途

随着苹果M系列芯片电脑的推出&#xff0c;虚拟机的使用变得越来越流行。不同于苹果以往的Intel处理器电脑&#xff0c;其M系列芯片电脑无法安装双系统。如果要使用非macOS系统&#xff0c;可以通过创建虚拟机系统的方式实现。那么&#xff0c;虚拟机软件有什么作用和用途&#…