首页 > 其他分享 >hdu: 张煊的金箍棒(3)(树状数组的区间修改,区间查询)

hdu: 张煊的金箍棒(3)(树状数组的区间修改,区间查询)

时间:2023-01-05 18:22:21浏览次数:70  
标签:hdu memset 张煊 金箍棒 int 区间 c2 sizeof

Problem Description
张煊的金箍棒升级了!

升级后的金箍棒是由N段相同长度的金属棒连接而成(最开始每段金属棒的价值都是1,从1到N编号);

张煊作为金箍棒的主人,可以对金箍棒任意一段施展魔法操作,每次操作就是将一段连续的金属棒(从X到Y编号)每一段都增加价值Z(Z为1,2,3三种)。

现在,张煊想知道执行M次操作后某一段金箍棒总值。

有Q次查询,每次询问一段(A到B)金箍棒的价值和。

Input
输入的第一行是测试数据的组数(不超过10个)。

对于每组测试数据,第一行包含一个整数N(1 <= N <= 100000),表示金箍棒有N节组成,第二行包含两个整数M(0 <= M <= 100,000)和 Q(1 <= Q <= 100),分别表示执行M次魔法操作,有Q次查询。

接下来的M行,每行包含三个整数X,Y,Z(1 <= X <= Y <= N,1 <= Z <= 3),它定义了一个操作:将从X到Y编号的金属棒每一段的价值增加Z,其中 Z = 1或者 Z = 2 或者 Z = 3。

接下来的Q行,每行包含二个整数A和B(1 <= A <= B <= N),表示查询从A到B这一段金箍棒的价值总和。

Output
对于每组测试数据,请输出Q行,每行一个数字,表示一次查询的结果。

 

输入样例

1
10
2 2
1 5 2
5 9 3
1 4
3 6
 

输出样例

12
16
附ac代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
typedef long long ll;
int d[N],c[N];
ll s[N],c2[N];
int lowbit(int i)
{
    return i&-i;
}
void build(int i)
{
    for(int j=0;j<lowbit(i);++j)
    {
        c[i]+=d[i-j];
        c2[i]+=d[i-j]*(i-j);
    }
}
ll sum(int i)
{
    ll ans=0;
    ll p=i;
    while(i>0)
    {
        ans+=(p+1)*c[i]-c2[i];
        i-=lowbit(i);
    }
    return ans;
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        memset(d,0,sizeof(d));
        d[1]=1;
        memset(c,0,sizeof(c));
        memset(c2,0,sizeof(c2));
        memset(s,0,sizeof(s));
        int n,m,q;
        cin>>n>>m>>q;
        int x,y,z;
        while(m--)
        {
            scanf("%d%d%d",&x,&y,&z);
            d[x]+=z;d[y+1]-=z;
        }
        for(int i=1;i<=n;++i)
        build(i);
        while(q--)
        {
            scanf("%d%d",&x,&y);
            if(!s[x-1]) s[x-1]=sum(x-1);
            if(!s[y]) s[y]=sum(y);
            cout<<s[y]-s[x-1]<<endl;
        }
    }
}

 

 

标签:hdu,memset,张煊,金箍棒,int,区间,c2,sizeof
From: https://www.cnblogs.com/ruoye123456/p/17028566.html

相关文章

  • 区间合并
    双指针区间合并离散化双指针通俗理解前缀和听起来好高级啊,那么他究竟是什么啊?双指针是通过某些方式优化复杂度,从而实现。接下来看几道栗子吧双指针给定一个长......
  • AcWing算法提高课:区间DP
    AcWing算法提高课:区间DP两种实现方式循环式一般对于一维的DP问题可以应用。for(len=1;len<=n;len++)for(l=1;l+len-1<=n;l++)r=l+len......
  • 在一个区间加减相同值
    2041.干草堆-AcWing题库#include<bits/stdc++.h>usingnamespacestd;#defineendl"\n"#pragmaGCCoptimize(3)intarr[1000010];intmain(){ios::sy......
  • 「AcWing学习记录」区间问题
    AcWing905.区间选点原题链接给定N个闭区间[ai,bi],请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点。输出选择的点的最小数量。位于区间端点上的点......
  • 双指针+位运算+离散化+区间合并
    双指针+位运算+离散化+区间合并双指针算法可以是两个指针分别指向两个序列,也可以是两个指针指向一个序列,维护一段区间核心思想:将\(O(n^2)\)优化到\(O(n)\)本质上就......
  • hdu:sort it(逆序对,离散化)
    ProblemDescription给定n(n<=100000)个正整数,希望对其从小到大排序,如果采用冒泡排序算法,请计算需要进行的交换次数。Input输入包含多组测试用例,每组用例由两行组成:第一行......
  • 2022.01.03 区间建仓352法
    区间建仓352法又称菱形建仓法提前做好规划以东财为例,个股占总仓位数不能超10%总仓位25万的话,东财应该最多2.5万,对应到19.27的股价,接近于1300股=10%1.352建仓法购......
  • P6792 [SNOI2020] 区间和
    对于修改,看上去要用SegmentTreeBeats维护。查询根据经典套路,维护每个结点的最大前缀和最大后缀。我们知道SegmentTreeBeats的思想是仅处理仅会修改最小值的区间,......
  • 区间dp
    A题目链接核心思路:这很明显是一道区间dp板子题集合定义:\(f[i][j]表示的是将序列的第i个数合并到第j个数\)全部合并所能得到的最大值。集合划分:和石子合并的区间划分是......
  • 浅谈区间MEX问题
    区间MEX问题MEX是什么​ MEX:指一个序列中最小没有出现过的自然数。​ 例如\(mex\left\{1,2,0,3\right\}=4\),\(mex\left\{5,1,2,3\right\}=0\),\(mex\left\{0......