poj 3466 A Simple Problem with Integers
题目链接:http://poj.org/problem?id=3468 http://poj.org/problem?id=3468 http://poj.org/problem?id=3468
思路:这是一个区间改动区间查询的题,因为题目中的给的数据比較大,那么用单个改动和查询肯定不行,所以。
。。。注意数据可能比較大,应该用__int64或long long存数据。
。
。。
。
code:
- #include<stdio.h>
- #include<math.h>
- #define L(u) (u<<1)
- #define R(u) (u<<1|1)
- const int M=100010;
- struct Node
- {
- __int64 l,r;
- __int64 add;
- long long sum;
- }node[M*4];
- __int64 a[M];
- void pushup(__int64 u)
- {
- node[u].sum=node[L(u)].sum+node[R(u)].sum;
- return ;
- }
- void pushdown(__int64 u)
- {
- node[L(u)].add+=node[u].add;
- node[L(u)].sum+=(node[L(u)].r-node[L(u)].l+1)*node[u].add;
- node[R(u)].add+=node[u].add;
- node[R(u)].sum+=(node[R(u)].r-node[R(u)].l+1)*node[u].add;
- node[u].add=0;
- }
- void build(__int64 u,__int64 left,__int64 right)
- {
- node[u].l=left;
- node[u].r=right;
- node[u].add=0;
- if(left==right)
- {
- node[u].sum=a[left];
- return ;
- }
- __int64 mid=(node[u].l+node[u].r)/2;
- build(L(u),left,mid);
- build(R(u),mid+1,right);
- pushup(u);
- }
- void update(__int64 u,__int64 left,__int64 right,__int64 v)
- {
- if(left<=node[u].l&&node[u].r<=right)
- {
- node[u].add+=v;
- node[u].sum+=(node[u].r-node[u].l+1)*v;
- return ;
- }
- //node[u].sum+=(right-left+1)*v; //当前节点表示的区间不是查询区间的子区间
- if(node[u].add) pushdown(u); //分析当前节点懒惰标记是否为0,不为0则要给他的子节点更新数据
- __int64 mid=(node[u].l+node[u].r)/2;
- if(right<=mid) update(L(u),left,right,v);
- else if(left>mid) update(R(u),left,right,v);
- else
- {
- update(L(u),left,mid,v);
- update(R(u),mid+1,right,v);
- }
- node[u].sum=node[L(u)].sum+node[R(u)].sum;
- }
- __int64 query(__int64 u,__int64 left,__int64 right)
- {
- if(left<=node[u].l&&node[u].r<=right)
- {
- return node[u].sum;
- }
- if(node[u].add) pushdown(u); //分析当前节点懒惰标记是否为0,不为0则要给他的子节点更新数据
- __int64 mid=(node[u].l+node[u].r)/2;
- if(right<=mid) return query(L(u),left,right);
- else if(left>mid) return query(R(u),left,right);
- else
- {
- return (query(L(u),left,mid)+query(R(u),mid+1,right));
- }
- }
- int main()
- {
- __int64 n,m,i,x,y,z;
- while(scanf("%I64d%I64d",&n,&m)==2)
- {
- for(i=1;i<=n;i++)
- {
- scanf("%I64d",&a[i]);
- }
- build(1,1,n);
- char str[5];
- for(i=0;i<m;i++)
- {
- scanf("%s",str);
- if(str[0]=='C')
- {
- scanf("%I64d%I64d%I64d",&x,&y,&z);
- update(1,x,y,z);
- }
- else
- {
- scanf("%I64d%I64d",&x,&y);
- printf("%I64d\n",query(1,x,y));
- }
- }
- }
- return 0;
- }
poj 3466 A Simple Problem with Integers的更多相关文章
- POJ.3468 A Simple Problem with Integers(线段树 区间更新 区间查询)
POJ.3468 A Simple Problem with Integers(线段树 区间更新 区间查询) 题意分析 注意一下懒惰标记,数据部分和更新时的数字都要是long long ,别的没什么大 ...
- poj 3468 A Simple Problem with Integers 【线段树-成段更新】
题目:id=3468" target="_blank">poj 3468 A Simple Problem with Integers 题意:给出n个数.两种操作 ...
- 线段树(成段更新) POJ 3468 A Simple Problem with Integers
题目传送门 /* 线段树-成段更新:裸题,成段增减,区间求和 注意:开long long:) */ #include <cstdio> #include <iostream> ...
- poj 3468:A Simple Problem with Integers(线段树,区间修改求和)
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 58269 ...
- poj 3468 A Simple Problem with Integers 线段树第一次 + 讲解
A Simple Problem with Integers Description You have N integers, A1, A2, ... , AN. You need to deal w ...
- POJ 3468 A Simple Problem with Integers //线段树的成段更新
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 59046 ...
- [POJ] 3468 A Simple Problem with Integers [线段树区间更新求和]
A Simple Problem with Integers Description You have N integers, A1, A2, ... , AN. You need to deal ...
- [ACM] poj 3468 A Simple Problem with Integers(段树,为段更新,懒惰的标志)
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 55273 ...
- POJ 3468 A Simple Problem with Integers(树状数组区间更新)
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 97217 ...
随机推荐
- 告别IE给我们的web开发带来的困扰(使用chrome frame v8引擎)
茶爸爸个人微信:benyzhous,公众号:cha-baba欢迎骚扰 由于客户所有机器必须使用IE6浏览器,导致我们在开发项目过程中遇到非常多的样式与性能问题,在偶然的一次使用360软件管家搜索chr ...
- C 语言中的变量为什么不能以数字打头
C 语言中的变量为什么不能以数字打头? C 语言中的变量为什么不能以数字打头? 不要告诉我编译原理书上有.我暂时看不懂. 除了下面的解释外, “假如变量名允许以数字开头的话,那么语法分析器在解析一个全 ...
- IT第九天 - 包、访问修饰符、变量的内存分配、String类中常用方法
IT第九天 上午 包 1.包的命名规则:域名.项目名称.模块名 2.如:Wfei.com.windows.login 访问限制符 1.四种访问限制符分别对应为: (1)default:默认的,默认为p ...
- IOS7 适配以及向下兼容问题
1.所有的UIViewController加如下方法. - (void) viewDidLayoutSubviews { if ([[[UIDevice currentDevi ...
- Tomcat日志catalina.out文件过大的处理方法
原文地址:http://lcbk.net/tomcat/1396.html 我们知道一般企业使用Tomcat 作为Web端时,它产生的日志会越来越大,特别是catalina.out这个日志文件,然而有 ...
- Activity中Menu相关的几个方法的调用时机
用于创建菜单的常用的方法有如下两种: 1.onCreateOptionsMenu(Menu menu) 2.onPrepareOptionsMenu(Menu menu) MyDiaryActivit ...
- 【转】CentOS 6 服务器安全配置指南
原文连接: CentOS 6 服务器安全配置指南(通用) Linux 是一个开放式系统,可以在网络上找到许多现成的程序和工具,这既方便了用户,也方便了黑客,因为他们也能很容易地找到程序和工具来潜入 L ...
- Main方法的执行过程(转)
要运行一个 main 方法 , 首先要知道 main 方法所在的 Class, 在命令行中指定这个 Class 名 Class Lava{ Private int speed = 4; Void fl ...
- 数论(容斥原理)hdu-4509-The Boss on Mars
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4059 题目大意: 给一个n,求1~n中与n互质的数的4次方的总和. 解题思路: 容斥原理.逆元.公式 ...
- 基于visual Studio2013解决C语言竞赛题之0520相邻元素
题目