每个测试点(输入文件)有且仅有一组测试数据。

每组测试数据的第1行为一个整数N,意义如前文所述。

每组测试数据的第2行为N个整数,分别描述每种商品的重量,其中第i个整数表示标号为i的商品的重量Pi。

每组测试数据的第3行为一个整数Q,表示小Hi进行的操作数。

每组测试数据的第N+4~N+Q+3行,每行分别描述一次操作,每行的开头均为一个属于0或1的数字,分别表示该行描述一个询问和一次商品的价格的更改两种情况。对于第N+i+3行,如果该行描述一个询问,则接下来为两个整数Li, Ri,表示小Hi询问的一个区间[Li, Ri];如果该行描述一次商品的价格的更改,则接下来为三个整数Li,Ri,NewP,表示标号在区间[Li, Ri]的商品的价格全部修改为NewP。

对于100%的数据,满足N<=10^5,Q<=10^5, 1<=Li<=Ri<=N,1<=Pi<=N, 0<Pi, NewP<=10^4。

输出

对于每组测试数据,对于每个小Hi的询问,按照在输入中出现的顺序,各输出一行,表示查询的结果:标号在区间[Li, Ri]中的所有商品的价格之和。

样例输入

10
4733 6570 8363 7391 4511 1433 2281 187 5166 378
6
1 5 10 1577
1 1 7 3649
0 8 10
0 1 4
1 6 8 157
1 3 4 1557

样例输出

4731
14596

这里有点小优化,避免了讨论:

本来是   if(r<=Mid) change(now<<,l,r,val);
else if(l>Mid) change(now<<|,l,r,val);
else {
change(now<<,l,Mid,val);
change(now<<|,Mid+,r,val);
}
变成了   if(Mid>=l) change(now<<,l,r,val);
if(Mid<r) change(now<<|,l,r,val);

还有,询问函数里可以不update(now)?反正没加的时候AC了,加了也AC了,道理上应该要加才对啊。。。

虽然结构体的代码可能要长一点,但是看起来真的很舒服啊。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
const int maxn=;
using namespace std;
int a[maxn],n;
struct Node
{
int L,R,lazy,sum,cnt;
Node()
{
L=R=lazy=sum=cnt=;
}
};
struct Tree
{
Node node[maxn<<];
void build(int now,int l,int r)
{
node[now].L=l;
node[now].R=r;
node[now].lazy=;
if(l==r) {
node[now].cnt=;
return ;
}
int Mid=(l+r)>>;
build(now<<,l,Mid);
build(now<<|,Mid+,r);
node[now].cnt=node[now<<].cnt+node[now<<|].cnt;
}
void update(int now)
{
node[now].sum=node[now<<].sum+node[now<<|].sum;
}
void pushdown(int now)
{
node[now<<].lazy=node[now].lazy;
node[now<<].sum=node[now].lazy*node[now<<].cnt;
node[now<<|].lazy=node[now].lazy;
node[now<<|].sum=node[now].lazy*node[now<<|].cnt;
node[now].lazy=;
}
void insert(int now,int pos,int val)
{
if(node[now].L==node[now].R) {
node[now].sum=val;
return ;
}
int Mid=(node[now].L+node[now].R)>>;
if(pos<=Mid) insert(now<<,pos,val);
else insert(now<<|,pos,val);
update(now);
}
void change(int now,int l,int r,int val)
{
if(node[now].lazy) pushdown(now);
if(node[now].L>=l&&node[now].R<=r) {
node[now].lazy=val;
node[now].sum=node[now].cnt*node[now].lazy;
return ;
}
int Mid=(node[now].L+node[now].R)>>;
if(Mid>=l) change(now<<,l,r,val);
if(Mid<r) change(now<<|,l,r,val);
update(now);
return ;
}
int query(int now,int l,int r)
{ if(node[now].L>=l&&node[now].R<=r) return node[now].sum;
if(node[now].lazy) pushdown(now);
int Mid=(node[now].L+node[now].R)>>;
int s=;
if(Mid>=l) s+=query(now<<,l,r);
if(Mid<r) s+=query(now<<|,l,r);
return s;
}
};
Tree tree;
int main()
{
int x,l,r,q,i,opt;
scanf("%d",&n);
tree.build(,,n);
for(i=;i<=n;i++) {
scanf("%d",&a[i]);
tree.insert(,i,a[i]);
}
scanf("%d",&q);
while(q--){
scanf("%d",&opt);
if(opt==){
scanf("%d%d%d",&l,&r,&x);
tree.change(,l,r,x);
}
else {
scanf("%d%d",&l,&r);
printf("%d\n",tree.query(,l,r));
}
}
return ;
}

最新文章

  1. PostgreSQL介绍以及如何开发框架中使用PostgreSQL数据库
  2. 数据存储_FMDB数据库队列
  3. SpringMVC环境搭建 配置文件_3
  4. Math.Round函數
  5. pthread_cond_wait避免线程空转
  6. [转]Similarities between Hibernate and JDBC objects
  7. C/C++ union
  8. light oj 1116 - Ekka Dokka
  9. php如何获取本地手机号
  10. 移动端页面 iPhone + Safari 页面调试 之 正确查看网络请求的姿势
  11. C#Lambda表达式Aggregate的用法及内部运行方式的猜想
  12. poj 3273&quot;Monthly Expense&quot;(二分搜索+最小化最大值)
  13. HDU5117 Fluorescent 期望 计数 状压dp 动态规划
  14. 盒型图(boxplot)
  15. apply、call
  16. python连接mysql实例分享_python
  17. [转]Java.APK 反编译
  18. php官网下载的chm手册,源码字号太小的问题解决
  19. lua内存管理
  20. springboot自定义配置文件

热门文章

  1. MySQL数据库(4)_MySQL数据库外键约束、表查询
  2. Python进阶(2)_进程与线程的概念
  3. 异常:Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80070005.
  4. 对称加密,API加密
  5. iOS 视图控制器转场动画/页面切换效果/跳转动画 学习
  6. 转:C语言嵌入式系统编程之软件架构篇
  7. linux kernel内存回收机制
  8. point-to-point(点对点) 网口
  9. Android中设置自己软件的铃声+震动
  10. SpringCloud-分布式配置中心(config)