codevs 1082 线段树练习 3

 时间限制: 3 s
 空间限制: 128000 KB
 题目等级 : 大师 Master
题目描述 Description

给你N个数,有两种操作:

1:给区间[a,b]的所有数增加X

2:询问区间[a,b]的数的和。

输入描述 Input Description

第一行一个正整数n,接下来n行n个整数,

再接下来一个正整数Q,每行表示操作的个数,

如果第一个数是1,后接3个正整数,

表示在区间[a,b]内每个数增加X,如果是2,

表示操作2询问区间[a,b]的和是多少。

pascal选手请不要使用readln读入

输出描述 Output Description

对于每个询问输出一行一个答案

样例输入 Sample Input

3

1

2

3

2

1 2 3 2

2 2 3

样例输出 Sample Output

9

数据范围及提示 Data Size & Hint

数据范围

1<=n<=200000

1<=q<=200000

#include<iostream>
using namespace std;
#include<cstdio>
#define N 200001
long long int sz[N],n,q,a,b,c,x;
struct node{
long long int l,r,val,delta;
node *child[];
}*root=NULL;
void input()
{
scanf("%d",&n);
for(long long int i=;i<=n;++i)
scanf("%d",&sz[i]);
}
void update(node *cur)
{
cur->val=cur->child[]->val+cur->child[]->val;
}
void bulid(node *&cur,long long int l,long long int r)
{
if(l>r) return ;
cur=new node;
cur->l=l;cur->r=r;
cur->delta=;
if(l==r)
{
cur->child[]=cur->child[]=NULL;
cur->val=sz[l];
return;
}
long long int mid=(l+r)/;
bulid(cur->child[],l,mid);
bulid(cur->child[],mid+,r);
update(cur);
}
void down(node *cur)
{
if(cur->child[])
{
long long int l1=cur->child[]->l,r1=cur->child[]->r;
cur->child[]->val+=(r1-l1+)*cur->delta;
cur->child[]->delta+=cur->delta;
}
if(cur->child[])
{
long long int l1=cur->child[]->l,r1=cur->child[]->r;
cur->child[]->val+=(r1-l1+)*cur->delta;
cur->child[]->delta+=cur->delta;
}
cur->delta=;
}
void add(node *cur,long long int l,long long int r,long long int x)
{
if(l<=cur->l&&cur->r<=r)
{
cur->val+=(cur->r-cur->l+)*x;
cur->delta+=x;
return ;
}
if(cur->delta) down(cur);
long long int mid=(cur->l+cur->r)/;
if(l<=mid) add(cur->child[],l,r,x);
if(r>mid) add(cur->child[],l,r,x);
update(cur);
}
long long int query(node *cur,long long int l,long long int r)
{
if(l<=cur->l&&cur->r<=r)
{
return cur->val;
}
if(cur->delta) down(cur);
long long int ans=,mid=(cur->l+cur->r)/;
if(l<=mid) ans+=query(cur->child[],l,r);
if(r>mid) ans+=query(cur->child[],l,r);
return ans;
}
int main()
{
input();
bulid(root,,n);
scanf("%d",&q);
while(q--)
{
scanf("%d",&x);
if(x==)
{
scanf("%d%d%d",&a,&b,&c);
add(root,a,b,c);
}
else {
scanf("%d%d",&a,&b);
printf("%lld\n",query(root,a,b));
}
}
return ;
}

teacher's

代码自己尝试写了一下
/*数据类型必须用long long才能过*/
#include<cstdio>
#include<iostream>
using namespace std;
long long n,m;
long long sz[];
struct node
{
long long val,delta,l,r;
node * ch[];
}*root=NULL;
long long sv(node * cur)
{
return cur?cur->val:;
}
void update(node * cur)
{
cur->val=sv(cur->ch[])+sv(cur->ch[]);
}
void build(node * &cur,long long l,long long r)
{
if(l>r)return;
cur=new node;
cur->l=l;cur->r=r;cur->delta=;
if(l==r)
{
cur->val=sz[l];
cur->ch[]=cur->ch[]=NULL;
}
else
{
long long mid=(l+r)/;
build(cur->ch[],l,mid);
build(cur->ch[],mid+,r);
update(cur);
}
}
void down(node * cur)
{
if(cur->ch[])
{
cur->ch[]->delta+=cur->delta;
cur->ch[]->val+=cur->delta*(cur->ch[]->r-cur->ch[]->l+);
}
if(cur->ch[])
{
cur->ch[]->delta+=cur->delta;
cur->ch[]->val+=cur->delta*(cur->ch[]->r-cur->ch[]->l+);
}
cur->delta=;
}
void add(node * cur,long long l,long long r,long long x)
{
if(l<=cur->l&&cur->r<=r)
{
cur->delta+=x;
cur->val+=x*(cur->r-cur->l+);
}
else
{
if(cur->delta)down(cur);
long long mid=(cur->l+cur->r)/;
if(l<=mid)add(cur->ch[],l,r,x);
if(r>mid)add(cur->ch[],l,r,x);
update(cur);/*注意这个不能更少,当前区间val应该加多少,未知,要先加完他的左右孩子,再回来的时候更新它*/
}
}
long long query(node * cur,long long l,long long r)
{
if(l<=cur->l&&cur->r<=r)return cur->val;
else
{
down(cur);
long long mid=(cur->l+cur->r)/;
long long ans=;
if(l<=mid)ans+=query(cur->ch[],l,r);
if(r>mid)ans+=query(cur->ch[],l,r);
return ans;
}
}
int main()
{
long long i;
cin>>n;
for(i=;i<=n;i++)scanf("%lld",&sz[i]);
build(root,,n);
cin>>m;
for(i=;i<m;i++)
{
long long a,b,c,d;
scanf("%lld",&a);
if(a==)
{
scanf("%lld%lld%lld",&b,&c,&d);
add(root,b,c,d);
}
else if(a==)
{
scanf("%lld%lld",&b,&c);
printf("%lld\n",query(root,b,c));
}
}
return ;
}

mine

 

codevs 1082 线段树练习 3(区间维护)的更多相关文章

  1. codevs 1082 线段树练习 3 区间更新+延迟标记

    题目描述 Description 给你N个数,有两种操作: 1:给区间[a,b]的所有数增加X 2:询问区间[a,b]的数的和. 输入描述 Input Description 第一行一个正整数n,接下 ...

  2. codevs 1082 线段树区间求和

    codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...

  3. codevs 1082 线段树练习3

    1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题解       题目描述 Description 给你N个数,有两种操作: 1: ...

  4. Codevs 1082 线段树练习 3

    1082 线段树练习 3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Maste 传送门 题目描述 Description 给你N个数,有两种操作: 1:给区间[a,b]的 ...

  5. 【树状数组区间修改区间求和】codevs 1082 线段树练习 3

    http://codevs.cn/problem/1082/ [AC] #include<bits/stdc++.h> using namespace std; typedef long ...

  6. codevs 1082 线段树练习3 (线段树)

    题目: 题目描述 Description 给你N个数,有两种操作: 1:给区间[a,b]的所有数增加X 2:询问区间[a,b]的数的和. 输入描述 Input Description 第一行一个正整数 ...

  7. codevs 1082 线段树练习 3 --分块练习

    时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区间[a,b]的所有数增加X 2:询问区间[ ...

  8. 【codevs】1082 线段树练习 3 <区间修改+区间和>

    题目连接   http://codevs.cn/problem/1082/ Description 给你N个数,有两种操作: 1:给区间[a,b]的所有数增加X 2:询问区间[a,b]的数的和. In ...

  9. codevs 1081 线段树练习 2 区间更新 单点查询 无lazy

    题目描述 Description 给你N个数,有两种操作 1:给区间[a,b]的所有数都增加X 2:询问第i个数是什么? 输入描述 Input Description 第一行一个正整数n,接下来n行n ...

随机推荐

  1. JSON.parse 与 eval() 对于解析json的问题

    1.eval()与JSOn.parse的不同 eval() var c = 1; //全局变量 var jsonstr1 = '{"name":"a",&quo ...

  2. nhibernate连接11g数据库

    我框架的数据映射用 nhibernate连接多数据库,这次又增加了oracle11g,负责开发的同事始终连接不上,悲催的sharepoint调试是在不方便... 下面描述下问题的解决,细节问题有3个: ...

  3. 设计模式(十二):通过ATM取款机来认识“状态模式”(State Pattern)

    说到状态模式,如果你看过之前发布的重构系列的文章中的<代码重构(六):代码重构完整案例>这篇博客的话,那么你应该对“状态模式”并不陌生,因为我们之前使用到了状态模式进行重构.上一篇博客我们 ...

  4. Oracle 11g RAC 应用补丁简明版

    之前总结过<Oracle 11.2.0.4 RAC安装最新PSU补丁>, 这次整理为简明版,忽略一切输出的显示,引入一些官方的说明,增加OJVM PSU的补丁应用. 环境:RHEL6.5 ...

  5. [入门级] 基于 visual studio 2010 mvc4 的图书管理系统开发初步 (二)

    [入门级] 基于 visual studio 2010 mvc4 的图书管理系统开发初步 (二) Date  周六 10 一月 2015 By 钟谢伟 Category website develop ...

  6. 利用Python进行数据分析(10) pandas基础: 处理缺失数据

      数据不完整在数据分析的过程中很常见. pandas使用浮点值NaN表示浮点和非浮点数组里的缺失数据. pandas使用isnull()和notnull()函数来判断缺失情况. 对于缺失数据一般处理 ...

  7. [AngularJS] AngularJS系列(3) 中级篇之表单验证

    目录 基本验证 验证插件messages 自定义验证 基本验证 <form name="form" novalidate ng-app> <span>{{f ...

  8. UED双飞翼布局

    <style> body,html { height:%; padding: ; margin: } .main { background: #f2f2f2; width: %; floa ...

  9. HTML5学习

    HTML5动画效果 http://www.html5tricks.com/30-more-html5-apps.html http://www.html5tricks.com/category/htm ...

  10. h1、h2、h3标签及strong标签对页面seo的影响

    今天和大家来聊下h1,h2,h3,strong几个标签,在网页中的使用对页面seo的影响,也阐述了个人的一些想法. 首先简要讲下H标签及strong标签的含义:<h1>.<h2> ...