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

【题意】

【思路】

  • 把n个函数分成√n块,预处理出每块中各个点(n个)被块中函数(√n个)覆盖的次数
  • 查询时求前缀和,对于整块的分块求和,剩下右边不构成完整的一个块的树状数组求和
  • 预处理:计算每个块中,序列中的第i个点被块中函数覆盖的次数,求出每个块内前缀的和(O(n√n));对于每个点,更新树状数组(nlogn)
  • 单点修改:对于块状数组,因为已经知道了每个点被覆盖的次数,所以维护很简单(O(√n));对于树状数组,直接单点更新(O(logn));然后把a[pos]本身的值更新为x
  • 查询:计算前缀和,求x到y之间的函数和就是计算cal(y)-cal(x-1)。对于前缀和,对于整块的直接求和(O(√n)),对于最右边剩下的树状数组查询区间和(最多√n个函数,每个函数logn,所以复杂度为√nlogn)
  • 综上,时间复杂度为O(n√nlogn)
  • 注意要爆long long,1e5*1e5*1e9=1e19,long long 的最大值为9223372036854775807,9e18多一点

【Accepted】

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm> using namespace std;
typedef unsigned long long ull;
const int maxn=1e5+;
int n,m;
int a[maxn];
int belong[maxn];
int l[];
int r[];
ull sum[maxn];
ull tree[maxn];
int vis[][maxn];
struct Node
{
int l;
int r;
}q[maxn]; void init()
{
for(int i=;i<=n;i++)
{
tree[i]=0ull;
}
} int lowbit(int x)
{
return x&(-x);
}
void add(int k,int x)
{
while(k<=n)
{
tree[k]+=1ull*x;
k+=lowbit(k);
}
} ull query(int k)
{
ull res=0ull;
while(k)
{
res+=tree[k];
k-=lowbit(k);
}
return res;
}
ull query(int l,int r)
{
return query(r)-query(l-);
}
ull cal(int x)
{
if(x<)
{
return ;
}
int b=belong[x];
ull res=0ull;
for(int i=;i<b;i++)
{
res+=sum[i];
}
for(int i=l[b];i<=x;i++)
{
res+=query(q[i].l,q[i].r);
}
return res;
}
ull cal(int x,int y)
{
return cal(y)-cal(x-);
}
int main()
{
scanf("%d",&n);
init();
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
add(i,a[i]);
}
int block=sqrt(n);
for(int i=;i<=n;i++)
{
scanf("%d%d",&q[i].l,&q[i].r);
belong[i]=(i-)/block+;
}
int cnt=n/block;
if(n%block)
{
cnt++;
}
for(int i=;i<=cnt;i++)
{
l[i]=(i-)*block+;
r[i]=i*block;
}
r[cnt]=n;
for(int i=;i<=cnt;i++)
{
for(int k=l[i];k<=r[i];k++)
{
vis[i][q[k].l]++;
vis[i][q[k].r+]--;
}
for(int k=;k<=n;k++)
{
vis[i][k]+=vis[i][k-];
sum[i]+=1ull*vis[i][k]*a[k];
}
}
scanf("%d",&m);
while(m--)
{
int op;
scanf("%d",&op);
if(op==)
{
int pos,x;
scanf("%d%d",&pos,&x);
for(int i=;i<=cnt;i++)
{
sum[i]+=1ull*vis[i][pos]*(x-a[pos]);
}
add(pos,x-a[pos]);
a[pos]=x;
}
else
{
int x,y;
scanf("%d%d",&x,&y);
ull ans=cal(x,y);
printf("%llu\n",ans);
}
} return ;
}

分块+树状数组

【分块+树状数组】codechef November Challenge 2014 .Chef and Churu的更多相关文章

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

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

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

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

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

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

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

  5. CodeChef November Challenge 2014

    重点回忆下我觉得比较有意义的题目吧.水题就只贴代码了. Distinct Characters Subsequence 水. 代码: #include <cstdio> #include ...

  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响应号召,花了三小时 ...

随机推荐

  1. 机器学习概念之特征选择(Feature selection)之VectorSlicer算法介绍

    不多说,直接上干货! VectorSlicer 算法介绍: VectorSlicer是一个转换器,输入特征向量,输出原始特征向量子集.VectorSlicer接收带有特定索引的向量列,通过对这些索引的 ...

  2. 基于CentOS6.5下snort+barnyard2+base的入侵检测系统的搭建(图文详解)(博主推荐)

    为什么,要写这篇论文? 是因为,目前科研的我,正值研三,致力于网络安全.大数据.机器学习研究领域! 论文方向的需要,同时不局限于真实物理环境机器实验室的攻防环境.也不局限于真实物理机器环境实验室的大数 ...

  3. 浅析cookie

    基本概念:cookie是指web浏览器存储的少量数据,该数据会在每次请求一个相关的URL时自动传到服务器中. 以博客园为例,我们看看cookie有哪些属性:  1.Name:cookie的名称: 2. ...

  4. redis过期事件

    背景:目前在商城项目,订单有过期逻辑,小伙伴提议用redis做,经讨论分析,redis有key的过期事件,貌似可以实现,但是咨询大神,好像不建议这样用,可能会丢数据 随便写了段python代码测试 i ...

  5. sed.exe 在bat中使用时,需要另外起一个文件

    今天在windows使用sed.exe时,同一个文件死活不生效,然后换了一个bat,再来调用,就可以了,怀疑跟sed.exe的代码有关.有时间再研究

  6. fetch和axios区别,proxy代理配置

    1.今天使用fetch调用接口时使用console.log(res.data)始终是undefined,使用anxios请求则可以成功请求到数据,非常奇怪,于是查了一圈,才搞明白是我自以为了,哎,浪费 ...

  7. Entity Framework + MySQL 使用笔记

    添加: using (var edm = new NorthwindEntities()) { Customers c = ", Region = "天府广场", Con ...

  8. Java练习题02

    问题: 编程求一个整数数组的最大值.最小值.平均值和所有元素的和. 代码: public class Page99{     public static void main(String args[] ...

  9. 在2015年 开发一个 Web App 必须了解的那些事

    在过去的一年里,我在从头开始开发我的第一个重要的Web应用.经验教会了很多以前不知道的东西,特别是在安全性和用户体验方面. 值得一提的是,我上一次尝试构建的任何合理复杂性是在2005年.所以,在安全防 ...

  10. Dockerfile 中的 CMD和ENTRYPOINT 两兄弟

    CMD 先说老大 CMD 当一个容器准备好运行之后,需要找一个指定命令来创建一个初始进程并运行. 一,/bin/sh -c 因为某种意义上一个Dockerfile其实可以理解是一个简化版bash 脚本 ...