HDU 3468 HDOJ 3468 A Simple Problem with Integers ACM 3468 IN HDU
MiYu原创, 转帖请注明 : 转载自 ______________白白の屋
/*
Mail to : miyubai@gamil.com
My Blog : www.baiyun.me
Link : http://www.cnblogs.com/MiYu || http://www.cppblog.com/MiYu
Author By : MiYu
Test : 1
Complier : g++ mingw32-3.4.2
Program :
Doc Name :
*/
//#pragma warning( disable:4789 )
#include <iostream>
#include <fstream>
#include <sstream>
#include <algorithm>
#include <string>
#include <set>
#include
<map>
#include <utility>
#include <queue>
#include <stack>
#include
<list>
#include <vector>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
using namespace std;
inline bool scan_d(int &num) //整数输入
{
char in;bool IsN=false;
in=getchar();
if(in==EOF) return false;
while(in!='-'&&(in<'0'||in>'9')) in=getchar();
if(in=='-'){ IsN=true;num=0;}
else num=in-'0';
while(in=getchar(),in>='0'&&in<='9'){
num*=10,num+=in-'0';
}
if(IsN) num=-num;
return true;
}
struct seg_tree{
int l,r,val;
long long sum;
int mid () { return (r+l) >> 1; }
int dis () { return r-l+1; }
}seg[600000];
int v[100010];
void creat ( int x, int y, int rt = 1 ) {
seg[rt].l = x;
seg[rt].r = y;
seg[rt].val = 0;
if ( x == y ) {
return ;
}
int mid = seg[rt].mid();
creat ( x, mid, rt << 1 );
creat ( mid + 1, y, rt << 1 | 1 );
}
long long cr ( int x, int y, int rt = 1 ) {
seg[rt].val = 0;
if ( seg[rt].l == seg[rt].r ) {
seg[rt].sum = v[x];
return v[x];
}
int mid = seg[rt].mid();
return seg[rt].sum = cr ( x, mid, rt << 1 )
+ cr ( mid + 1, y, rt << 1 | 1 );
}
inline void pushdown ( int rt ) {
int LL = rt << 1, RR = rt << 1 | 1, mid = seg[rt].mid();
if ( seg[rt].val ) {
seg[LL].sum += (long long)seg[LL].dis() * seg[rt].val;
seg[RR].sum += (long long)seg[RR].dis() * seg[rt].val;
seg[LL].val += seg[rt].val;
seg[RR].val += seg[rt].val;
seg[rt].val = 0;
}
}
void md ( int x, int y, int val, int rt = 1 ) {
if ( seg[rt].l == x && seg[rt].r == y ) {
seg[rt].val += val;
seg[rt].sum += (long long)seg[rt].dis() * val;
return;
}
int LL = rt << 1, RR = rt << 1 | 1, mid = seg[rt].mid();
pushdown ( rt );
if ( x > mid ) md ( x, y, val, RR );
else if ( y <= mid ) md ( x, y, val, LL );
else {
md ( x, mid, val, LL );
md ( mid+1, y, val, RR );
}
seg[rt].sum = seg[LL].sum + seg[RR].sum;
}
long long q ( int x, int y, int rt = 1 ) {
if ( seg[rt].l == x && seg[rt].r == y ) {
return seg[rt].sum;
}
pushdown ( rt );
int LL = rt << 1, RR = rt << 1 | 1, mid = seg[rt].mid();
if ( x > mid ) return q ( x, y, RR );
else if ( y <= mid ) return q ( x, y, LL );
else {
return q ( x, mid, LL ) + q ( mid + 1, y, RR );
}
}
int main ()
{
int N, M;
creat ( 1, 100000 );
while ( scanf ( "%d%d", &N, &M ) == 2 ) {
for ( int i = 1; i <= N; ++ i ) scanf ( "%d", &v[i] );
cr ( 1, N );
while ( M -- ) {
char s[5];
int x, y, val;
scanf ( "%s", s );
switch ( s[0] ) {
case 'Q':
scanf ( "%d%d", &x, &y );
printf ( "%lld\n", q ( x, y ) );
break;
case 'C':
scanf ( "%d%d%d", &x, &y, &val );
md ( x, y, val );
}
}
}
return 0;
}
</pre>
转载于:https://www.cnblogs.com/MiYu/archive/2010/11/16/1878879.html
HDU 3468 HDOJ 3468 A Simple Problem with Integers ACM 3468 IN HDU相关推荐
- A Simple Problem with Integers POJ - 3468 (线段树)
思路:线段树,区间更新,区间查找 1 #include<iostream> 2 #include<vector> 3 #include<string> 4 #inc ...
- A Simple Problem with Integers POJ - 3468(线段树+区间查询+区间修改+建树+懒惰标记模板)+(树状数组)
题意: 有一个数组,有两种操作.1: Q a b 求[a,b]的和 2:C a b c 给[a,b] 的所有元素都加上c. 题目: You have N integers, A1, A2, ... , ...
- 2019_GDUT_新生专题V算法优化 B. A Simple Problem with Integers POJ 3468
来源 POJ3468 题目: You have N integers, A1, A2, - , AN. You need to deal with two kinds of operations. O ...
- 【线段树】【模板】讲解 + 例题1 HDU - 1754 I Hate It (点修改分数)+ 例题二 POJ - 3468 A Simple Problem with Integers(区间加值)
[线段树][模板]讲解 + 例题1 HDU - 1754 I Hate It (点修改分数)+ 例题二 POJ - 3468 A Simple Problem with Integers(区间加值) ...
- poj 3243:A Simple Problem with Integers
3243:A Simple Problem with Integers 查看 提交 统计 提示 提问 总时间限制: 5000ms 单个测试点时间限制: 2000ms 内存限制: 131072 ...
- poj 3468 A Simple Problem with Integers(线段树区区)
题目链接: http://poj.org/problem?id=3468 题目大意: 给出N个数,和M次查询 C a b c 区间[a,b]的值都加上c Q a b 查询区间[a,b]值 ...
- POJ 3468 A Simple Problem with Integers(线段树:区间更新)
http://poj.org/problem?id=3468 题意: 给出一串数,每次在一个区间内增加c,查询[a,b]时输出a.b之间的总和. 思路: 总结一下懒惰标记的用法吧. 比如要对一个区间范 ...
- 线段树专辑—— pku 3468 A Simple Problem with Integers
http://poj.org/problem?id=3468 典型的一道基于lazy传递的线段树题目,这题和一般题目不同的地方在于,它的每次操作不是简单的覆盖线段,而是累加.记得第一次写的时候纠结了好 ...
- POJ 3468 A Simple Problem with Integers
分析:这题wa了好多次(看了下discuss好多人也是这样,好题~).一处是sum值会超int32,要用int64.还有一处是toadd要累加,我不知道是受上一题影响还是怎的..pushdown的时候 ...
- POJ 3468 A Simple Problem with Integers (1)
POJ_3468(1) 在消化了PPT上思想之后,又重新做了一下这个题目. 不妨将原数组的元素记作a[i],然后我们用堆建立两棵线段树,一棵的原数组为x[i](x[i]=a[i]-a[i-1],即原数 ...
最新文章
- CSharpGL(1)从最简单的例子开始使用CSharpGL
- Android中使用AlarmManager设置闹钟
- TensorFlow与主流深度学习框架对比
- 员外带你读论文:From RankNet to LambdaRank to LambdaMART: An Overview
- Java-日期 正则表达式
- visualsvn php,VisualSVN 手动记录访问日志
- 这个耳机一点不输千元级的AirPods
- gsonformat插件_裂墙推荐!IntelliJ IDEA 常用插件一览,让效率成为习惯
- BAT在AI领域投资收购大起底:当我们说搞AI时我们要搞些什么?
- iBase4J部署总结¥
- python下载安装教程-一招解决:各种版本的Python下载安装教程
- 手机应用只清理不够,还要卸载
- matlab好看的字体,最佳50个新鲜+漂亮的字体(2011)
- 分享个强大的抓包工具
- 点云3D目标检测学习(2):pointnet++源码
- html怎么把图片左移_css怎么让图片向左移动?
- flv转mp4(ffmpeg)
- 【洛谷】P1138 第k小整数
- 腾讯网页登陆的加密机制
- 国庆节,一天开发一个小程序+Web系统。2.5K到手。【分享开发经验】【收藏起来】