【分块+树状数组】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响应号召,花了三小时 ...
随机推荐
- [转]自定义ASP.NET MVC JsonResult序列化结果
本文转自:http://blog.163.com/luckcq@yeah/blog/static/17174770720121293437119/ 最近项目中前台页面使用EasyUI的jQuery插件 ...
- Some Python Tricks
python 的包管理很不好用,理解费力,故偷懒,模块仍按文件布局,写一个合并脚本将各个模块合并输出到一个脚本文件,分别管理,合并输出,回避了加载模块的问题 f-format 仅在python 3.6 ...
- 【转】Android中实现IPC的几种方式详细分析及比较
1.使用Bundle ----> 用于android四大组件间的进程间通信android的四大组件都可使用Bundle传递数据 所以如果要实现四大组件间的进程间通信 完全可以使用Bundl ...
- re正则表达式公式讲解3
1.分组匹配 用()把需要分组的类型括起来,如下 import re m = re.search("([a-z]+)([0-9]+)","alex123" ...
- Android学习笔记(十八) Socket
Socket在计算机网络中的概念是指套接字,包含IP地址和端口号.在Java编程中Socket是一个类,用来实现数据传输(同样可以理解为“套接字”).传输的协议包括UDP和TCP,前者为不可靠的无连接 ...
- ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) 忘记mysql密码
[root@mysql-db03 ~]# mysql -uroot -poldboy123Warning: Using a password on the command line interface ...
- VBA Promming入门教程——变量的使用
数据类型 VBA中的数据类型可分为两种 示例 String Sub Main Dim s as string s = "Hello" msgbox(s) End Sub Singl ...
- hasOneOf # if (data.otherDescArr.some(_ => '7'.indexOf(_) > -1)) {
if (data.otherDescArr.some(_ => '7'.indexOf(_) > -1)) { export const hasOneOf = (targetarr, ar ...
- 解决chrome 批量下载器 mgblihnaaedmhhgadafknogahbgejnno 插件乱码
找到 mgblihnaaedmhhgadafknogahbgejnno\当前版本号(0.0.1_0)\popup.html <html> <head> <meta cha ...
- js 调用flash在chrome报错
1.网页内嵌动态生成的flash出错,出错信息如下: #25081850 myChartId::RendererManager Error >> There was an error re ...