Great Big Storm 2022-07-06 17:48 采纳率: 57.1%
浏览 26
已结题

线段树P3372不需要现成的题解

直接搬运题解的就不用了
输出答案错误
有题解,不用搬运,只是找不出自己的问题

#include<stdio.h>
int a[4000000];
typedef struct node
{
int l,r;
int w;
int mark;
}Tree[4000000];
Tree tree;
void build(int l,int r,int k)//建树 
{
tree[k].mark=0;
tree[k].l=l;
tree[k].r=r;
if(l==r)
{
tree[k].w=a[k];
return;
}
int mid=(l+r)>>1;
build(l,mid,k<<1);
build(mid+1,r,k<<1|1);
tree[k].w=tree[k<<1].w+tree[k<<1|1].w;
}
void pushdown(int k)//下移 
{
    tree[k<<1].mark+=tree[k].mark;
    tree[k<<1|1].mark+=tree[k].mark;
    int mid;
    mid=(tree[k].l+tree[k].r)>>1;
    tree[k<<1].w+=(tree[k].mark)*(mid-tree[k].l+1);
    tree[k<<1|1].w+=(tree[k].mark)*(tree[k].r-mid+1);
    tree[k].mark=0;
}
void modifytheinterval(int n,int x,int y,int k)//区间修改 
{
    if(x>=tree[k].l&&y<=tree[k].r)//全覆盖的情况 
    {
        tree[k].w+=(tree[k].l-tree[k].r+1)*n;
        tree[k].mark+=n;
        return;
    }
    if(tree[k].mark)
    {
    pushdown(k);    
    }
    int mid=(tree[k].l+tree[k].r)>>1;
    if(x<=mid)
    {
    modifytheinterval(n,x,y,k<<1);    
    }
     if(y>=mid)
    {
    modifytheinterval(n,x,y,k<<1|1);
    } 
    tree[k].w=tree[k<<1].w+tree[k<<1|1].w;
 }
int querytheintervalnew(int x,int y,int k)//区间查询 
{  
int res=0;
if(x>=tree[k].l&&y<=tree[k].r)//全覆盖的情况 
    {
        return tree[k].w;
    }
    if(tree[k].mark)
    {
    pushdown(k);    
    }
    int mid=(tree[k].l+tree[k].r)>>1;
    if(x<=mid)
    {
     res+=querytheintervalnew(x,y,k<<1);    
    }
     if(y>=mid)
    {
     res+=querytheintervalnew(x,y,k<<1|1);
    } 
    tree[k].w=tree[k<<1].w+tree[k<<1|1].w;
  return res;
}    
int main()
{
    int m,n;
    scanf("%d %d\n",&n,&m);
    int i;
    for(i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
    }
    for(i=1;i<=n;i++)
    {
        build(1,n,1);
    }
    for(i=1;i<=m;i++)
    {
        int flag;
        scanf("%d",&flag);
        if(flag==1)
        {
            int x,y,k;
            scanf("%d %d %d\n",&x,&y,&k);
            modifytheinterval(k,x,y,1);
        }
        if(flag==2)
        {
            int x,y;
            scanf("%d %d\n",&x,&y);
            printf("%d\n",querytheintervalnew(x,y,1));    
        }
    }
    return 0;
}


  • 写回答

1条回答 默认 最新

  • 北座猎户 2022-07-06 23:30
    关注

    第32行是不是有点问题,后面乘的内容应该是r-(mid+1)+1=r-mid吧,源代码中写的区间会重合吧

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月8日
  • 创建了问题 7月6日

悬赏问题

  • ¥15 程序实在不会写,要秃了
  • ¥15 pycharm导入不了自己的包
  • ¥15 C#.net通过内网url地址获取文件并下载问题,浏览器postman可以正常下载,用程序不行
  • ¥15 本人本科机械,目前研一。没有深度学习基础,目前对研究生课题一片迷茫,请教各位!
  • ¥15 关于R语言单因素与多因素线性回归的平均值
  • ¥15 服务器清除BIOS之后引导不了
  • ¥15 CPLEX用OPL编写的混合整数线性优化问题。
  • ¥15 可以用EasyConnect连接实验室内网,但无法连接内网才能访问的服务器,为什么?
  • ¥15 前端预览docx文件,文件从后端传送过来。
  • ¥15 层次聚类和蛋白质相似度