题目链接

P2023 [AHOI2009]维护序列

解题思路

线段树板子。不难,但是...有坑。坑有多深?一页\(WA\)。

由于乘法可能乘\(k=0\),我这种做法可能会使结果产生负数。于是就有了这篇题解。

(详情见代码注释)

AC代码

#include<stdio.h>
#define min(a,b) (a>b?b:a)
#define max(a,b) (a>b?a:b)
typedef long long ll;
int n,m;
ll mod,k,a[500010];
struct Tree{
int left,right;
ll data,lazy,mul;
}tree[2000010];
void build(int p,int left,int right){
tree[p].left=left;
tree[p].right=right;
tree[p].mul=1;
if(left==right){tree[p].data=a[left];return;}
build(p<<1,left,(left+right)>>1);
build(p<<1|1,((left+right)>>1)+1,right);
tree[p].data=(tree[p<<1].data+tree[p<<1|1].data)%mod;
}
void pushdown(int p){
ll mul=tree[p].mul,lazy=tree[p].lazy;
tree[p<<1].lazy*=mul;
tree[p<<1].lazy+=lazy;tree[p<<1].lazy%=mod;
tree[p<<1].mul*=mul;tree[p<<1].mul%=mod;
tree[p<<1|1].lazy*=mul;
tree[p<<1|1].lazy+=lazy;tree[p<<1|1].lazy%=mod;
tree[p<<1|1].mul*=mul;tree[p<<1|1].mul%=mod;
tree[p].data*=tree[p].mul;
tree[p].data+=(tree[p].right-tree[p].left+1)*tree[p].lazy;
tree[p].data%=mod;
tree[p].lazy=0;tree[p].mul=1;
}
void add(int left,int right,ll k,int p){
int l=tree[p].left,r=tree[p].right;
if(l>right||r<left||p>4*n)return;
pushdown(p);
if(l>=left&&r<=right){
tree[p].lazy+=k;
tree[p].lazy%=mod;
return;
}
tree[p].data+=k*(min(right,r)-max(left,l)+1);
tree[p].data%=mod;
add(left,right,k,p<<1);
add(left,right,k,p<<1|1);
}
ll multy(int left,int right,ll k,int p){
int l=tree[p].left,r=tree[p].right;
if(l>right||r<left||p>4*n)return 0;
pushdown(p);
if(l>=left&&r<=right){
ll temp=tree[p].data*tree[p].mul+tree[p].lazy*(r-l+1);
tree[p].lazy*=k;tree[p].lazy%=mod;
tree[p].mul*=k;tree[p].mul%=mod;
return ((k-1)*temp%mod+mod)%mod;//非常重要!!!!!!
}
ll temp=multy(left,right,k,p<<1)+multy(left,right,k,p<<1|1);
tree[p].data+=temp;
tree[p].data=;
return temp;
}
ll query(int left,int right,int p){
int l=tree[p].left,r=tree[p].right;
if(l>right||r<left||p>4*n)return 0;
pushdown(p);
if(l>=left&&r<=right)return tree[p].data;
return query(left,right,p<<1)+query(left,right,p<<1|1);
}
int main(){
int s,x,y,i;
scanf("%d%lld",&n,&mod);
for(i=1;i<=n;i++)scanf("%lld",&a[i]);
build(1,1,n);
scanf("%d",&m);
while(m--){
scanf("%d%d%d",&s,&x,&y);
if(s-3){
scanf("%lld",&k);
if(s-1)add(x,y,k,1);
else multy(x,y,k,1);
}else printf("%lld\n",query(x,y,1)%mod);
}
return 0;
}

P2023 [AHOI2009]维护序列 题解(线段树)的更多相关文章

  1. 洛谷P2023 [AHOI2009]维护序列(线段树区间更新,区间查询)

    洛谷P2023 [AHOI2009]维护序列 区间修改 当我们要修改一个区间时,要保证 \(ax+b\) 的形式,即先乘后加的形式.当将区间乘以一个数 \(k\) 时,原来的区间和为 \(ax+b\) ...

  2. 【题解】洛谷P2023 [AHOI2009] 维护序列(线段树)

    洛谷P2023:https://www.luogu.org/problemnew/show/P2023 思路 需要2个Lazy-Tag 一个表示加的 一个表示乘的 需要先计算乘法 再计算加法 来自你谷 ...

  3. BZOJ_1798_[AHOI2009]维护序列_线段树

    BZOJ_1798_[AHOI2009]维护序列_线段树 题意:老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: ( ...

  4. 洛谷P3373 【模板】线段树 2 && P2023 [AHOI2009]维护序列——题解

    题目传送: P3373 [模板]线段树 2  P2023 [AHOI2009]维护序列 该题较传统线段树模板相比多了一个区间乘的操作.一提到线段树的区间维护问题,就自然想到了“懒标记”:为了降低时间复 ...

  5. 洛谷 P2023 [AHOI2009]维护序列 题解

    P2023 [AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列中 ...

  6. 1798. [AHOI2009]维护序列【线段树】

    Description 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2 ...

  7. 洛谷 P2023 [AHOI2009]维护序列

    P2023 [AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中 ...

  8. 【bzoj1798】[Ahoi2009]Seq 维护序列seq 线段树

    题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一 ...

  9. [洛谷P2023] [AHOI2009]维护序列

    洛谷题目链接:[AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列 ...

随机推荐

  1. CentOS7系统时间和硬件时间不同步问题

    CentOS7系统中有两个时间:系统时间 和 硬件时间 我们常用命令 date 会输出系统时间,用 date 命令修改的也是系统时间 硬件时间是写入到 BIOS 中的时间,用 hwclock -r 命 ...

  2. Linux CentOS7.x 升级内核的方法

    一.概述 在数据中心基础环境中,Linux系统使用很普遍,但是有时候会遇到应用程序需要运行在高版本的内核上或者有时候系统自身要求需要升级内核,我们要综合考虑升级内核的风险. 二.升级内核的方法 1.查 ...

  3. JavaScript DOM操作之查找元素节点

    概要: 编程接口 可通过 JavaScript 对 HTML DOM 进行访问. 所有 HTML 元素被定义为对象,而编程接口则是对象方法和对象属性. 方法是您能够执行的动作(比如添加或修改元素). ...

  4. 图片转tfrecords

    import numpy as np import tensorflow as tf import time import os import cv2 from sklearn.utils impor ...

  5. zsh & for loop bug

    zsh & for loop bug ​for: command not found syntax error near unexpected token do' do' Unicode 编码 ...

  6. SwiftUI & Compose View

    SwiftUI & Compose View OK // // ContentView.swift // Landmarks // // Created by 夏凌晨 on 2020/10/2 ...

  7. 如何用 js 实现一个 apply 函数

    如何用 js 实现一个 apply 函数 原理 实现方式 总结 refs https://developer.mozilla.org/en-US/docs/Web/JavaScript/Referen ...

  8. Python 2 to Python 3 convert

    Python 2 to Python 3 convert 2to3, 自动将 Python 2 代码转为 Python 3 代码 https://docs.python.org/zh-cn/2/lib ...

  9. how to make one your own promise version Ajax

    how to make one your own promise version Ajax XMLHttpRequest https://developer.mozilla.org/en-US/doc ...

  10. V8 & ECMAScript & ES-Next

    V8 & ECMAScript & ES-Next ES6, ES7, ES8, ES9, ES10, ES11, ES2015, ES2016, ES2017, ES2018, ES ...