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. js对象和jquery对象互相转换

    javascript对象转成jquery对象 jquery对象转成javascript对象

  2. BOS物流项目第十三天

    教学计划 1.Quartz概述 a. Quartz介绍和下载 b. 入门案例 c. Quartz执行流程 d. cron表达式 2.在BOS项目中使用Quartz创建定时任务 3.在BOS项目中使用J ...

  3. vue -- 九宫格抽奖

    html: <div class="line_item" :class="index == 1 ? 'active' : 'white_item'"> ...

  4. IE 兼容background-size

    1:修改src *background-size: cover;//兼容ie的background-size filter: progid:DXImageTransform.Microsoft.Alp ...

  5. Android Studio SVN配置

    一 . 原文链接:忽略文件[转]    https://blog.csdn.net/buaaroid/article/details/51546521 1.用Android Studio创建一个项目, ...

  6. 使用idea+gradle建立SSM项目

    目录: 一.创建一个gradle项目   二 .在gradle中创建SSM项目 一 .创建一个gradle项目 第一步: 打开我们的IDEA工具,选择创建一个新项目 第二步:这里会让你选择创建一个什么 ...

  7. Aptana在Eclipse的安装

    1.下载 com.aptana.rcp.product-3.4.2.zip文件 https://pan.baidu.com/s/1sl81Vit 2.安装 接着Next.直到成功 3.怎么判定安装成功 ...

  8. VMware Ubuntu安装

    不是每一个程序员都必须玩过linux,只是博主觉得现在的很多服务器都是linux系统的,而自己属于那种前端也搞,后台也搞,对框架搭建也感兴趣,但是很多生产上的框架和工具都是安装在服务器上的,而且有不少 ...

  9. Oracle 11g 静默安装-db_install.rsp详解

    转自--------------https://blog.csdn.net/jameshadoop/article/details/48086933 :db_install.rsp详解 ####### ...

  10. APIcloud制作APP 微信支付与支付宝支付

    首先要在云端绑定相应模块如alipay和wxpay其次编写代码. 配置区域 var cfg = { webName:'',//APP名字 payDebug:true, isUseWxPay:true, ...