题目描述

  有一个长度为\(n\)的数组\(A\)和\(n\)个区间\([l_i,r_i]\),有\(q\)次操作:

   \(1~x~y\):把\(a_x\)改成\(y\)

   \(2~x~y\):求第\(l\)个区间到第\(r\)个区间的区间和的和。

  \(n,q\leq {10}^5,a_i\leq {10}^9\)

题解

  分块。

  设\(s_i\)为第\(i\)块的所有区间的区间和,\(d_{i,j}\)为第\(i\)块有多少个区间包含了\(j\)这个位置。

  修改时修改树状数组和每个区间的区间和。设当前\(a_x=v\),则\(s_i+=(y-v)\times d_{i,x}\)

  查询时完整的区间直接查询区间和,不完整的区间就暴力查询。

  设块大小为\(m\),时间复杂度为
\[ T(n)=O(\frac{n}{m}+m\log n) \]
  当\(m=\sqrt{\frac{n}{\log n}}\)时
\[ T(n)_{\min}=O(n\sqrt{n\log n}) \]

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<ctime>
#include<utility>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
ull c[100010];
int a[100010];
int n;
void add(int x,ull v)
{for(;x<=n;x+=x&-x)c[x]+=v;
}
ull sum(int x)
{ull s=0;for(;x;x-=x&-x)s+=c[x];return s;
}
int bl;
ull s[1010];
int d[1010][100010];
int l[100010];
int r[100010];
int block[100010];
int left[100010];
int right[100010];
int main()
{memset(c,0,sizeof c);
//  freopen("xsy2111.in","r",stdin);
//  freopen("xsy2111.out","w",stdout);int m;scanf("%d",&n);int i;for(i=1;i<=n;i++){scanf("%d",&a[i]);add(i,a[i]);}bl=100;m=(n+bl-1)/bl;for(i=1;i<=n;i++)block[i]=(i+bl-1)/bl;for(i=1;i<=m;i++){left[i]=(i-1)*bl+1;right[i]=min(i*bl,n);}for(i=1;i<=n;i++){scanf("%d%d",&l[i],&r[i]);s[block[i]]+=sum(r[i])-sum(l[i]-1);d[block[i]][l[i]]++;if(r[i]<n)d[block[i]][r[i]+1]--;}int j;for(i=1;i<=m;i++)for(j=2;j<=n;j++)d[i][j]+=d[i][j-1];int q;scanf("%d",&q);int op,x,y,k;for(i=1;i<=q;i++){scanf("%d%d%d",&op,&x,&y);if(op==1){int v=a[x];for(j=1;j<=m;j++)s[j]+=ull(y-v)*d[j][x];add(x,y-v);a[x]=y;}else{ull ans=0;for(j=block[x];j<=block[y];j++)if(left[j]>=x&&right[j]<=y)ans+=s[j];else{int mi=max(left[j],x);int mx=min(right[j],y);for(k=mi;k<=mx;k++)ans+=sum(r[k])-sum(l[k]-1);}printf("%llu\n",ans);}}return 0;
}

转载于:https://www.cnblogs.com/ywwyww/p/8511326.html

【XSY2111】Chef and Churus 分块 树状数组相关推荐

  1. 【bzoj3744】Gty的妹子序列 分块+树状数组+主席树

    题目描述 我早已习惯你不在身边, 人间四月天 寂寞断了弦. 回望身后蓝天, 跟再见说再见-- 某天,蒟蒻Autumn发现了从 Gty的妹子树(bzoj3720) 上掉落下来了许多妹子,他发现 她们排成 ...

  2. 牛客小白月赛12 F 华华开始学信息学 (分块+树状数组)

    链接:https://ac.nowcoder.com/acm/contest/392/F 来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 32768K,其他语言65536 ...

  3. bzoj 4765: 普通计算姬(分块+树状数组)

    4765: 普通计算姬 Time Limit: 30 Sec  Memory Limit: 256 MB Submit: 1481  Solved: 318 [Submit][Status][Disc ...

  4. 【BZOJ4889】[Tjoi2017]不勤劳的图书管理员 分块+树状数组

    [BZOJ4889][Tjoi2017]不勤劳的图书管理员 题目描述 加里敦大学有个帝国图书馆,小豆是图书馆阅览室的一个书籍管理员.他的任务是把书排成有序的,所以无序的书让他产生厌烦,两本乱序的书会让 ...

  5. [BZOJ4889][洛谷P3759][TJOI2017]不勤劳的图书管理员 分块+树状数组

    题目描述 加里敦大学有个帝国图书馆,小豆是图书馆阅览室的一个书籍管理员.他的任务是把书排成有序的,所以无序的书让他产生厌烦,两本乱序的书会让小豆产生这两本书页数的和的厌烦度.现在有n本被打乱顺序的书, ...

  6. [队内测试Day10.12]贪心+状压+分块+树状数组

    T1 codevs2169零用钱 正解贪心. 在使用钞票最少前提下保证浪费的钱数最少 保证第一条,在还没达到规定钱数时尽可能使用大面值钞票 保证第二条,在现有钞票不满足要求前提下,尽量选面值小的放 综 ...

  7. BZOJ 2141 排队(块套树,分块,树状数组)【BZOJ修复工程】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2141 是 hydro 的 BZOJ ...

  8. HDU多校1 - 6959 zoto(莫队+树状数组/值域分块)

    题目链接:点击查看 题目大意:在二维平面内有 nnn 个点,表示为 (i,f[i])(i,f[i])(i,f[i]),需要回答 mmm 次询问,每次询问会给出一个矩形,问矩形内有多少个不同的 yyy ...

  9. HDU多校1 - 6756 Finding a MEX(分块+二分+树状数组)

    题目链接:点击查看 题目大意:给出一个 n 个点和 m 条边的无向图,每个点都有一个权值,现在需要执行 q 次操作,每次操作分为两种类型: 1 pos val :将第 pos 个点的权值修改为 val ...

最新文章

  1. 一场由金山词霸引起的车祸 Process finished with exit code -1073741819 (0xC0000005)
  2. 组件赋值——@Value  ---@PropertySource(value={“classpath:/person.properties“})
  3. Python Generators(生成器)——yield关键字
  4. 图像处理(一)图像变形(1)矩形全景图像还原-Siggraph 2014
  5. C语言字符串字母移位
  6. WCF双向通讯netTCP
  7. 人工神经网络之激活函数 -RELU函数
  8. c语言stm32串口控制单片机,实用STM32的串口控制平台的实现
  9. php issign为false,支付宝接口集成及错误排除
  10. 你越努力,越没有领导潜力
  11. 移动端切图内容包括什么_ios移动端切图及前端规范
  12. [JZOJ3293] 【SHTSC2013】阶乘字符串
  13. 1.6 logistic回归的keras实现
  14. 【408考研】数据结构 —— 第一章 绪论
  15. html5注册页面样式,HTML5一款小清新风格的登录/注册表单界面模板
  16. 方波峰峰值和有效值_峰峰值,峰值,平均值,有效值的关系
  17. 祖师爷获新认可!图灵成为 50 英镑新钞人物
  18. QQ三国七旗阵等级怎么计算?(附Excel计算器,输入队员等级即可计算)
  19. Android Studio 全局搜索快捷键
  20. ps如何做出动态火焰燃烧效果

热门文章

  1. 滚动的组件_微信小程序开发实战(11):滚动组件(picker)
  2. 什么推动当今品牌的忠诚度
  3. python pickle模块:数据序列化和反序列化
  4. 玩转Linux必备知识(一)
  5. 使用sklearn加载公共数据集、内存数据与CSV文件
  6. Scala入门到精通——第二十七节 Scala操纵XML
  7. Cacheable注解使用详解
  8. javaweb学习总结(二十二):基于Servlet+JSP+JavaBean开发模式的用户登录注册
  9. 使用go来实现类似erlang otp里面的gen_server功能
  10. [转载]Linux下getopt()函数的简单使用