洛谷P2023 [AHOI2009]维护序列(线段树维护加和乘)

传送门

题意就是给你一系列数字,有3中操作

  1. 给你一个区间,将这个区间里面的所有数字全部乘以一个给定值c
  2. 给你一个区间,将这个区间里面的所有数字全部加上一个给定值c
  3. 给你一个区间,询问这个区间的和

这道题要用线段树维护一个加,一个乘
lazy0维护的是加
lazy1维护的是乘
任何的一个x对它进行乘和加的操作最终结果总可以写成形如ax+b的形式,
在这里的a就是我们需要维护的乘了, 显然b就是我们要维护的加
举个栗子:

(x*4+3)*2+3=8*x+9
lazy1=4*2
lazy0=3*2+3
#include <iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<vector>
#include<queue>
#include<string>
#include <cmath>
#define mod 999997
#define lson l, mid, root << 1
#define rson mid + 1, r, root << 1 | 1
#define father  l , r , root
#define lowbit(x) ( x & ( - x ) )
using namespace std;
typedef long long ll;
const int maxn = 100100;
const int inf = 0x3f3f3f3f; 
ll n,p;
ll num[maxn];
ll sum[maxn<<2];//区间和
ll lazy1[maxn<<2];//维护乘
ll lazy0[maxn<<2];//维护加

void push_up(ll root){
    sum[root]=(sum[root<<1]+sum[root<<1|1])%p;
    return ;
}

void push_down(ll l,ll r,ll root){
    if(lazy0[root]==0&&lazy1[root]==1)   return ;
    ll ql=root<<1;
    ll qr=root<<1|1;
    ll mid=(l+r)>>1;
    sum[ql]=(sum[ql]*lazy1[root]+lazy0[root]*(mid-l+1))%p;
    sum[qr]=(sum[qr]*lazy1[root]+lazy0[root]*(r-mid))%p;
    //更新左区间的信息
    lazy1[ql]=lazy1[ql]*lazy1[root]%p;
    lazy0[ql]=(lazy0[root]+lazy1[root]*lazy0[ql])%p;
    //更新右区间的信息
    lazy1[qr]=lazy1[qr]*lazy1[root]%p;
    lazy0[qr]=(lazy0[qr]*lazy1[root]+lazy0[root])%p;
    //更新过后取消标记
    lazy0[root]=0;
    lazy1[root]=1;
}

void build_tree(ll l,ll r,ll root){
    lazy0[root]=0;
    lazy1[root]=1;
    if(l==r){
        sum[root]=num[l]%p;
        return;
    }
    ll mid=(l+r)>>1;
    build_tree(lson);
    build_tree(rson);
    push_up(root);
}

void change(ll L,ll R,ll c,ll temp,ll l,ll r,ll root){
    if(L<=l&&R>=r){
        if(temp==1){
            sum[root]=(sum[root]*c)%p;
            lazy1[root]=(lazy1[root]*c)%p;
            lazy0[root]=(lazy0[root]*c)%p;//注意,这里应该是乘 
        }else{ 
        	sum[root]=(sum[root]+c*(r-l+1))%p;
        	lazy0[root]=(lazy0[root]+c)%p;
        }
        return ;
    }
    push_down(l,r,root);
    ll mid=(l+r)>>1;
    if(mid>=L)change(L,R,c,temp,lson);
    if(mid<R)change(L,R,c,temp,rson);
    push_up(root);
}

ll query(ll L,ll R,ll l,ll r ,ll root){
    if(L<=l&&R>=r){
        return sum[root];
    }
    push_down(l,r,root);
    ll ans=0;
    ll mid=(l+r)>>1;
    if(mid>=L)ans=(ans+query(L,R,lson))%p;
    if(mid<R)ans=(ans+query(L,R,rson))%p;
    return ans%p;
}

int main(){
	while(~scanf("%lld%lld",&n,&p)){
	//scanf("%lld%lld",&n,&p);
		for(ll i=1;i<=n;i++){
			scanf("%lld",&num[i]);
		}
		build_tree(1,n,1);
		ll q;
		scanf("%lld",&q);
		while(q--){
			ll flag,t,g,c;
			scanf("%lld",&flag);
			if(flag==3){
				scanf("%lld%lld",&t,&g);
				printf("%lld\n",query(t,g,1,n,1));
			}else{
                scanf("%lld%lld%lld",&t,&g,&c);
                change(t,g,c,flag,1,n,1);
			}
		}
	}
    return 0;
}

数据集介绍:淋巴细胞、中性粒细胞与鳞状细胞癌检测数据集 一、基础信息 数据集名称:淋巴细胞、中性粒细胞与鳞状细胞癌检测数据集 数据规模: - 训练集:5,205张医学图像 - 验证集:240张医学图像 - 测试集:220张医学图像 病理分类: - Lymphocytes(淋巴细胞):免疫系统核心细胞,参与病毒防御与肿瘤监控 - NE(中性粒细胞):急性炎症标志物,反映感染与组织损伤 - SCC(鳞状细胞癌):常见上皮组织恶性肿瘤,需早期精准识别 标注规范: - YOLO格式标注,支持目标检测模型训练 - 包含多边形坐标标注,适配病理切片分析需求 二、核心应用 数字病理诊断系统: 支持开发白细胞亚型自动分类系统与鳞癌检测算法,辅助显微镜图像分析,提升病理科工作效率。 血液病辅助诊断: 通过淋巴细胞/中性粒细胞比例分析,为白血病、淋巴瘤等血液疾病提供AI辅助判断依据。 癌症筛查研究: 包含鳞状细胞癌阳性样本,适用于皮肤癌、头颈癌等上皮源性肿瘤的早期筛查模型开发。 医学影像教学: 提供标注规范的病理图像数据,适用于医学院校的细胞形态学教学与AI医疗交叉学科实训。 三、核心优势 临床病理学深度适配: 涵盖血液系统关键细胞类型与高发癌症类别,标注经病理专家双重校验,确保医学准确性。 多场景检测能力: 同时支持血涂片细胞分类与组织切片癌变区域检测,满足复合型医疗AI产品开发需求。 数据分布专业化: 按医学研究标准划分训练集/验证集/测试集,包含典型病例与边缘案例,强化模型鲁棒性。 跨任务兼容性: YOLO标注格式可直接用于目标检测训练,同时支持转换为分类、实例分割等扩展任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值