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 (线段树 区间更新)的更多相关文章

  1. poj 3468 线段树区间更新/查询

    Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. On ...

  2. HDU 3577 Fast Arrangement (线段树区间更新)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3577 题意不好理解,给你数字k表示这里车最多同时坐k个人,然后有q个询问,每个询问是每个人的上车和下车 ...

  3. HDU 4902 Nice boat --线段树(区间更新)

    题意:给一个数字序列,第一类操作是将[l,r]内的数全赋为x ,第二类操作是将[l,r]中大于x的数赋为该数与x的gcd,若干操作后输出整个序列. 解法: 本题线段树要维护的最重要的东西就是一个区间内 ...

  4. POJ 3468 (线段树 区间增减) A Simple Problem with Integers

    这题WA了好久,一直以为是lld和I64d的问题,后来发现是自己的pushdown函数写错了,说到底还是因为自己对线段树理解得不好. 因为是懒惰标记,所以只有在区间分开的时候才会将标记往下传递.更新和 ...

  5. POJ 3225 线段树区间更新(两种更新方式)

    http://blog.csdn.net/niuox/article/details/9664487 这道题明显是线段树,根据题意可以知道: (用0和1表示是否包含区间,-1表示该区间内既有包含又有不 ...

  6. POJ 3468 线段树区间修改查询(Java,c++实现)

    POJ 3468 (Java,c++实现) Java import java.io.*; import java.util.*; public class Main { static int n, m ...

  7. 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 ...

  8. POJ - 3468 线段树区间修改,区间求和

    由于是区间求和,因此我们在更新某个节点的时候,需要往上更新节点信息,也就有了tree[root].val=tree[L(root)].val+tree[R(root)].val; 但是我们为了把懒标记 ...

  9. POJ 3225 (线段树 区间更新) Help with Intervals

    这道题搞了好久,其实坑点挺多.. 网上找了许多题解,发现思路其实都差不多,所以就不在重复了. 推荐一篇比较好的题解,请戳这. 另外,如果因为可能要更新多次,但最终查询只需要一次,所以没有写pushup ...

随机推荐

  1. spring boot 的服务监控

  2. C# Excel导数据

    遇到的几个坑,记录一下. 隐藏表,隐藏行,隐藏列, 单元格合并 => 拆分并填充内容, 显示隐藏列,结果那个列 还是不显示出来,拖动旁边的列也不显示. 结果在旁边的列上,按左右箭头键就出来了,也 ...

  3. 吴裕雄 01-mysql管理

    SHOW DATABASES; update user set authentication_string = password("123456") where user='roo ...

  4. Ubuntu中清理Network下Connect to Server的入口

    转自:http://blog.csdn.net/maxilbert/article/details/51126467 connect to server入口列表文件以xml格式存放在 ~/.confi ...

  5. js 提示条

    js: var Persen = { timeUptopBar:function(fun) { var obj = $('.top-alert'); obj.fadeOut(1500,function ...

  6. linux配置虚拟主机

    linux 下怎么配置虚拟主机 linux 下怎么配置虚拟主机,在网上找到N个资料都是高手们随便说几句,都没怎么说清楚.问题:  我把域名(bs.jxiop.com)指向了 68.10.140.10 ...

  7. Centos7 安装 erlang rabbitmq

    1.安装Erlang依赖采用官网的rpm包的形式进行安装,不采用yum(由系统进行自动安装 可能因为版本低的问题而出现一系列问题) erlang依赖 rpm包下载地址https://github.co ...

  8. encodeURI & encodeURIComponent

    [encodeURI & encodeURIComponent]  区别在于,"&", "+", 和 "=" 不会被enco ...

  9. Mybatis返回List<Map<K,V>>

    最终映射的字段名 会被作为 hashMap 的 key , <!-- TODO 测试返回 HashMap--> <resultMap id="testResultMap&q ...

  10. python全栈开发 随笔 'is' 和 == 的比较知识与区别 编码和解码的内容及转换

    python 一. is 和 == 的区别; == 比较的是两边的值. a = 'alex' b = 'alex' print(a = b) #True a = 10 b = 10 print(a = ...