poj 3468(线段树)
http://poj.org/problem?id=3468
题意:给n个数字,从A1 …………An m次命令,Q是查询,查询a到b的区间和,c是更新,从a到b每个值都增加x。
思路:这是一个很明显的线段树的题目,就是线段树的用区间更新就可以,我也是第一次用。。
#include <stdio.h>
#include <string.h>
#define maxn 100050 long long arra[ maxn ]; struct note{ //要用long long 类型的,不然会爆数据的。 long long sum,c; }segtree[ maxn * ]; void build(int root , int instart , int iend) //插入操作。
{
segtree[ root ].c = ;
if(instart == iend)
segtree[ root ].sum = arra[ instart ];
else
{
int mid = (instart + iend)/;
build( root * , instart ,mid );
build( root * + , mid + , iend );
segtree[ root ].sum = segtree[ root * ].sum + segtree[ root * + ].sum;
}
} void pushdown(int root,int sta , int en ) //延迟标记。
{
if(segtree[ root ].c != )
{
segtree[ root * ].c += segtree[ root ].c;
segtree[ root * + ].c += segtree [ root ].c;
int mid = (sta + en) / ;
segtree[ root * ] .sum += segtree[ root ].c*( mid - sta + );
segtree[ root * + ].sum += segtree[ root ].c *( en - mid );
segtree[ root ].c = ;
}
} long long Find(int root , int ranges , int rangee , int goals ,int goale) //查找。查找时也需要对延迟标记进行更新。
{
if( goals > rangee || goale < ranges)
return ;
if( rangee <= goale && ranges >= goals)
return segtree[ root ].sum;
pushdown(root,ranges,rangee);
int mid = (rangee+ranges) / ;
return Find(root * , ranges , mid , goals ,goale)+ Find(root * + , mid + , rangee , goals , goale );
} void update(int root , int sta, int en,int x,int y,int val) //更新。
{
if( x > en || y < sta)
return ;
if( x <= sta && y >= en)
{
segtree[ root ].sum += val*( en - sta + ) ;
segtree[ root ].c += val ;
return ;
}
pushdown(root,sta,en);
int mid = ( sta + en ) / ;
update ( root * , sta , mid , x ,y ,val );
update ( root * + , mid + , en , x , y , val );
segtree [ root ].sum = segtree[ root * ].sum + segtree[ root * + ].sum;
} int main()
{
//freopen("in.txt","r",stdin);
int m,n,a,b,c;
char x;
scanf("%d%d",&m,&n);
for( int i = ; i <= m ; i++ )
scanf("%lld",&arra[i]);
build(,,m);
for( int i = ; i <= n ; i++ )
{
scanf("%s",&x);
if(x=='Q')
{
scanf("%d%d",&a,&b);
printf("%lld\n",Find(,,m,a,b));
}
else
{
scanf("%d%d%d",&a,&b,&c);
update(,,m,a,b,c);
}
}
return ;
}
poj 3468(线段树)的更多相关文章
- hdu 1698+poj 3468 (线段树 区间更新)
http://acm.hdu.edu.cn/showproblem.php?pid=1698 这个题意翻译起来有点猥琐啊,还是和谐一点吧 和涂颜色差不多,区间初始都为1,然后操作都是将x到y改为z,注 ...
- POJ 3468 线段树裸题
这些天一直在看线段树,因为临近期末,所以看得断断续续,弄得有些知识点没能理解得很透切,但我也知道不能钻牛角尖,所以配合着刷题来加深理解. 然后,这是线段树裸题,而且是最简单的区间增加与查询,我参考了A ...
- poj 3468 线段树区间更新/查询
Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. On ...
- POJ 3468 (线段树 区间增减) A Simple Problem with Integers
这题WA了好久,一直以为是lld和I64d的问题,后来发现是自己的pushdown函数写错了,说到底还是因为自己对线段树理解得不好. 因为是懒惰标记,所以只有在区间分开的时候才会将标记往下传递.更新和 ...
- C - A Simple Problem with Integers POJ - 3468 线段树模版(区间查询区间修改)
参考qsc大佬的视频 太强惹 先膜一下 视频在b站 直接搜线段树即可 #include<cstdio> using namespace std; ; int n,a[maxn]; stru ...
- poj 3468 线段树 成段增减 区间求和
题意:Q是询问区间和,C是在区间内每个节点加上一个值 Sample Input 10 51 2 3 4 5 6 7 8 9 10Q 4 4Q 1 10Q 2 4C 3 6 3Q 2 4Sample O ...
- POJ 3468 线段树 成段更新 懒惰标记
A Simple Problem with Integers Time Limit:5000MS Memory Limit:131072K Case Time Limit:2000MS Descr ...
- POJ 3468 线段树区间修改查询(Java,c++实现)
POJ 3468 (Java,c++实现) Java import java.io.*; import java.util.*; public class Main { static int n, m ...
- POJ 3468 线段树+状压
题意:给你n个数,有对区间的加减操作,问某个区间的和是多少. 思路:状压+线段树(要用lazy标记,否则会TLE) //By SiriusRen #include <cstdio> #in ...
随机推荐
- Enum简单例子DropdownList
借鉴:http://www.cnblogs.com/suizhikuo/archive/2013/06/07/3125225.html vs2012 mvc4 最终效果: 1.建立mvc4 Inter ...
- Js 遍历json对象所有key及根据动态key获取值
var obj = {}; for(var k in obj) { //遍历对象,k即为key,obj[k]为当前k对应的值 console.log(obj[k]); } 文章来自:https://z ...
- p2p网贷系统即将上线
等有时间了,我将此项目的详细设计与开发流程进行陈述,想学习的朋友敬请期待 先上界面:首页 后台:
- jQuery之Ajax--全局Ajax事件处理器
1.这些方法用于注册事件处理器,用来处理页面上的任何 Ajax 请求,当某些事件触发后,这些事件处理器被调用.如果jQuery.ajaxSteup()中的 global 属性被设置为 true (这也 ...
- 编程结构:Promise和Future
非阻塞模型中Promise,Future 和 Callback一些比较常用的模型: Future表示一个可能还没有实际完成的异步任务结果:实际在编程中,应用future数据结构的时候,你得到并不是一个 ...
- sokect编程进阶
IO模型 什么是IO? IO:input和output的缩写,即输入/输出端口.每个设备都会有一个专用的I/O地址,用来处理自己的输入输出信息 同步.异步.阻塞.非阻塞 同步和异步的概念描述的是用户线 ...
- js 时间操作和随机数操作
function Data() { var date = new Date(); var year = date.getFullYear(); ; var strDate = date.getDate ...
- 10月25日上午PHP继承多态
概念:子类可以继承父类的一切 方法重写:在子类里面对父类的方法进行重写,实现自己独特的功能.特点:单继承:一个子类只能有一个父类,一个父类可以派生出多个子类.override重写(子类对父类的重写) ...
- Java Reference简要概述
@(Java)[Reference] Java Reference简要概述 Reference对象封装了其它对象的引用,可以和普通的对象一样操作. Java提供了四种不同类型的引用,引用级别从高到低分 ...
- C#中精确计时的一点收获 【转】
C#中精确计时的一点收获 [转] 以下所有代码运行环境:Windows 2003, Intel(R) Core(TM) 2 Duo CPU E8400 @ 3.00GHz 2.99GHz,2.96G ...