优美的大乔 2023-12-16 23:55 采纳率: 94.7%
浏览 2
已结题

关于线段树模板的问题,请各位专家解答!

luoguP3372

自学线段树,炸了,样例没过:

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ULL unsigned long long
#define INT __int128
#define tbl ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int n,m,a[100010],tree[400010],mark[400010];
void new_tree(int left,int right,int x){
    if(left==right){
        tree[x]=a[left];
        return ;
    }
    int mid=(left+right)>>1;
    new_tree(left,mid,x*2);
    new_tree(mid+1,right,x*2+1);
    tree[x]=tree[x*2]+tree[x*2+1];
}
void insert_interval(int left_now,int right_now,int left_target,int right_target,int x,int s){
    if(left_now>right_target||right_now<left_target)return ;
    if(left_now>=left_target&&right_now<=right_target){
        tree[x]=(right_now-left_now+1)*s;
        if(left_now<right_now)mark[x]+=s;
    }
    else{
        int mid=(left_now+right_now)>>1;
        mark[x*2]+=mark[x];
        mark[x*2+1]+=mark[x];
        tree[x*2]+=mark[x]*(mid-left_now+1);
        tree[x*2+1]+=mark[x]*(right_now-mid);
        mark[x]=0;
        insert_interval(left_now,mid,left_target,right_target,x*2,s);
        insert_interval(mid+1,right_now,left_target,right_target,x*2+1,s);
        tree[x]=tree[x*2]+tree[x*2+1];
    }
    return ;
}
int query_interval(int left_now,int right_now,int left_target,int right_target,int x){
    if(left_now>right_target||right_now<left_target)return 0;
    if(left_now>=left_target&&right_now<=right_target)return tree[x];
    else{
//    cout<<tree[x]<<endl;
        int mid=(left_now+right_now)>>1;
        mark[x*2]+=mark[x];
        mark[x*2+1]+=mark[x];
        tree[x*2]+=mark[x]*(mid-left_now+1);
        tree[x*2+1]+=mark[x]*(right_now-mid);
        mark[x]=0;
        return query_interval(left_now,mid,left_target,right_target,x*2)+query_interval(mid+1,right_now,left_target,right_target,x*2+1);
    }
}
signed main()
{
//  tbl;
  cin>>n>>m;
  for(int i=1;i<=n;i++)cin>>a[i];
  new_tree(1,n,1);
  for(int i=1;i<=m;i++){
      int q;
      cin>>q;
      if(q==1){
          int x,y,k;
          cin>>x>>y>>k;
          insert_interval(1,n,x,y,1,k);
        }
        else{
            int x,y;
            cin>>x>>y;
            cout<<query_interval(1,n,x,y,1)<<endl;
        }
    }
  return 0;
}
  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 12月24日
    • 创建了问题 12月16日

    悬赏问题

    • ¥15 c++ gmssl sm2验签demo
    • ¥15 关于模的完全剩余系(关键词-数学方法)
    • ¥15 有没有人懂这个博图程序怎么写,还要跟SFB连接,真的不会,求帮助
    • ¥30 模拟电路 logisim
    • ¥15 PVE8.2.7无法成功使用a5000的vGPU,什么原因
    • ¥15 is not in the mmseg::model registry。报错,模型注册表找不到自定义模块。
    • ¥15 安装quartus II18.1时弹出此error,怎么解决?
    • ¥15 keil官网下载psn序列号在哪
    • ¥15 想用adb命令做一个通话软件,播放录音
    • ¥30 Pytorch深度学习服务器跑不通问题解决?