hdu 1698+poj 3468 (线段树 区间更新)
http://acm.hdu.edu.cn/showproblem.php?pid=1698
这个题意翻译起来有点猥琐啊,还是和谐一点吧
和涂颜色差不多,区间初始都为1,然后操作都是将x到y改为z,注意 是改为z,不是加或减,最后输出区间总值
也是线段树加lazy操作
#include<cstdio>
using namespace std;
struct point {
int l,r;
int val,sum;
};
point tree[];
void build(int i,int left,int right)
{
tree[i].l=left,tree[i].r=right;
tree[i].val=;
if (left==right) {tree[i].sum=;return;}
int mid=(left+right)/;
build(i*,left,mid);
build(i*+,mid+,right);
tree[i].sum=tree[i*].sum+tree[i*+].sum;
}
int update(int i,int left,int right,int val)
{
if (right==tree[i].r&&left==tree[i].l)
{
tree[i].val=val;
return tree[i].sum=(right-left+)*val;
}
if (tree[i].val)
{
tree[i*].val=tree[i*+].val=tree[i].val;
tree[i*].sum=(tree[i*].r-tree[i*].l+)*tree[i].val;
tree[i*+].sum=(tree[i*+].r-tree[i*+].l+)*tree[i].val;
tree[i].val=;
}
int mid=(tree[i].r+tree[i].l)/;
if (left>mid) return tree[i].sum=update(i*+,left,right,val)+tree[i*].sum;
else if (right<=mid) return tree[i].sum=update(i*,left,right,val)+tree[i*+].sum;
else return tree[i].sum=update(i*+,mid+,right,val)+update(i*,left,mid,val);
}
int main()
{
int t,n,m,x,y,z,sum;
while (~scanf("%d",&t))
{
sum=;
while (t--)
{
scanf("%d %d",&n,&m);
build(,,n);
while (m--)
{
scanf("%d %d %d",&x,&y,&z);
update(,x,y,z);
}
printf("Case %d: The total value of the hook is %d.\n",sum++,tree[].sum);
}
}
return ;
}
http://poj.org/problem?id=3468
这个和上面一样,只是变成了加上z,所以就变成了在原有的值上再加,+=,改改就行,数值比较大,应该用int64
#include<cstdio>
#define ll __int64
using namespace std;
struct point {
ll l,r;
ll val,sum;
};
point tree[];
ll num[];
void build(ll i,ll left,ll right)
{
tree[i].l=left,tree[i].r=right;
tree[i].val=;
if (left==right) {tree[i].sum=num[left];return;}
int mid=(left+right)/;
build(i*,left,mid);
build(i*+,mid+,right);
tree[i].sum=tree[i*].sum+tree[i*+].sum;
}
ll update(ll i,ll left,ll right,ll val)
{
if (right==tree[i].r&&left==tree[i].l)
{
tree[i].val+=val;
return tree[i].sum+=(right-left+)*val;
}
if (tree[i].val)
{
tree[i*].val+=tree[i].val;
tree[i*+].val+=tree[i].val;
tree[i*].sum+=(tree[i*].r-tree[i*].l+)*tree[i].val;
tree[i*+].sum+=(tree[i*+].r-tree[i*+].l+)*tree[i].val;
tree[i].val=;
}
int mid=(tree[i].r+tree[i].l)/;
if (left>mid) return tree[i].sum=update(i*+,left,right,val)+tree[i*].sum;
else if (right<=mid) return tree[i].sum=update(i*,left,right,val)+tree[i*+].sum;
else return tree[i].sum=update(i*+,mid+,right,val)+update(i*,left,mid,val);
}
ll find(ll i,ll left,ll right)
{
if (left>tree[i].r&&right<tree[i].l) return ;
if (tree[i].l==left&&tree[i].r==right) return tree[i].sum;
if (tree[i].val)
{
tree[i*].val+=tree[i].val;
tree[i*+].val+=tree[i].val;
tree[i*].sum+=(tree[i*].r-tree[i*].l+)*tree[i].val;
tree[i*+].sum+=(tree[i*+].r-tree[i*+].l+)*tree[i].val;
tree[i].val=;
}
ll mid=(tree[i].r+tree[i].l)/;
if (left>mid) return find(i*+,left,right);
else if (right<=mid) return find(i*,left,right);
else return find(i*,left,mid)+find(i*+,mid+,right);
}
int main()
{
ll n,m,i,z,x,y;
char op;
while (~scanf("%I64d %I64d",&n,&m))
{
for (i=;i<=n;i++)
scanf("%I64d",&num[i]);
build(,,n);
while (m--)
{
scanf(" %c",&op);
if (op=='C')
{
scanf("%I64d %I64d %I64d",&x,&y,&z);
update(,x,y,z);
}
else
{
scanf("%I64d %I64d",&x,&y);
printf("%I64d\n",find(,x,y));
}
}
}
return ;
}
hdu 1698+poj 3468 (线段树 区间更新)的更多相关文章
- poj 3468 线段树区间更新/查询
Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. On ...
- HDU 3577 Fast Arrangement (线段树区间更新)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3577 题意不好理解,给你数字k表示这里车最多同时坐k个人,然后有q个询问,每个询问是每个人的上车和下车 ...
- HDU 4902 Nice boat --线段树(区间更新)
题意:给一个数字序列,第一类操作是将[l,r]内的数全赋为x ,第二类操作是将[l,r]中大于x的数赋为该数与x的gcd,若干操作后输出整个序列. 解法: 本题线段树要维护的最重要的东西就是一个区间内 ...
- POJ 3468 (线段树 区间增减) A Simple Problem with Integers
这题WA了好久,一直以为是lld和I64d的问题,后来发现是自己的pushdown函数写错了,说到底还是因为自己对线段树理解得不好. 因为是懒惰标记,所以只有在区间分开的时候才会将标记往下传递.更新和 ...
- POJ 3225 线段树区间更新(两种更新方式)
http://blog.csdn.net/niuox/article/details/9664487 这道题明显是线段树,根据题意可以知道: (用0和1表示是否包含区间,-1表示该区间内既有包含又有不 ...
- POJ 3468 线段树区间修改查询(Java,c++实现)
POJ 3468 (Java,c++实现) Java import java.io.*; import java.util.*; public class Main { static int n, m ...
- hdu 3397 Sequence operation 线段树 区间更新 区间合并
题意: 5种操作,所有数字都为0或1 0 a b:将[a,b]置0 1 a b:将[a,b]置1 2 a b:[a,b]中的0和1互换 3 a b:查询[a,b]中的1的数量 4 a b:查询[a,b ...
- POJ - 3468 线段树区间修改,区间求和
由于是区间求和,因此我们在更新某个节点的时候,需要往上更新节点信息,也就有了tree[root].val=tree[L(root)].val+tree[R(root)].val; 但是我们为了把懒标记 ...
- POJ 3225 (线段树 区间更新) Help with Intervals
这道题搞了好久,其实坑点挺多.. 网上找了许多题解,发现思路其实都差不多,所以就不在重复了. 推荐一篇比较好的题解,请戳这. 另外,如果因为可能要更新多次,但最终查询只需要一次,所以没有写pushup ...
随机推荐
- spring boot 的服务监控
- C# Excel导数据
遇到的几个坑,记录一下. 隐藏表,隐藏行,隐藏列, 单元格合并 => 拆分并填充内容, 显示隐藏列,结果那个列 还是不显示出来,拖动旁边的列也不显示. 结果在旁边的列上,按左右箭头键就出来了,也 ...
- 吴裕雄 01-mysql管理
SHOW DATABASES; update user set authentication_string = password("123456") where user='roo ...
- Ubuntu中清理Network下Connect to Server的入口
转自:http://blog.csdn.net/maxilbert/article/details/51126467 connect to server入口列表文件以xml格式存放在 ~/.confi ...
- js 提示条
js: var Persen = { timeUptopBar:function(fun) { var obj = $('.top-alert'); obj.fadeOut(1500,function ...
- linux配置虚拟主机
linux 下怎么配置虚拟主机 linux 下怎么配置虚拟主机,在网上找到N个资料都是高手们随便说几句,都没怎么说清楚.问题: 我把域名(bs.jxiop.com)指向了 68.10.140.10 ...
- Centos7 安装 erlang rabbitmq
1.安装Erlang依赖采用官网的rpm包的形式进行安装,不采用yum(由系统进行自动安装 可能因为版本低的问题而出现一系列问题) erlang依赖 rpm包下载地址https://github.co ...
- encodeURI & encodeURIComponent
[encodeURI & encodeURIComponent] 区别在于,"&", "+", 和 "=" 不会被enco ...
- Mybatis返回List<Map<K,V>>
最终映射的字段名 会被作为 hashMap 的 key , <!-- TODO 测试返回 HashMap--> <resultMap id="testResultMap&q ...
- python全栈开发 随笔 'is' 和 == 的比较知识与区别 编码和解码的内容及转换
python 一. is 和 == 的区别; == 比较的是两边的值. a = 'alex' b = 'alex' print(a = b) #True a = 10 b = 10 print(a = ...