牛客题目数据结构

做过线段树2模板大概可以写出一部分代码,这题主要关键点是怎么维护平方和

借图了

这样处理完maketag的代码就出来了

void maketag(int id,int l,int r,ll v,int opt){if(opt==1){seg[id].val*=v;seg[id].pfval*=(v*v);seg[id].mul*=v;seg[id].add*=v;}else{seg[id].pfval+=v*v*(r-l+1)+2*v*seg[id].val;seg[id].val+=(r-l+1)*v;seg[id].add+=v;}
}

感觉这类题只要数学处理出得到懒标记后,式子变化量是什么就可以了

对了还需要看一下变化量有没有用到其他维护量,如果有要把维护量放在后面更新

还有如果有多个标记,要考虑标记之间有没有影响,牛客数据弱,我懒标记没处理好过了

// Problem: 数据结构
// Contest: NowCoder
// URL: https://ac.nowcoder.com/acm/contest/19684/D
// Memory Limit: 524288 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)#include<iostream>
#include<algorithm>
#include<vector>
#define INF (1ll<<60)
using namespace std;
typedef long long ll;
const int N=1e5+9;
int a[N];
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;
}
void pushup(int id){seg[id].val=seg[tl(id)].val+seg[tr(id)].val;seg[id].pfval=seg[tl(id)].pfval+seg[tr(id)].pfval;
}
void build(int id,int l,int r){seg[id].mul=1;if(l==r){seg[id].val=a[l];seg[id].pfval=a[l]*a[l];}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){seg[id].val*=v;seg[id].pfval*=(v*v);seg[id].mul*=v;seg[id].add*=v;}else{seg[id].pfval+=v*v*(r-l+1)+2*v*seg[id].val;seg[id].val+=(r-l+1)*v;seg[id].add+=v;}
}
void pushdown(int id,int l,int r){int mid=(l+r)>>1;maketag(tl(id),l,mid,seg[id].mul,1);maketag(tr(id),mid+1,r,seg[id].mul,1);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;}else if(!outofrange(L,R,l,r)){int mid=(L+R)>>1;pushdown(id,L,R);return querysum(tl(id),L,mid,l,r)+querysum(tr(id),mid+1,R,l,r);}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;}else if(!outofrange(L,R,l,r)){int mid=(L+R)>>1;pushdown(id,L,R);return querypfsum(tl(id),L,mid,l,r)+querypfsum(tr(id),mid+1,R,l,r);}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);}
}
int main(){ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);int n,m;cin>>n>>m;for(int i=1;i<=n;i++){cin>>a[i];}build(1,1,n);for(int i=1;i<=m;i++){int opt;cin>>opt;if(opt==1){int l,r;cin>>l>>r;cout<<querysum(1,1,n,l,r)<<'\n';}else if(opt==2){int l,r;cin>>l>>r;cout<<querypfsum(1,1,n,l,r)<<'\n';}else if(opt==3){int l,r,x;cin>>l>>r>>x;modifymul(1,1,n,l,r,x);}else{int l,r,x;cin>>l>>r>>x;modifyadd(1,1,n,l,r,x);}}return 0;
}

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

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

相关文章

仓库管理业务在WMS与ERP中如何抉择

当然&#xff0c;以下是WMS&#xff08;仓库管理系统&#xff09;与ERP&#xff08;企业资源计划&#xff09;系统在仓库管理中的主要区别和各自的优势的整理&#xff1a; 一、主要区别&#xff1a; 1. 功能范围&#xff1a; - WMS&#xff1a;专注于仓库内部运作&#xff0c;…

【机器学习】决策树模型(个人笔记)

文章目录 多样性指标基尼杂质指数&#xff08;Gini Impurity Index&#xff09;熵&#xff08;Entropy&#xff09; 决策树的应用 源代码文件请点击此处&#xff01; 多样性指标 基尼杂质指数&#xff08;Gini Impurity Index&#xff09; 若集合中包含 m m m 个元素和 n …

LeetCode1318或运算的最小翻转次数

题目描述 给你三个正整数 a、b 和 c。你可以对 a 和 b 的二进制表示进行位翻转操作&#xff0c;返回能够使按位或运算 a OR b c 成立的最小翻转次数。「位翻转操作」是指将一个数的二进制表示任何单个位上的 1 变成 0 或者 0 变成 1 。 解析 这一题就按位依次比较就行了。取这…

[C++数据结构之看懂就这一篇]图(上)

&#x1f4da;博客主页&#xff1a;Zhui_Yi_&#x1f50d;&#xff1a;上期回顾&#xff1a;JAVA面向对象&#xff08;上&#xff09;❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️&#x1f387;追当今朝…

Android 可拖拽的View,限制在父布局中随意拖拽;拖拽结束后可左右吸边;

实现方法一&#xff1a;自定义View 可随意拖动拖拽的View&#xff0c;限制拖动范围是父布局中&#xff1b; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.view.ViewGroup; …

Simscape Multibody与RigidBodyTree:机器人建模

RigidBodyTree&#xff1a;主要用于表示机器人刚体结构的动力学模型&#xff0c;重点关注机器人的几何结构、质量和力矩&#xff0c;以及它们如何随时间变化。它通常用于计算机器人的运动和受力情况。Simscape Multibody&#xff1a;作为Simscape的一个子模块&#xff0c;专门用…

情景题之小明的Linux实习之旅:linux实战练习1(下)【基础命令,权限修改,日志查询,进程管理...】

小明的Linux实习之旅&#xff1a;基础指令练习情景练习题下 前景提要小明是怎么做的场景1&#xff1a;初识Linux&#xff0c;创建目录和文件场景2&#xff1a;权限管理&#xff0c;小明的权限困惑场景3&#xff1a;打包与解压&#xff0c;小明的备份操作场景4&#xff1a;使用G…

java基础知识(2)

在jdk8之前的版本会使用stringbuilder&#xff0c;而在jdk8之后的版本&#xff08;包含jkd8&#xff09;则会简化&#xff1b; stringbuilder在创建的时候&#xff0c;默认容量为16&#xff0c;容量是最多放多少位&#xff0c;长度是实际已经存放了多少位&#xff1b;如果超过…

现代操作系统(第四版)课后习题-5.输入/输出

五、输入/输出 1.芯片技术的发展已经使得将整个控制器包括所有总线访问逻辑放在一个便宜的芯片上成为可能。这对于图1-6的模型具有什么影响? 图1-6展示的是一个计算机系统的硬件架构&#xff0c;包括CPU、存储设备、输入/输出设备等的连接关系。芯片技术的发展&#xff0c;尤…

力扣:209. 长度最小的子数组(Java,双指针,滑动窗口)

目录 题目描述&#xff1a;示例 1&#xff1a;示例 2&#xff1a;代码实现&#xff1a; 题目描述&#xff1a; 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的子数组[numsl, numsl1, …, numsr-1, numsr] &#xf…

【思考】Vue2响应丢失、$set

【思考】Vue2响应丢失、$set vue2响应丢失情况复现原因解决总结 vue2响应丢失情况复现 场景&#xff1a;直接通过数组下标去修改数组造成响应丢失 <template><div><p v-for"(item, index) in list" :key"index">{{item}}</p><…

软件安全技术【太原理工大学】

没有划重点&#xff0c;只说了一句课后题和实验中的内容都可能会出。 2022考试题型&#xff1a;选择20个20分&#xff0c;填空10个10分&#xff0c;名词解释4个20分&#xff0c;简答6个30分&#xff0c;分析与论述2个20分&#xff0c;没找到历年题。 如此看来&#xff0c;这门考…

渗透测试模拟实战(二)-BlueCMS平台

渗透测试 渗透测试是维护网络安全的重要组成部分&#xff0c;可以帮助组织识别并修复潜在的安全漏洞&#xff0c;减少被恶意攻击的风险。然而&#xff0c;进行渗透测试时必须遵守法律和道德规范&#xff0c;确保所有活动都在授权范围内进行。 环境部署&#xff1a; study2016、…

【优选算法】优先级队列 {优先级队列解决TopK问题,利用大小堆维护数据流的中位数}

一、经验总结 优先级队列&#xff08;堆&#xff09;&#xff0c;常用于在集合中筛选最值或解决TopK问题。 提示&#xff1a;对于固定序列的TopK问题&#xff0c;最优解决方案是快速选择算法&#xff0c;时间复杂度为O(N)比堆算法O(NlogK)更优&#xff1b;而对于动态维护数据流…

使用Matplotlib进行Python绘图

Matplotlib是Python中广泛使用的2D绘图库&#xff0c;适合于各种数据可视化需求。它提供了多种图表类型&#xff0c;如折线图、散点图、柱状图和饼图&#xff0c;帮助用户直观地展示数据。 基本介绍 Matplotlib通过其主要模块pyplot&#xff0c;允许用户用简洁的代码快速绘制…

linux 网桥学习

前言&#xff1a; 本文来学习一下linux网桥概念和网桥配置 1. linux网桥概念 网桥&#xff0c;类似于中继器&#xff0c;连接局域网中两个或者多个网段。它与中继器的不同之处就在于它能够解析它收发的数据&#xff0c;读取目标地址信息&#xff08;MAC&#xff09;&#xff…

立创EDA专业版设置位号居中并调整字体大小

选择某一个器件位号&#xff0c;右键->查找&#xff1a; 选择查找全部&#xff1a; 下面会显示查找结果&#xff1a; 查看&#xff0c;所有的位号都被选中了&#xff1a; 然后布局->属性位置&#xff1a; 属性位置选择中间&#xff1a; 然后位号就居中了 调整字体大小&a…

微信小程序学习笔记(1)

文章目录 一、文件作用app.json&#xff1a;project.config.json:sitemap.json页面中.json 二、项目首页三、语法**WXML**和**HTML**WXSS 和CSS的区别小程序中.js文件的分类 一、文件作用 app.json&#xff1a; 当前小程序的全局配置&#xff0c;包括所有页面路径、窗口外观、…

文件的基础必备知识(初学者入门)

1. 为什么使用文件 2. 什么是文件 3. 二进制文件和文本文件 4. 文件的打开和关闭 1.为什么使用文件 我们写的程序数据是存储在电脑内存中&#xff0c;如果程序退出&#xff0c;内存回收&#xff0c;数据就丢失&#xff0c;等程序再次运行时&#xff0c;上次的数据已经消失。面…

每日复盘-20240607

今日关注&#xff1a; 这几天市场环境不好&#xff0c;一直空仓。 六日涨幅最大: ------1--------605258--------- 协和电子 五日涨幅最大: ------1--------605258--------- 协和电子 四日涨幅最大: ------1--------605258--------- 协和电子 三日涨幅最大: ------1--------0…