题目:https://www.codechef.com/problems/FNCS

题解:

  我们知道要求区间和的时候,我们用前缀和去优化。这里也是一样,我们要求第 l 个函数到第 r 个函数 [l, r] 的函数和,那么我们可以用 sum[r] - sum[l-1] 来求得。

  由于这个数据量有点大,所以我们将函数分块。

  例如样例:

    1 3    有5个函数,那么我们分成3块。{ [1 3] , [2 5] }, { [4 5], [3 5] }, { [1 2] }。每一块对应都有一个sum ,这时如果我们要求前3个函数的和,就可以 (第一块的sum + 第3个函数的和)
    2 5    在一个块内暴力的复杂度是O(sqrt(n))
    4 5
    3 5    还有就是在处理块内函数总sum 记录下每一个a[i] 对应的权值。比如在第一块中 1 2 2 1 1 分别是a1~a5对这一块sum 的贡献。 
    1 2

  更新的时候就维护一下就可以了

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
#include <stack>
#include <set>
using namespace std;
typedef long long LL;
typedef unsigned long long uLL;
#define ms(a, b) memset(a, b, sizeof(a))
#define pb push_back
#define mp make_pair
const LL INF = 0x7fffffff;
const int inf = 0x3f3f3f3f;
const int mod = 1e9+;
const int maxn = +;
const int maxm = +;
int a[maxn], l[maxn], r[maxn], Add[maxn];
int unit, num, n;
int cnt[][maxn];//记录在第i块,j值的权
uLL sum[];//块的sum
uLL BIT_SUM[maxn];
int low_bit(int x)
{
return x&-x;
}
uLL BIT_sum(int x)
{
uLL ret = ;
while(x>){
ret += 1uLL*BIT_SUM[x]; x -= low_bit(x);
}
return ret;
}
void add(int x, int d)
{
while(x<=n){
BIT_SUM[x] += d; x+=low_bit(x);
}
}
uLL query(int x)
{
return 1uLL*BIT_sum(x);
}
uLL Query(int x)
{
int end_unit = x/unit + ;
LL ans = ;
for(int i = ;i<end_unit;i++)
ans += sum[i];
for(int i = (end_unit-)*unit+;i<=x;i++)
ans += query(r[i]) - query(l[i]-);
return ans;
}
void init()
{
ms(BIT_SUM, );
ms(sum, );
ms(cnt, );
}
int main() {
#ifdef LOCAL
freopen("input.txt", "r", stdin);
// freopen("output.txt", "w", stdout);
#endif
// ios::sync_with_stdio(0);
// cin.tie(0);
init();
scanf("%d", &n);
for(int i = ;i<=n;i++){
scanf("%d", &a[i]);
add(i, a[i]);
}
for(int i = ;i<=n;i++) scanf("%d%d", &l[i], &r[i]);
unit = (int)sqrt(n);//块的大小
num = (n-)/unit+;//块的数量
for(int i = ;i<=num;i++){
int begin_f = (i-)*unit+;//这一块的开始函数
int end_f = begin_f + unit - ;//结束函数
ms(Add,);
for(int j = begin_f;j<=end_f&&j<=n;j++){
Add[l[j]]++;Add[r[j]+]--;
}
int add = ;
for(int j = ;j<=n;j++){
add += Add[j];
cnt[i][j] += add;
}
for(int j = ;j<=n;j++)
sum[i] += 1uLL * a[j] * cnt[i][j];
// for(int j = 1;j<=n;j++)
// cout << cnt[i][j] <<" ";cout << endl;
// cout << sum[i] << endl;
}
int q;scanf("%d", &q);
while(q--){
int op;scanf("%d", &op);
if(op==){
int x, y;scanf("%d%d", &x, &y);
for(int i = ;i<=num;i++)
sum[i] -= 1uLL * a[x] * cnt[i][x];
add(x, y-a[x]);
a[x] = y;
for(int i = ;i<=num;i++)
sum[i] += 1uLL * a[x] * cnt[i][x];
}else{
int x, y;
scanf("%d%d", &x, &y);
uLL ans = Query(y) - Query(x-);
printf("%llu\n", ans);
}
}
return ;
}

CodeChef FNCS (分块+树状数组)的更多相关文章

  1. 【分块+树状数组】codechef November Challenge 2014 .Chef and Churu

    https://www.codechef.com/problems/FNCS [题意] [思路] 把n个函数分成√n块,预处理出每块中各个点(n个)被块中函数(√n个)覆盖的次数 查询时求前缀和,对于 ...

  2. 【BZOJ 3295】动态逆序对 - 分块+树状数组

    题目描述 给定一个1~n的序列,然后m次删除元素,每次删除之前询问逆序对的个数. 分析:分块+树状数组 (PS:本题的CDQ分治解法见下一篇) 首先将序列分成T块,每一块开一个树状数组,并且先把最初的 ...

  3. 【bzoj2141】排队 分块+树状数组

    题目描述 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家乐和和.红星幼儿园的小朋友们排起了长长地队伍,准备吃果果.不过因为小朋友们的身高有所区别, ...

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

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

  5. 【xsy2111】 【CODECHEF】Chef and Churus 分块+树状数组

    题目大意:给你一个长度为$n$的数列$a_i$,定义$f_i=\sum_{j=l_i}^{r_i} num_j$. 有$m$个操作: 操作1:询问一个区间$l,r$请你求出$\sum_{i=l}^{r ...

  6. Bzoj 3295: [Cqoi2011]动态逆序对 分块,树状数组,逆序对

    3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2886  Solved: 924[Submit][Stat ...

  7. 【XSY2111】Chef and Churus 分块 树状数组

    题目描述 有一个长度为\(n\)的数组\(A\)和\(n\)个区间\([l_i,r_i]\),有\(q\)次操作: \(1~x~y\):把\(a_x\)改成\(y\) \(2~x~y\):求第\(l\ ...

  8. BZOJ3787:Gty的文艺妹子序列(分块,树状数组)

    Description Autumn终于会求区间逆序对了!Bakser神犇决定再考验一下他,他说道: “在Gty的妹子序列里,某个妹子的美丽度可也是会变化的呢.你还能求出某个区间中妹子们美丽度的逆序对 ...

  9. 2018.06.30 BZOJ4765: 普通计算姬(dfs序+分块+树状数组)

    4765: 普通计算姬 Time Limit: 30 Sec Memory Limit: 256 MB Description "奋战三星期,造台计算机".小G响应号召,花了三小时 ...

  10. [P3759][TJOI2017]不勤劳的图书管理员(分块+树状数组)

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

随机推荐

  1. TensorFlow学习笔记8-深度学习的正则化

    深度学习的正则化 回顾一些基本概念 概念 描述 设计矩阵 数据集在特征向量上的表示 训练误差 学习到的模型与训练集标签之间的误差 泛化误差(测试误差) 学习到的模型与测试集之间的误差 欠拟合 模型的训 ...

  2. jenkins无法显示html样式问题解决

    利用jenkins的以下两个插件可以巧妙解决这个问题 Startup Trigger: 可实现在Jenkins节点(master/slave)启动时触发构建: Groovy plugin: 可实现直接 ...

  3. Java中获取大小:length、length()、size()

    1. java 中的 length 属性是针对数组说的,比如说你声明了一个数组,想知道这个数组的长度则用到了 length 这个属性. 2. java 中的 length() 方法是针对字符串说的,如 ...

  4. 第九届蓝桥杯A组第三题: 乘积尾零

    标题:乘积尾零如下的10行数据,每行有10个整数,请你求出它们的乘积的末尾有多少个零?5650 4542 3554 473 946 4114 3871 9073 90 4329 2758 7949 6 ...

  5. Visual Studio 2017打包安装项目

    在我们用VS编好上位机后,就可以在自己电脑运行上位机,但是想其他人电脑运行上位机可能就行不通了,因为其他人电脑不一定有所需要的运行环境.这时我们就需要打包安装,把运行软件所需要的环境都打包在安装包里. ...

  6. 浏览器是怎样工作的:渲染引擎,HTML解析(连载二)

    转载自:http://ued.ctrip.com/blog/how-browsers-work-rendering-engine-html-parsing-series-ii.html 渲染引擎 渲染 ...

  7. spark cli

    Spark SQL CLI Spark1.1增加了Spark SQL CLI和ThriftServer SparkSQL CLI配置 1.创建并配置hive-site.xml 在运行Spark SQL ...

  8. 初入vue.js(1)

    本文章属于个人在学习vue的随笔,留作与大家分享,技术交流之用,如果有错误,请大家多多指正.谢谢 首先说一下vue的使用方式: vue的使用方式一共有两种,第一种是直接在官网上下载vue.js的文件, ...

  9. 实现单选框点击label标记中的文字也能选中

    实例: <label for="man"> <input type="radio" value="男" name=&quo ...

  10. typescript总结

    1,基础类型 {   布尔值,let isDone:Boolean=true;   数字,let decLiteral:number=true;   字符串,let name:string=" ...