线段树 c++-线段树 uva11992 求大神帮看看,实在不知道错在哪里。。。。。

问题描述

线段树 uva11992 求大神帮看看,实在不知道错在哪里。。。。。

特别是,Query函数这个函数,我实在是晕的很。。。。。

#include
#include
#include
#include
using namespace std;

#define MAX 3000100
const int inf=1000000009;
const int MAXN = 1000010;
struct Node{
int L,R;
int minv,maxv,sumv;
int addv,setv;
// Node(int l,int r, int x=0,int y=0,int z=0,int w=0,int v=-1):L(l),R(r),minv(x),maxv(y),sumv(z),addv(w),setv(v){}
}a[MAXN*5];

int r,c,m;
int _max[22], _min[22], _sum[22];

void build(int l,int r,int index)
{
a[index].L = l;
a[index].R = r;
a[index].minv=a[index].maxv=a[index].sumv=0;
a[index].addv=0;
a[index].setv=-1;
if(l==r)
return;
int mid = l+(r-l)/2;
build(l,mid,index<<1);
build(mid+1,r,index<<1|1);
}

void maintain(int o)
{
if(a[o].R>a[o].L)
{
a[o].sumv = a[o<<1].sumv + a[o<<1|1].sumv;
a[o].maxv = max(a[o<<1].maxv,a[o<<1|1].maxv);
a[o].minv = min(a[o<<1].minv,a[o<<1|1].minv);
}

}

void pushdown(int o)
{
//将对min,max和sum的修改移到了update函数中
int lc=o<<1,rc=o<<1|1;
if(a[o].setv!=-1)
{
if(a[o].L != a[o].R)
{
a[lc].setv = a[rc].setv = a[o].setv;

        a[lc].addv = a[rc].addv = 0;     //关注
        a[lc].maxv = a[lc].setv;
        a[lc].minv = a[lc].setv;
        a[lc].sumv = a[lc].setv*(a[lc].R-a[lc].L+1);
        a[rc].maxv = a[rc].setv;
        a[rc].minv = a[rc].setv;
        a[rc].sumv = a[rc].setv*(a[rc].R-a[rc].L+1);
    }
    a[o].setv = -1;
}
if(a[o].addv>0)
{
    if(a[o].L != a[o].R)
    {
        int tmpa=a[o].addv;
        a[lc].addv += tmpa;a[rc].addv += tmpa;      //关注,是加上tmpa
        a[lc].minv += tmpa;
        a[lc].maxv += tmpa;
        a[lc].sumv += tmpa*(a[lc].R-a[lc].L+1);
        a[rc].minv += tmpa;
        a[rc].maxv += tmpa;
        a[rc].sumv += tmpa*(a[rc].R-a[rc].L+1);
    }
    a[o].addv = 0;
}

}

void UpdateAdd(int l,int r,int val,int o)
{
int lc=o<
if(l=a[o].R)
{
a[o].addv += val;
// a[o].setv += val;
a[o].minv += a[o].addv;
a[o].maxv += a[o].addv;
a[o].sumv += a[o].addv*(a[o].R-a[o].L+1);
}
else{
pushdown(o);
int M = a[o].L+(a[o].R-a[o].L)/2;
if(l<=M)UpdateAdd(l,r,val,o<
if(r>M)UpdateAdd(l,r,val,o<<1|1);
maintain(o);
}

}

void UpdateSet(int l,int r,int val,int o)
{
int lc=o<<1 , rc=o<<1|1;

if(l<=a[o].L && r>=a[o].R)
{
    a[o].setv = val;
    a[o].addv = 0;
    a[o].maxv = a[o].setv;
    a[o].minv = a[o].setv;
    a[o].sumv = a[o].setv*(a[o].R-a[o].L+1);
}
else
{
    pushdown(o);
    int M = a[o].L+(a[o].R-a[o].L)/2;

    if(l<=M)UpdateSet(l,r,val,lc);
    if(r>M)UpdateSet(l,r,val,rc);
    maintain(o);
}

}

void Query(int k,int l,int r,int o,int add)
{
if(a[o].setv >= 0) {
int v = a[o].setv + add + a[o].addv;
_sum[k] += v * (min(a[o].R,r)-max(a[o].L,l)+1);
_min[k] = min(_min[k], v);
_max[k] = max(_max[k], v);
} else if(l<=a[o].L && r>=a[o].R)
{
_sum[k]+=a[o].sumv+add*(a[o].R-a[o].L+1);
_min[k]=min(_min[k],a[o].minv+add);
_max[k] = max(_max[k],a[o].maxv+add);
}
else
{
pushdown(o);
int M = a[o].L+(a[o].R-a[o].L)/2;
if(l<=M)Query(k,l,r,o<
if(r>M)Query(k,l,r,o<<1|1,add+a[o].addv);
}
}

int main()
{
freopen("a.txt","r",stdin);
while(scanf("%d %d %d",&r,&c,&m)==3)
{
build(1,r*c,1); //一维问题
int type, x1,y1,x2,y2,val;

while(m--)
{
scanf("%d",&type);
switch(type)
{
case 1:
{
scanf("%d %d %d %d %d",&x1,&y1,&x2,&y2,&val);
for(int i=x1;i<=x2;i++)
{
UpdateAdd((i-1)*c+y1,(i-1)*c+y2,val,1);
}
}
break;
case 2:
{
scanf("%d %d %d %d %d",&x1,&y1,&x2,&y2,&val);
for(int i=x1;i<=x2;i++)
{
UpdateSet((i-1)*c+y1,(i-1)*c+y2,val,1);
}
}
break;
case 3:
{

                    memset(_sum,0,sizeof(_sum));
                    for(int i=0;i<=r;i++)
                    {
                        _max[i]=-inf;
                        _min[i]=inf;
                    }
                    scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
                    int anssum = 0, ansmax = -inf, ansmin = inf;

                    for(int i=x1;i<=x2;i++)
                    {
                        Query(i,(i-1)*c+y1,(i-1)*c+y2,1,0);
                        anssum+=_sum[i];
                        ansmin = min(ansmin,_min[i]);
                        ansmax = max(ansmax,_max[i]);
                    }
                    cout << anssum << " " << ansmin << " " << ansmax << endl;
                }
                break;
        }
    }
}
return 0;

}

时间: 2024-09-17 04:38:22

线段树 c++-线段树 uva11992 求大神帮看看,实在不知道错在哪里。。。。。的相关文章

c++-关于clang语法树AST操作。求大神帮帮忙。

问题描述 关于clang语法树AST操作.求大神帮帮忙. 我需要将c++代码利用clang生成语法树,在语法树上进行改动,再变回代码. 请问应该怎么做? clang生成的语法树信息存在哪里,怎么提取?怎么将AST再转成c++代码?

socket-JAVA代理服务器,用浏览器打开的时候显示的网页信息总是不全,有时候显示不出来,求大神帮我看看

问题描述 JAVA代理服务器,用浏览器打开的时候显示的网页信息总是不全,有时候显示不出来,求大神帮我看看 package work; import java.io.*; import java.net.*; public class MMProxy extends Thread { static public int CONNECT_RETRIES = 5; //尝试与目标主机连接次数 static public int CONNECT_PAUSE = 5; //每次建立连接的间隔时间 stat

求大神帮我解决ueditor单图上传按钮显示的问题asp.net

问题描述 求大神帮我解决ueditor单图上传按钮显示的问题asp.net 因为公司项目需要,昨天下载了一个.net版的ueditor富文本编辑器,现在也只是能在页面上显示出来了,还有很多的配置问题没解决,现在的问题是单图上传按钮是灰色的,怎么让它显示?还是多图上传的本地文件上传的配置问题,希望能来个大牛帮我解决一下,最好有个截图解释一下,才刚工作一个月,谢谢了

VS2012无法附加进程,求大神帮解决

问题描述 VS2012无法附加进程,求大神帮解决 解决方案 直接在vs里调试你的asp.net程序

新生 求大神帮帮忙!

问题描述 新生 求大神帮帮忙! 解决方案 求大神帮帮忙 解决方案二: 先看看你的数据库启动了没 解决方案三: 试试: 打开'程序'-'所有程序'-'Microsoft SQL Server 2012 '-'配置工具'-'SQL Server 配置管理器',在弹出的窗体中,找到'SQL Server 2012 网络配置',把'MSSQLSERVER的协议'下的"Named Pipes"和"TCP/IP"启动,然后重新启动Microsoft SQL Server 201

字符串处理-求大神帮解决如下程序,最基本的C语言字符串类型,不用编太难(如下为问题要求,测试用例,输出用例)

问题描述 求大神帮解决如下程序,最基本的C语言字符串类型,不用编太难(如下为问题要求,测试用例,输出用例) Background Given an m by n grid of letters and a list of words, find the location in the grid at which the word can be found. A word matches a straight, uninterrupted line of letters in the grid.

求大神帮忙看看,不知道为什么运行时候总是输不出来

问题描述 求大神帮忙看看,不知道为什么运行时候总是输不出来 #include #include #include #include typedef struct student{ char number[10]; char name[10]; int grade; struct student *next; }ADDR; int menu_select(); ADDR *input(ADDR *); void output(ADDR *); void Avg(struct student *);

求解释-求大神帮看看这段汇编代码

问题描述 求大神帮看看这段汇编代码 学校课程设计,这段是步进电机的控制代码,用键盘输入,在六位LED七段数码显示管上显示,求大神把下面代码加上注释,实在不行就帮忙看下键盘显示那部分是怎么回事,有重谢. ORG 0A30H ;? MONIT: MOV SP,#50H MOV 7EH,#00H MOV 7DH,#02H MOV R0,#7CH MOV A,#08H MOV R4,#04H MONIT1: MOV @R0,A DEC R0 DJNZ R4,MONIT1 MOV A,#7EH MOV D

用java开发一个安卓客户端在线交流APP,是怎么实现添加好友的?求大神帮我看看这段代码。

问题描述 用java开发一个安卓客户端在线交流APP,是怎么实现添加好友的?求大神帮我看看这段代码. private void submit() { dialog = ProgressDialog.show(this, "提示", "处理中.."); new AsyncTask() { @Override protected String doInBackground(String... params) { String urlString = AppConstan