Transformation( HDU - 4578 ,多重懒惰标记线段树 + 思维)

Transformation HDU - 4578 多重懒标记 || 简洁暴力做法 一、内容 Yuanfang is puzzled with the question below: There are n integers, a 1, a 2, …, a n. The initial values of them are 0. There are four kinds of operations. Operation 1: Add c to each number betwe... 阅读详情

一.题目链接:

HDU-4578

二.题目大意:

n 个数 a[1 ~ n].

现有 m 次 4 种操作.

1 l r c:a[l ~ r] 都 + c

2 l r c:a[l ~ r] 都 × c

3 l r c:a[l ~ r] 都变为 c

4 l r p:查询 \sum_{i = l}^{r}a[i]^{p} (p = {1, 2, 3})

三.分析:

(a+c)^{3}=a^3+3a^2c+3c^2a+c^3

(a+c)^2=a^2+2ac+c^2

a+c=a+c

由上述公式便可得每次更新后的 [1, 3] 次幂的和.

之后可以设置 3 个懒惰标记 add,mul,rep

或者只设置 2 个 add,mul(rep 可由 add = c,mul = 0实现)

四.代码实现:

3 个懒惰标记:

#include <set>
#include <map>
#include <ctime>
#include <queue>
#include <cmath>
#include <stack>
#include <vector>
#include <cstdio>
#include <sstream>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define eps 1e-6
#define pi acos(-1.0)
#define ll long long int
using namespace std;

const int M = (int)1e5;
const int mod = 10007;

struct node
{
    int l;
    int r;
    ll add;
    ll mul;
    ll rep;
    ll p[4];
}tree[M * 4 + 5];

ll ans;

void build(int k, int l, int r)
{
    tree[k].l = l;
    tree[k].r = r;
    tree[k].add = 0;
    tree[k].mul = 1;
    tree[k].rep = 0;
    tree[k].p[3] = tree[k].p[2] = tree[k].p[1] = 0;
    if(l == r)
        return;
    int mid = (l + r) / 2;
    build(k * 2, l, mid);
    build(k * 2 + 1, mid + 1, r);
}

void push(int k)
{
    if(tree[k].rep)
    {
        tree[k * 2].rep = tree[k * 2 + 1].rep = tree[k].rep;
        tree[k * 2].mul = tree[k * 2 + 1].mul = 0;
        tree[k * 2].add = tree[k * 2 + 1].add = tree[k].rep;

        tree[k * 2].p[3] = tree[k].rep * tree[k].rep * tree[k].rep % mod * (tree[k * 2].r - tree[k * 2].l + 1) % mod;
        tree[k * 2].p[2] = tree[k].rep * tree[k].rep % mod * (tree[k * 2].r - tree[k * 2].l + 1) % mod;
        tree[k * 2].p[1] = tree[k].rep % mod * (tree[k * 2].r - tree[k * 2].l + 1) % mod;

        tree[k * 2 + 1].p[3] = tree[k].rep * tree[k].rep * tree[k].rep % mod * (tree[k * 2 + 1].r - tree[k * 2 + 1].l + 1) % mod;
        tree[k * 2 + 1].p[2] = tree[k].rep * tree[k].rep % mod * (tree[k * 2 + 1].r - tree[k * 2 + 1].l + 1) % mod;
        tree[k * 2 + 1].p[1] = tree[k].rep % mod * (tree[k * 2 + 1].r - tree[k * 2 + 1].l + 1) % mod;

        tree[k].rep = 0;
    }
    if(tree[k].mul != 1)
    {
        tree[k * 2].add = tree[k * 2].add * tree[k].mul % mod;
        tree[k * 2 + 1].add = tree[k * 2 + 1].add * tree[k].mul % mod;

        tree[k * 2].mul = tree[k * 2].mul * tree[k].mul % mod;
        tree[k * 2 + 1].mul = tree[k * 2 + 1].mul * tree[k].mul % mod;

        tree[k * 2].p[3] = tree[k * 2].p[3] * tree[k].mul % mod * tree[k].mul % mod * tree[k].mul % mod;
        tree[k * 2].p[2] = tree[k * 2].p[2] * tree[k].mul % mod * tree[k].mul % mod;
        tree[k * 2].p[1] = tree[k * 2].p[1] * tree[k].mul % mod;

        tree[k * 2 + 1].p[3] = tree[k * 2 + 1].p[3] * tree[k].mul % mod * tree[k].mul % mod * tree[k].mul % mod;
        tree[k * 2 + 1].p[2] = tree[k * 2 + 1].p[2] * tree[k].mul % mod * tree[k].mul % mod;
        tree[k * 2 + 1].p[1] = tree[k * 2 + 1].p[1] * tree[k].mul % mod;

        tree[k].mul = 1;
    }
    if(tree[k].add)
    {
        tree[k * 2].add = (tree[k * 2].add + tree[k].add) % mod;
        tree[k * 2 + 1].add = (tree[k * 2 + 1].add + tree[k].add) % mod;

        tree[k * 2].p[3] = (tree[k * 2].p[3] + 3 * tree[k].add * tree[k * 2].p[2] % mod + 3 * tree[k].add * tree[k].add % mod * tree[k * 2].p[1] % mod + tree[k].add * tree[k].add * tree[k].add % mod * (tree[k * 2].r - tree[k * 2].l + 1) % mod) % mod;
        tree[k * 2].p[2] = (tree[k * 2].p[2] + 2 * tree[k].add * tree[k * 2].p[1] + tree[k].add * tree[k].add % mod * (tree[k * 2].r - tree[k * 2].l + 1) % mod) % mod;
        tree[k * 2].p[1] = (tree[k * 2].p[1] + tree[k].add * (tree[k * 2].r - tree[k * 2].l + 1) % mod) % mod;

        tree[k * 2 + 1].p[3] = (tree[k * 2 + 1].p[3] + 3 * tree[k].add * tree[k * 2 + 1].p[2] % mod + 3 * tree[k].add * tree[k].add % mod * tree[k * 2 + 1].p[1] % mod + tree[k].add * tree[k].add * tree[k].add % mod * (tree[k * 2 + 1].r - tree[k * 2 + 1].l + 1) % mod) % mod;
        tree[k * 2 + 1].p[2] = (tree[k * 2 + 1].p[2] + 2 * tree[k].add * tree[k * 2 + 1].p[1] + tree[k].add * tree[k].add % mod * (tree[k * 2 + 1].r - tree[k * 2 + 1].l + 1) % mod) % mod;
        tree[k * 2 + 1].p[1] = (tree[k * 2 + 1].p[1] + tree[k].add * (tree[k * 2 + 1].r - tree[k * 2 + 1].l + 1) % mod) % mod;

        tree[k].add = 0;
    }
}

void interver(int k, int l, int r, int a, int b, ll c, int dir)
{
    if(l >= a && r <= b)
    {
        if(dir == 1)
        {
            tree[k].add = (tree[k].add + c) % mod;
            tree[k].p[3] = (tree[k].p[3] + 3 * c * tree[k].p[2] % mod + 3 * c * c % mod * tree[k].p[1] % mod + c * c * c % mod * (tree[k].r - tree[k].l + 1) % mod) % mod;
            tree[k].p[2] = (tree[k].p[2] + 2 * c % mod * tree[k].p[1] % mod + c * c % mod * (tree[k].r - tree[k].l + 1) % mod) % mod;
            tree[k].p[1] = (tree[k].p[1] + c * (tree[k].r - tree[k].l + 1) % mod) % mod;
            return;
        }
        else if(dir == 2)
        {
            tree[k].add = tree[k].add * c % mod;
            tree[k].mul = tree[k].mul * c % mod;
            tree[k].p[3] = tree[k].p[3] * c % mod * c % mod * c % mod;
            tree[k].p[2] = tree[k].p[2] * c % mod * c % mod;
            tree[k].p[1] = tree[k].p[1] * c % mod;
            return;
        }
        else if(dir == 3)
        {
            tree[k].add = 0;
            tree[k].mul = 1;
            tree[k].rep = c;
            tree[k].p[3] = c * c * c % mod * (tree[k].r - tree[k].l + 1) % mod;
            tree[k].p[2] = c * c % mod * (tree[k].r - tree[k].l + 1) % mod;
            tree[k].p[1] = c * (tree[k].r - tree[k].l + 1) % mod;
            return;
        }
    }
    push(k);
    int mid = (l + r) / 2;
    if(a <= mid)
        interver(k * 2, l, mid, a, b, c, dir);
    if(mid < b)
        interver(k * 2 + 1, mid + 1, r, a, b, c, dir);
    tree[k].p[3] = (tree[k * 2].p[3] + tree[k * 2 + 1].p[3]) % mod;
    tree[k].p[2] = (tree[k * 2].p[2] + tree[k * 2 + 1].p[2]) % mod;
    tree[k].p[1] = (tree[k * 2].p[1] + tree[k * 2 + 1].p[1]) % mod;
}

void query(int k, int l, int r, int a, int b, ll c)
{
    if(l >= a && r <= b)
    {
        ans = (ans + tree[k].p[c]) % mod;
        return;
    }
    push(k);
    int mid = (l + r) / 2;
    if(a <= mid)
        query(k * 2, l, mid, a, b, c);
    if(mid < b)
        query(k * 2 + 1, mid + 1, r, a, b, c);
    tree[k].p[3] = (tree[k * 2].p[3] + tree[k * 2 + 1].p[3]) % mod;
    tree[k].p[2] = (tree[k * 2].p[2] + tree[k * 2 + 1].p[2]) % mod;
    tree[k].p[1] = (tree[k * 2].p[1] + tree[k * 2 + 1].p[1]) % mod;
}

int main()
{
    int n, m;
    while(~scanf("%d %d", &n, &m))
    {
        if(n + m == 0)
            break;
        build(1, 1, n);
        while((m--) > 0)
        {
            int dir, l, r;
            ll c;
            scanf("%d %d %d %lld", &dir, &l, &r, &c);
            if(dir <= 3)
                interver(1, 1, n, l, r, c, dir);
            else
            {
                ans = 0;
                query(1, 1, n, l, r, c);
                printf("%lld\n", ans);
            }
        }
    }
    return 0;
}

2 个懒惰标记:

#include <set>
#include <map>
#include <ctime>
#include <queue>
#include <cmath>
#include <stack>
#include <vector>
#include <cstdio>
#include <sstream>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define eps 1e-6
#define pi acos(-1.0)
#define ll long long int
using namespace std;

const int M = (int)1e5;
const int mod = 10007;

struct node
{
    int l;
    int r;
    ll p[4];
    ll mul;
    ll add;
}tree[M * 4 + 5];

ll ans;

void build(int k, int l, int r)
{
    tree[k].l = l;
    tree[k].r = r;
    tree[k].mul = 1;
    tree[k].add = 0;
    tree[k].p[1] = tree[k].p[2] = tree[k].p[3] = 0;
    if(l == r)
        return;
    int mid = (l + r) / 2;
    build(k * 2, l, mid);
    build(k * 2 + 1, mid + 1, r);
}

void push(int k)
{
    tree[k * 2].mul = tree[k * 2].mul * tree[k].mul % mod;
    tree[k * 2 + 1].mul = tree[k * 2 + 1].mul * tree[k].mul % mod;

    tree[k * 2].p[3] = tree[k].mul * tree[k].mul * tree[k].mul % mod * tree[k * 2].p[3] % mod;
    tree[k * 2].p[2] = tree[k].mul * tree[k].mul % mod * tree[k * 2].p[2] % mod;
    tree[k * 2].p[1] = tree[k].mul * tree[k * 2].p[1] % mod;

    tree[k * 2 + 1].p[3] = tree[k].mul * tree[k].mul * tree[k].mul % mod * tree[k * 2 + 1].p[3] % mod;
    tree[k * 2 + 1].p[2] = tree[k].mul * tree[k].mul % mod * tree[k * 2 + 1].p[2] % mod;
    tree[k * 2 + 1].p[1] = tree[k].mul * tree[k * 2 + 1].p[1] % mod;

    tree[k * 2].add = (tree[k * 2].add * tree[k].mul % mod + tree[k].add) % mod;
    tree[k * 2 + 1].add = (tree[k * 2 + 1].add * tree[k].mul % mod + tree[k].add) % mod;

    tree[2 * k].p[3] = (tree[2 * k].p[3] + 3 * tree[k].add * tree[2 * k].p[2] % mod + 3 * tree[k].add % mod * tree[k].add % mod * tree[2 * k].p[1] % mod + (tree[2 * k].r - tree[2 * k].l + 1) % mod * tree[k].add % mod * tree[k].add % mod * tree[k].add % mod) % mod;
    tree[2 * k].p[2] = (tree[2 * k].p[2] + 2 * tree[k].add % mod * tree[2 * k].p[1] % mod + (tree[2 * k].r - tree[2 * k].l + 1) % mod * tree[k].add % mod * tree[k].add % mod) % mod;
    tree[2 * k].p[1] = (tree[2 * k].p[1] + (tree[2 * k].r - tree[2 * k].l + 1) % mod * tree[k].add % mod) % mod;

    tree[k * 2 + 1].p[3] = (tree[k * 2 + 1].p[3] + 3 * tree[k].add * tree[k * 2 + 1].p[2] % mod + 3 * tree[k].add % mod * tree[k].add % mod * tree[k * 2 + 1].p[1] % mod + (tree[k * 2 + 1].r - tree[k * 2 + 1].l + 1) % mod * tree[k].add % mod * tree[k].add % mod * tree[k].add % mod) % mod;
    tree[k * 2 + 1].p[2] = (tree[k * 2 + 1].p[2] + 2 * tree[k].add % mod * tree[k * 2 + 1].p[1] % mod + (tree[k * 2 + 1].r - tree[k * 2 + 1].l + 1) % mod * tree[k].add % mod * tree[k].add % mod) % mod;
    tree[k * 2 + 1].p[1] = (tree[k * 2 + 1].p[1] + (tree[k * 2 + 1].r - tree[k * 2 + 1].l + 1) % mod * tree[k].add % mod) % mod;

    tree[k].add = 0;
    tree[k].mul = 1;
}

void interver(int k, int l, int r, int a, int b, ll c, int dir)
{
    if(l >= a && r <= b)
    {
        if(dir == 1)
        {
            tree[k].add = (tree[k].add + c) % mod;
            tree[k].p[3] = (tree[k].p[3] + 3 * c * tree[k].p[2] % mod + 3 * c % mod * c % mod * tree[k].p[1] % mod + (tree[k].r - tree[k].l + 1) % mod * c % mod * c % mod * c % mod) % mod;
            tree[k].p[2] = (tree[k].p[2] + 2 * c % mod * tree[k].p[1] % mod + (tree[k].r - tree[k].l + 1) % mod * c % mod * c % mod) % mod;
            tree[k].p[1] = (tree[k].p[1] + (tree[k].r - tree[k].l + 1) % mod * c % mod) % mod;
            return;
        }
        else if(dir == 2)
        {
            tree[k].add = tree[k].add * c % mod;
            tree[k].mul = tree[k].mul * c % mod;
            tree[k].p[3] = c * c * c % mod * tree[k].p[3] % mod;
            tree[k].p[2] = c * c % mod * tree[k].p[2] % mod;
            tree[k].p[1] = c * tree[k].p[1] % mod;
            return;
        }
        else if(dir == 3)
        {
            tree[k].add = c;
            tree[k].mul = 0;
            tree[k].p[3] = c * c * c % mod * (tree[k].r - tree[k].l + 1) % mod;
            tree[k].p[2] = c * c % mod * (tree[k].r - tree[k].l + 1) % mod;
            tree[k].p[1] = c * (tree[k].r - tree[k].l + 1) % mod;
            return;
        }
    }
    push(k);
    int mid = (l + r) / 2;
    if(a <= mid)
        interver(k * 2, l, mid, a, b, c, dir);
    if(mid < b)
        interver(k * 2 + 1, mid + 1, r, a, b, c, dir);
    tree[k].p[3] = (tree[k * 2].p[3] + tree[k * 2 + 1].p[3]) % mod;
    tree[k].p[2] = (tree[k * 2].p[2] + tree[k * 2 + 1].p[2]) % mod;
    tree[k].p[1] = (tree[k * 2].p[1] + tree[k * 2 + 1].p[1]) % mod;
}

void query(int k, int l, int r, int a, int b, int c)
{
    if(l >= a && r <= b)
    {
        ans = (ans + tree[k].p[c]) % mod;
        return;
    }
    push(k);
    int mid = (l + r) / 2;
    if(a <= mid)
        query(k * 2, l, mid, a, b, c);
    if(mid < b)
        query(k * 2 + 1, mid + 1, r, a, b, c);
    tree[k].p[3] = (tree[k * 2].p[3] + tree[k * 2 + 1].p[3]) % mod;
    tree[k].p[2] = (tree[k * 2].p[2] + tree[k * 2 + 1].p[2]) % mod;
    tree[k].p[1] = (tree[k * 2].p[1] + tree[k * 2 + 1].p[1]) % mod;
}

int main()
{
    int n, m;
    while(~scanf("%d %d", &n, &m))
    {
        if(n + m == 0)
            break;
        build(1, 1, n);
        while((m--) > 0)
        {
            int dir, x, y;
            ll c;
            scanf("%d %d %d %lld", &dir, &x, &y, &c);
            if(dir <= 3)
                interver(1, 1, n, x, y, c, dir);
            else if(dir == 4)
            {
                ans = 0;
                query(1, 1, n, x, y, c);
                printf("%lld\n", ans);
            }
        }
    }
    return 0;
}

 

HDU 4578 Transformation(线段树+做了4天的神题+详解) Yuanfang is puzzled with the question below: There are n integers, a 1, a 2, …, a n. The initial values of them are 0. There are four kinds of operations. Operation 1: Add c to each number between a x and a y inclusive. In other words, do transformation 阅读详情

相关推荐

Qt6导入QtChart绘制图表(添加组件)

我在按照大佬们的说明添加QtChart时发现,我的电脑上并不能正确的添加QtChart并编译通过,所以在综合了两位大佬的说明又自己探索了一番后,正确编译通过,分享出来,以便同志们节省一些时间。

Nuaa0719301zyx的博客 2950

HDU4578——Transformation(线段树)

又是一道很裸的线段树,一个数列a1, a2, …, an,然后4种操作: 1,x,y,c:将ax到ay之间的数都加c 2,x,y,c:将ax到ay之间的数都乘以c 3,x,y,c:将ax到ay之间的数变成c 4,x,y,p:求出ax到ay之间数字的p次幂的和,p=1,2,3,结果对10007取模 首先肯定要先保存3个次幂的和,然后对于每个结点用a和b作标记,f表示需要pushdown

hongrock的专栏 938

Bode图、ABCD矩阵与EET结合:三步搞定复杂电路传递函数分析

在模拟电路与电源控制设计中,传递函数和频率响应是衡量系统稳定性的核心指标。Bode图以直观的幅频/相频曲线揭示带宽与相位裕度,ABCD二端口矩阵可将级联网络结构化表达,而EET额外元素定理则针对寄生电容、负载效应等局部修正提供显式公式。三者互补,组合成一套从整体拓扑到局部寄生修正的完整分析方法:先用ABCD搭建主体网络,再用EET快速加入额外元件,最后用Bode图验证传递函数和稳定裕度。该方法适用于滤波器设计、电源环路补偿、运放稳定性分析等线性小信号场景,支持Python/SciPy和SPICE交叉验证,显

weixin_32496547的博客 362

HDU-4578-Transformation

这个题感觉好麻烦,可能是以前没有做过类似复杂的

z309241990的专栏 1002

(保姆式教程:从下数据到画图)python如何利用EOF分析SSTA海温异常现象并画图

保姆式教程,教你如何利用python分析1979-2004年的太平洋地区的海温异常SSTA,并且绘制出空间模态和时间序列的图片。

shayuxing的博客 2万+

新手必看:如何用T265和ROS实现无人机室内精准定位(附PX4参数配置)

本文详细介绍了如何使用Intel Realsense T265和ROS实现无人机室内精准定位,包括硬件准备、ROS数据流架构设计、PX4参数配置及系统验证。特别针对视觉SLAM技术在室内环境中的应用,提供了从零搭建到进阶优化的全流程解析,适合无人机开发新手快速上手。

weixin_30642561的博客 404

hdu 4578 Transformation(线段树+多种操作)

TransformationProblem DescriptionYuanfang is puzzled with the question below: There are n integers, a1, a2, …, an. The initial values of them are 0. There are four kinds of operations. Operation 1:

Darkarts 686

项目篇:移动平台机械臂视觉定位抓取实施(基于ROS架构)

ROS包内容: 这篇日志的目的是快速项目实施,所以详细的部分会不断补充。 1、相机采集包(创建抓取图像服务,单张) Realsense Camera(微软深度摄像头,官方提供ros包) Pylon Camera(basler相机,官方提供ros包) 2、定位算法包(抓取图像,定位标志物) Aruco_ros (二维码定位,官方提供ros包) Apriltag (二维码定位,官方提供ros包)...

南北粉面馆 6047

[HDU - 4578]Transformation(线段树+多重懒标记)

[HDU - 4578]Transformation(线段树+多重懒标记)

Turing_Sheep的博客 667

SAP 集成泛微 OA Open API 新建流程申请接口

《SAP ERP 与泛微 OA 的系统集成》系列文章。泛微 Open API 是基于 HTTPS 的 Restful 接口,上篇文章,我已经完成了调用业务接口之前的准备工作,这篇文章我以新建流程申请这个系统集成最重要的接口为例,讲解接口设计、泛微 API 调用的过程、遇到的问题、解决的办法。

SAP李斌,本人承诺所有原创文章均不使用任何AI生成技术,请大家放心阅读。 3555

17 指挥AI写Mamba相关模型代码,快速适配大模型场景

本文为《30天掌控AI编程:从指令到落地,手把手教你指挥AI写代码》系列第十七篇,属于第三阶段多场景实战核心内容。本篇聚焦当下大模型领域热门的**Mamba架构**,针对零基础大模型开发、无深度学习基础的使用者,拆解指挥AI生成Mamba基础模型、微调适配、推理部署代码的核心方法,覆盖Mamba基础模块搭建、简易序列建模、小样本微调、本地推理等高频场景,提供可直接复用的高质量指令模板、完整可运行代码、环境配置与避坑指南,无需精通Transformer、状态空间模型等底层原理,轻松上手Mamba大模型开发。

coreopt的博客 61

HDU - 4578 Transformation(线段树)

异常变态的正常线段树。给你三种操作,三种输出方式: 1.让l~r区间的所有值加c; 2.让l~r区间的所有值乘c; 3.让l~r区间的所有值变成c; 4.让l~r区间的所有值都先求p(1~3)次方,然后求和输出。 别人都是一看题懵逼好简单操作好复杂,我就比较优秀,一看题就懵逼感觉很难不知道怎么做,我对不起这几天努力学的线段树,对不起。其实我考虑到分三种lazy数组,三种ans数组(正常大...

qq_38367681的博客 1016

302.QoS实现工具之MQC

QoS 技术可以对网络中报文进行分类处理,根据优先级提供不同的差分服务,如何实现这种差分服务呢?我们有一种强大的配置方法 - 模块化 QoS 命令行 MQC(Modular QoS Command-Line)。下面就来介绍一下 MQC。

迷逝 1391

HDU-4578-Transformation(线段树多个标记的冲突)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4578 题目大意:给你一个n个元素的数组,4种操作,1:区间+k。2:区间*c 。3:区间修改 4:计算区间p次方和 思路:三个标记,Add,Mul,U。先加后乘:Add标记同时*c,先乘后加:直接+add即可。区间修改,相当于覆盖,更新Add和Mul,刷新U标记。处理好这三个标记之间的关系就可以了...

永远鲜红の幼月的博客 303

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

hdu4578 Transformation【线段树】

Yuanfang is puzzled with the question below:  There are n integers, a 1, a 2, …, a n. The initial values of them are 0. There are four kinds of operations.  Operation 1: Add c to each number between a...

wybooooooooo的博客 483

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

落谷 P3373 - 线段树多重标记入门

题目链接:点击这里   解题思路: 以前做区间修改都是一种标记,可以直接标记.而现在这题既有乘法更新又有加法更新,如果再按以前的思想循序更新就肯定会出错. 所以在多重标记的情况下我们可以给它们制定一个优先级的规则,假设每次的更新都是乘法优先于加法.那么更新操作要怎么改变呢? 设add[]为加法懒惰标记,mul[]为乘法懒惰标记. 对区间rt进行加x操作:直接add[rt] += x ...

过路人丶的博客 430

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

HDU - 4578 Transformation 线段树 思维

题目链接: HDU - 4578 Transformation 题意:给你一个数组,初始值为零,有四种操作 (1)"1 x y c",代表 把区间 [x,y] 上的值全部加c (2)"2 x y c",代表 把区间 [x,y] 上的值全部乘以c (3)"3 x y c" 代表 把区间 [x,y]上的值全部赋值为c (4)"4 x y p" 代表 输出区间 [x,y] 上值的p次方和1&...

没有梦想何以远行 243

线段树延迟标记精讲

一 概述 线段树,类似区间树,是一个完全二叉树,它在各个节点保存一条线段(数组中的一段子数组),主要用于高效解决连续区间的动态查询问题,由于二叉结构的特性,它基本能保持每个操作的复杂度为O(logn)。 线段树的每个节点表示一个区间,子节点则分别表示父节点的左右半区间,例如父亲的区间是[a,b],那么(c=(a+b)/2)左儿子的区间是[a,c],右儿子的区间是[c+1,b]。

哆啦AC梦的专栏 1215

Transformation HDU - 4578(线段树多种操作)

三个数组分别是lazadd lazmul lazc 记录加数,乘数,和设定的数,lazc1 表示一次方之和lazc2 lazc3 以此类推,其中最要注意的就是乘操作和加操作顺序不同答案是不同的,所以假如设定乘法为先,那么下推函数就要把乘法标记下推放在加法前面,而且更新函数里面,如果在更新乘法的时候碰到此处标记有加法标记存在,先把加数乘了,在更新子树,就可以保证既是顺序不一样答案是一样的,就...

仰望蓝天的博客 331

HDU - 4578 Transformation

HDU - 4578 Transformation 题 意:给你n个数字,开始都是0,m次操作,1 x y p:区间[x,y]每个数都加上p。2 x y c :区间[x,y]全部都乘p,3 x y c.将区间[x,y]的值全部都设为c。4 x y p,查询[x,y]所有值的p次方和。 数据范围: 1&lt;=n,m&lt;=1e5 1&lt;=c&lt;=1e4 x,y&lt;=n ...

子灬丶逾 377

HDU 4578 Transformation

深夜鞭尸,写了一个简单又非常麻烦的线段树。

ccutyear的博客 731

hdu 4578 Transformation

题意:给你一个数组,初始值为零,有四种操作 (1)"1 x y c",代表 把区间 [x,y] 上的值全部加c (2)"2 x y c",代表 把区间 [x,y] 上的值全部乘以c (3)"3 x y c" 代表 把区间 [x,y]上的值全部赋值为c (4)"4 x y p" 代表 求区间 [x,y] 上值的p次方和1 因为P只有1到3,(x+c)^2=(x^2)+(2*x*c+c^2)

3157

【区间更新+多种操作】K - Transformation HDU - 4578

K - Transformation HDU - 4578 Yuanfang is puzzled with the question below:  There are n integers, a 1, a 2, …, a n. The initial values of them are 0. There are four kinds of operations.  Operation 1:...

qq_41037114的博客 507

hdu-4578-Transformation-线段树

当一道题目,使用__int64超时,使用int就能A的时候,我想,这个题,不是一个好题。。。。。 add[i]:记录加的lazy标记 mul[i]:记录乘的lazy标记 num[i]:记录数的lazy标记 sum[i][j]:第i段,j次方的和。 除去lazy标记的下放,这完全就是一道水的线段树的题目。。。 lazy标记如何下放呢? 1,首先查看num标记,如果存在,果断下放。 2

青竹梦 1524

HDU4578-Transformation

Transformation                                                                         Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 65535/65536 K (Java/Others)

wang_128的博客 1332

Transformation HDU - 4578

点击打开链接 维护一次幂二次幂三次幂的三个区间和 再维护乘法加法赋值的三个lazy标记 几个幂次和之间是有公式的 如图 而lazy标记的使用也需要技巧 首先赋值的优先级最高 只要赋值操作 其他两种操作直接舍弃 而加法和乘法虽然优先级一样 但是乘法操作不止影响乘法lazy 也影响加法lazy 具体见代码   #include &lt;bits/stdc++.h&gt; using ...

sunyutian1998的博客 387
上一篇: Yet Another Data Structure Problem (ZOJ - 3998,双懒惰标记线段树)
下一篇: Vases and Flowers (HDU - 4614,线段树 + 二分 + 思维)
The___Flash
博客等级 码龄8年 79粉丝 223原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值