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. ES6初探——编译环境搭建

    不好意思我又要来写操作文档了,看起来更像wiki的博客(如果你想深入学习,请阅读文末列的参考资料).本文将示例如何把ES6编译成ES5. 首先,你要自行查阅什么是ES6,和ES5.javascript ...

  2. 使用原生javascript实现jquery的$(function(){ })

    在使用jquery的时候,经常用到$(function(){})方法或者是$(document).read(function(){})来作为页面dom节点加载完成之后javascript的执行入口,现 ...

  3. List<DTO>转 Map<String,List<DTO>> 两种写法

    List<TeamScheduleDTO> list = JSON.parseArray(response.getData().getJSONArray("list") ...

  4. nginx 访问localhost老是下载文件不能打开网页什么情况?

    nginx打开网页直接下载文件的问题 nginx sites-available文件里的default已经修改过root 路径了. 但是访问localhost的时候总是直接下载网页而不是打开网址 很奇 ...

  5. php同时查询两个表的数据

    业务环境,表一 会员等级表, 表二会员表, 有一个字段是相同的 会员等级ID level 在会员的显示页面要直接显示会员的会员等级名称,不是等级ID. 1.同时查询两个表 2.表设置别名, selec ...

  6. ldap_modify: No such object (32) matched DN: cn=config

    centos 6.9 部署 kerbors ldap 报错 [root@hadoop data]# ldapmodify -Y EXTERNAL -H ldapi:/// -f chdomain.ld ...

  7. 第三周:Excel

    一.Excel的常见函数: 1.文本清洗函数: https://ask.hellobi.com/blog/cbdingchebao/10149

  8. C-基础:C语言为什么不做数组下标越界检查

    //这段代码运行有可能不报错.]; ;i<;i++) { a[i]=i; } 1.为了提高运行效率,不检查数组下表越界,程序就可以跑得快.因为C语言并不是一个快速开发语言,它要求开发人员保证所有 ...

  9. 字符串KMP || POJ 2185 Milking Grid

    求一个最小矩阵,经过复制能够覆盖原矩阵(覆盖,不是填充,复制之后可以有多的) *解法:横着竖着kmp,求最大公倍数的做法是不对的,见http://blog.sina.com.cn/s/blog_69c ...

  10. 雷林鹏分享:Lua 基本语法

    Lua 学习起来非常简单,我们可以创建第一个 Lua 程序! 第一个 Lua 程序 交互式编程 Lua 提供了交互式编程模式.我们可以在命令行中输入程序并立即查看效果. Lua 交互式编程模式可以通过 ...