codevs 1082 线段树练习3
给你N个数,有两种操作:
1:给区间[a,b]的所有数增加X
2:询问区间[a,b]的数的和。
第一行一个正整数n,接下来n行n个整数,
再接下来一个正整数Q,每行表示操作的个数,
如果第一个数是1,后接3个正整数,
表示在区间[a,b]内每个数增加X,如果是2,
表示操作2询问区间[a,b]的和是多少。
pascal选手请不要使用readln读入
对于每个询问输出一行一个答案
3
1
2
3
2
1 2 3 2
2 2 3
9
数据范围
1<=n<=200000
1<=q<=200000
mlgb ;
a了一个星期终于过了;
运行结果
测试点#ask1.in 结果:AC 内存使用量: 232kB 时间使用量: 1ms
测试点#ask10.in 结果:AC 内存使用量: 13420kB 时间使用量: 399ms
测试点#ask2.in 结果:AC 内存使用量: 256kB 时间使用量: 1ms
测试点#ask3.in 结果:AC 内存使用量: 6380kB 时间使用量: 32ms
测试点#ask4.in 结果:AC 内存使用量: 6892kB 时间使用量: 176ms
测试点#ask5.in 结果:AC 内存使用量: 6764kB 时间使用量: 177ms
测试点#ask6.in 结果:AC 内存使用量: 13548kB 时间使用量: 365ms
测试点#ask7.in 结果:AC 内存使用量: 256kB 时间使用量: 1ms
测试点#ask8.in 结果:AC 内存使用量: 256kB 时间使用量: 1ms
测试点#ask9.in 结果:AC 内存使用量: 6252kB 时间使用量: 27ms
代码
#include<cstdio>
using namespace std; struct node {
int l,r;
long long int dis,flag;
};
struct node tree[];
int n,m,q;
int a,b,x1; void tree_up(int k)
{
tree[k].dis=tree[k*].dis+tree[k*+].dis;
} void tree_build(int k,int l,int r)
{
tree[k].l=l;
tree[k].r=r;
if(l==r)
{
scanf("%lld",&tree[k].dis);
return;
}
int mid=(l+r)/;
tree_build(k*,l,mid);
tree_build(k*+,mid+,r);
tree_up(k);
} void tree_down(int k)
{
if(tree[k].l==tree[k].r)
{
tree[k].flag=;
return;
}
tree[k*].flag+=tree[k].flag;
tree[k*].dis+=(tree[k*].r-tree[k*].l+)*tree[k].flag;
tree[k*+].flag+=tree[k].flag;
tree[k*+].dis+=(tree[k*+].r-tree[k*+].l+)*tree[k].flag;
tree[k].flag=;
} void tree_add(int k,int l,int r,int x)
{
if(tree[k].l==l&&tree[k].r==r)
{
tree[k].flag+=x;
tree[k].dis+=(tree[k].r-tree[k].l+)*x;
tree_down(k);
return ;
}
tree_down(k);
int mid=(tree[k].l+tree[k].r)/;
if(l>mid) tree_add(k*+,l,r,x);
else if(r<=mid) tree_add(k*,l,r,x);
else {
tree_add(k*,l,mid,x);
tree_add(k*+,mid+,r,x);
}
tree_up(k);
} long long int tree_query(int k,int l,int r)
{
tree_down(k);
if(tree[k].l!=tree[k].r) tree_up(k);
if(tree[k].l==l&&tree[k].r==r)
return tree[k].dis;
int mid=(tree[k].l+tree[k].r)/;
if(l>mid) return tree_query(k*+,l,r);
else if(r<=mid) return tree_query(k*,l,r);
else return tree_query(k*,l,mid)+tree_query(k*+,mid+,r);
} int main()
{
scanf("%d",&n);
tree_build(,,n);
scanf("%d",&m);
while(m--)
{
scanf("%d",&q);
switch(q){
case :{
scanf("%d%d%d",&a,&b,&x1);
tree_add(,a,b,x1);
break;
}
case :{
scanf("%d%d",&a,&b);
printf("%lld\n",tree_query(,a,b));
break;
}
}
}
return ;
}
codevs 1082 线段树练习3的更多相关文章
- codevs 1082 线段树练习 3(区间维护)
codevs 1082 线段树练习 3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...
- codevs 1082 线段树区间求和
codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...
- Codevs 1082 线段树练习 3
1082 线段树练习 3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Maste 传送门 题目描述 Description 给你N个数,有两种操作: 1:给区间[a,b]的 ...
- 【树状数组区间修改区间求和】codevs 1082 线段树练习 3
http://codevs.cn/problem/1082/ [AC] #include<bits/stdc++.h> using namespace std; typedef long ...
- codevs 1082 线段树练习3 (线段树)
题目: 题目描述 Description 给你N个数,有两种操作: 1:给区间[a,b]的所有数增加X 2:询问区间[a,b]的数的和. 输入描述 Input Description 第一行一个正整数 ...
- codevs 1082 线段树练习 3 区间更新+延迟标记
题目描述 Description 给你N个数,有两种操作: 1:给区间[a,b]的所有数增加X 2:询问区间[a,b]的数的和. 输入描述 Input Description 第一行一个正整数n,接下 ...
- codevs 1082 线段树练习 3 --分块练习
时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区间[a,b]的所有数增加X 2:询问区间[ ...
- codevs 1082 线段树练习3 模板题
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; ],sum[ ...
- codevs 1080 线段树点修改
先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...
随机推荐
- 完美卸载oracle11g步骤
完美卸载oracle11g步骤:1. 开始->设置->控制面板->管理工具->服务 停止所有Oracle服务.2. 开始->程序->Oracle - OraHome ...
- cordova 添加闪屏效果
为项目添加SplashScreen插件 在Cordova项目目录运行: cordova plugin add apache.cordova.splashscreen 这个命令从插件git库下载插件代码 ...
- Phonegap之ios对iPhone6和Plus的闪屏适配 -- xmTan
故事的发生起于,由于老板强烈要求app在iPhone6和5有一样的工具栏,然后前端妹子用@media为iPhone6和Plus做了样式适配.然后问题来了,竟然奇葩的发现@media样式只对iPhone ...
- 【Android】自定义控件让TextView的drawableLeft与文本一起居中显示
前言 TextView的drawableLeft.drawableRight和drawableTop是一个常用.好用的属性,可以在文本的上下左右放置一个图片,而不使用更加复杂布局就能达到,我也常常喜欢 ...
- C# 依赖缓存
使用轮询的方式 数据库: 在VS的命令里面输入 aspnet_regsql.exe -S (local) -U sa -P 123456 -d ERP_SQL -ed 上面这句是用来设置哪个服务器上的 ...
- iOS之 HTTP、Socket、TCP的区别(易混
一.HTTP 是一种超文本传输协议,全名hypertext transfer protocol,从字面意思上可以看出该协议用于规定客户端与服务端之间的传输规则, 传输的内容不限于文本(任意类型的数据) ...
- win环境变量立即生效
执行 set PATH=C: 新打开的cmd窗口就立即生效了.
- php设计模式 工厂、单例、注册树模式
Source Code Pro字体 easyphp 命名空间:隔离类和函数,php5.3以后 //test5.php<?php namespace Test5;//命名空间必须是程序脚本的第一 ...
- 如何通过js跨域调用ASP.NET Web API (请问如何实现在javascript中通过http get的方式跨域调用ASP.NET Web API?)
客户端js无需任何专门设置,使用通常的ajax调用即可: $.ajax({ url: '跨域URL', type: 'get', dataType: 'json', success: function ...
- 3、Javascript学习 - IT软件人员学习系列文章
接下来,我们开始进入Javascript语言的学习. Javascript语言是一种解释性的语言,不同于ASP.NET.C#语言的这种编译性的语言.它随着HTML网页的发布而发布,就是说嵌入到HTML ...