【分块+树状数组】codechef November Challenge 2014 .Chef and Churu
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的更多相关文章
- 【BZOJ 3295】动态逆序对 - 分块+树状数组
题目描述 给定一个1~n的序列,然后m次删除元素,每次删除之前询问逆序对的个数. 分析:分块+树状数组 (PS:本题的CDQ分治解法见下一篇) 首先将序列分成T块,每一块开一个树状数组,并且先把最初的 ...
- 【bzoj2141】排队 分块+树状数组
题目描述 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家乐和和.红星幼儿园的小朋友们排起了长长地队伍,准备吃果果.不过因为小朋友们的身高有所区别, ...
- 【bzoj3744】Gty的妹子序列 分块+树状数组+主席树
题目描述 我早已习惯你不在身边, 人间四月天 寂寞断了弦. 回望身后蓝天, 跟再见说再见…… 某天,蒟蒻Autumn发现了从 Gty的妹子树(bzoj3720) 上掉落下来了许多妹子,他发现 她们排成 ...
- 【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 ...
- CodeChef November Challenge 2014
重点回忆下我觉得比较有意义的题目吧.水题就只贴代码了. Distinct Characters Subsequence 水. 代码: #include <cstdio> #include ...
- Bzoj 3295: [Cqoi2011]动态逆序对 分块,树状数组,逆序对
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2886 Solved: 924[Submit][Stat ...
- 【XSY2111】Chef and Churus 分块 树状数组
题目描述 有一个长度为\(n\)的数组\(A\)和\(n\)个区间\([l_i,r_i]\),有\(q\)次操作: \(1~x~y\):把\(a_x\)改成\(y\) \(2~x~y\):求第\(l\ ...
- BZOJ3787:Gty的文艺妹子序列(分块,树状数组)
Description Autumn终于会求区间逆序对了!Bakser神犇决定再考验一下他,他说道: “在Gty的妹子序列里,某个妹子的美丽度可也是会变化的呢.你还能求出某个区间中妹子们美丽度的逆序对 ...
- 2018.06.30 BZOJ4765: 普通计算姬(dfs序+分块+树状数组)
4765: 普通计算姬 Time Limit: 30 Sec Memory Limit: 256 MB Description "奋战三星期,造台计算机".小G响应号召,花了三小时 ...
随机推荐
- postman断言分析
最近测试中用到postman,使用后就简单总结下常用的断言,下面带图的自己最常用的,其他的没怎么用. postman断言是JavaScript语言编写的,在postman客户端指定区域编写即可. 断言 ...
- Bootstrap中的datetimepicker浅谈
从古至今,人们都习惯用某个时间来标记某个事件的发生.我们在写管理后台的时候,重中之中也是这个时间的设置.在问题出现的时候,我们是查看日志的时候,就可以根据这个时间段来查找这个问题出现点. 在使用时间控 ...
- 关于Control.Dispatcher.BeginInvoke卡界面
Control.Dispatcher.BeginInvoke里的逻辑由UI线程执行,如果内部包含耗时操作就会造成界面卡住. Action.BeginInvoke里的逻辑,将在一个新开的线程中执行,而不 ...
- 014、BOM与DOM对象的应用
Screen屏幕对象 Width:屏幕的宽度 Height:屏幕的高度 availWidth:屏幕的有效宽度(不含任务栏) availHeight:屏幕的有效高度(不含任务栏) colorDepth: ...
- cacti支持中文办法
1.yum groupinstall "chinese support" 2. 登陆Cacti,在主页的左边点击setting,选择paths页(console>>se ...
- git设置log的别名 for hist
hist -- alias for 'log --color --graph --date=short --pretty=format:'%Cred%h%Creset -%C(yellow)%d%C ...
- Python3 OpenCV3 图像处理基础
开发环境搭建 本人使用的是Ubuntu 16.04LTS. 1.安装Python3 ## 其实 Ubuntu 16.04 系统自带了 Python 3.5.2,因此不需要再安装了?但是需要安装一些开发 ...
- axios添加了header信息后发送的get请求自动编程option请求了
axios添加了header信息后发送的get请求自动编程option请求了 webpack 代理转发 Provisional headers are shown 在Vue中如何使用axios跨域访问 ...
- 解决for循环下变量显示一致的问题
for(var i=0;i<10;i++){ setTimeOut(function(){ console.log("i:",i); },100) } 上面显示的打印出来结果 ...
- jvm 内存溢出 在myeclipse中加大tomcat的jvm内存 java.lang.OutOfMemoryError: PermGen space
使用myeclipse启动两个SSH2的部署在tomcat6下的项目 报出java.lang.OutOfMemoryError: PermGen space 解决办法: 在myeclipse中加大jv ...