首页 > 其他分享 >AcWing 242. 一个简单的整数问题 / 树状数组区间修改区间查询模板题

AcWing 242. 一个简单的整数问题 / 树状数组区间修改区间查询模板题

时间:2023-04-26 19:22:23浏览次数:50  
标签:di int 求积 trd add 242 区间 trdi AcWing

AcWing 242. 一个简单的整数问题

// 实例化是抽象的天敌,是抽象的克星
// 通过公式 sn = (i 从 1 ~ n 求积) di * (1 + n) - (i 从 1 ~ n 求积) i * di 
// 来计算前缀和, 又 (i 从 1 ~ n 求积) i * di 不能由 (i 从 1 ~ n 求积) di * (1 + n) 推出
// 所以除了维护 d 数组,还需维护 i*di 数组
// 如果是一次修改多次查询可选前缀和来做,时间复杂度 O(n)
// 但这里是多次修改多次查询, 为控制最高时间复杂度不达到 O(n^2)
// 需用树状数组来做, 时间复杂度为 O(n)

#include <iostream>

using namespace std;

const int N = 1e5 + 10;
typedef long long LL;

LL a[N], trd[N], trdi[N];
int n, m;

int lowbit(int x)
{
    return x & -x;
}

void add(LL tr[], int u, LL c)
{
    for (int i = u; i <= n; i += lowbit(i)) tr[i] += c;
}

LL sum(LL tr[], int u)
{
    LL ans = 0;
    for (int i = u; i > 0; i -= lowbit(i)) ans += tr[i];
    return ans;
}

int main()
{
    cin >> n >> m;
    for (int i = 1; i <= n; i ++ ) 
    {
        cin >> a[i];
        add(trd, i, a[i] - a[i - 1]), add(trdi, i, (a[i] - a[i - 1]) * i);
    }

    while (m -- )
    {
        char c;
        
        cin >> c;
        
        if (c == 'Q') 
        {
            int x, y;
            cin >> x >> y;
            // 这里是 (y + 1) *, 不是 (n + 1) *             这里是 x *, 不是 (n + 1) *       
            cout << ((y + 1) * sum(trd, y) - sum(trdi, y)) - (x * sum(trd, x - 1) - sum(trdi, x - 1)) << '\n';
        }else
        {
            int x, y, c;
            cin >> x >> y >> c;
            
            add(trd, x, c), add(trd, y + 1, -c);
            add(trdi, x, c * x), add(trdi, y + 1, -c * (y + 1));
        }
    }

      
    return 0;
}

标签:di,int,求积,trd,add,242,区间,trdi,AcWing
From: https://www.cnblogs.com/bzdydscjgw/p/17357044.html

相关文章

  • 区间dp
    区间dp前情提要先赞后看,必成习惯一、区间dp-常见的也常考的dp1.区间dp是什么?区间动态规划是用dp的状态来表示和一段区间有关的性质,比如说dp[i][j]表示解决区间[i,j]上的子问题的最小代价或最大收益,然后利用区间子问题之间的关系递推求解。2.区间dp怎么写?区间dp常见的有......
  • 区间和的个数
    给你一个整数数组nums以及两个整数lower和upper求数组中,值位于范围[lower,upper](包含lower和upper)之内的区间和的个数一.前缀和+双重循环(超时)classSolution{public:intcountRangeSum(vector<int>&nums,intlower,intupper){intn=nums.s......
  • 贪心(区间选点)
    #include<bits/stdc++.h>usingnamespacestd;constintN=1e5+10;intn;structRange{intl;intr;booloperator<(constRange&w)const{returnr<w.r;}}range[N];intmain(){intn;cin>>n;for(inti=0;i<......
  • 代码随想录算法训练营第六天 | 242.有效的字母异位词 、349. 两个数组的交集 、 202.
    ......
  • 虚拟机热迁移一直处于迁移中的状态-v4-20210308_124243
    虚拟机热迁移一直处于迁移中的状态企业云平台产品中心共享知识库Exportedon03/08/2021TableofContents问题现象:对虚拟机进行热迁移操作,Dashboard和云服务自助平台上一直处于迁移中的状态问题原因:虚拟机存在频繁的数据读写操作,导致虚拟机迁移的速度追不上数据读写的速度,每次迁......
  • HDU - 5649 线段树+区间二分答案 (好题)
    DZYhasasequencea[1…n].Itisapermutationofintegers1∼n.Nowhewantstoperformtwotypesofoperations:0lr:Sorta[l…r]inincreasingorder.1lr:Sorta[l…r]indecreasingorder.Afterdoingalltheoperations,hewilltellyouapositionk,andask......
  • Acwing 3728-城市通电 / 最小生成树,建图,超级源点
    AcWing3728.城市通电做出来就凭之前的一句感悟:把每个动态选择变为与超级源点连的一条边,把这条边加入图里面跑最小生成树就相当于考虑了每个动态选择......
  • AcWing 788 逆序对的数量
    788.逆序对的数量-AcWing题库逆序对,即位置顺序与大小顺序不符的数对,也就是对于一个期望升序的序列Num[],当i<j时,Num[i]>Num[j]这道题要求求出逆序对的个数,显然在归并排序的过程中我们就是在逐步的消除逆序对,所以我们可以在递归的排序过程中求出逆序对的个数已知归并排序是通......
  • 力扣 435. 无重叠区间
    435.无重叠区间给定一个区间的集合 intervals ,其中 intervals[i]=[starti,endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。示例1:输入:intervals=[[1,2],[2,3],[3,4],[1,3]]输出:1解释:移除[1,3]后,剩下的区间没有重叠。示例2:输入:int......
  • 【ACM算法竞赛日常训练】DAY16【奇♂妙拆分】【区区区间间间】【小AA的数列】数学 |
    DAY16共3题:奇♂妙拆分(简单数学)区区区间间间(单调栈)小AA的数列(位运算dp)......