题意:

单点修改$a$

询问$a$的区间和$f$的区间和


原来普通计算机是这道题改编的吧...

对$f$分块,预处理$c[i][j]$为块i中$a_j$出现几次,$O(NH(N))$,只要每个块差分加上然后扫一遍就行了不用树状数组之类的

修改,整块直接改,还要单点修改$a$

查询,整块直接查,两边暴力查询$a$的区间和

对$a$的操作可以用树状数组,也可以再分块维护前缀和实现$O(N)-O(1)$

这样不用带一个log总复杂度$O(NH(N))$

实测快了0.4s

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int N=1e5+,M=;
typedef unsigned long long ll;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
int n,Q,op,x,y;
ll a[N],s[N];
int pos[N],m,block;
struct _Block{int l,r;} b[M], f[N];
inline void iniBlock(){
block=sqrt(n); m=(n-)/block+;
for(int i=;i<=n;i++) pos[i]=(i-)/block+;
for(int i=;i<=m;i++) b[i].l=(i-)*block+,b[i].r=i*block;
b[m].r=n;
}
struct BlockA{
ll add[M];
void Add(int x,ll v){
for(int i=x;i<=b[pos[x]].r;i++) s[i]+=v;
for(int i=pos[x]+;i<=m;i++) add[i]+=v;
}
ll fun(_Block &x){
return s[x.r]+add[ pos[x.r] ] - (s[x.l-]+add[ pos[x.l-] ]);
}
}A;
struct Block{
int c[M][N],s[N];
ll sum[N];
void ini(){
for(int i=;i<=m;i++){
for(int j=b[i].l ; j<=b[i].r ; j++)
s[ f[j].l ]++,s[ f[j].r+ ]--;
int *cc=c[i];
for(int j=;j<=n;j++)
cc[j]=cc[j-]+s[j],sum[i]+=cc[j]*a[j],s[j]=;
}
}
void cha(int x,ll v){
ll t=v-a[x]; A.Add(x,t);
for(int i=;i<=m;i++) sum[i]+=c[i][x]*t;
a[x]=v;
}
ll que(int l,int r){
ll re=;
if(pos[l]==pos[r])
for(int i=l;i<=r;i++) re+=A.fun(f[i]);
else{
for(int i=pos[l]+;i<=pos[r]-;i++) re+=sum[i];
for(int i=l;i<=b[pos[l]].r;i++) re+=A.fun(f[i]);
for(int i=b[pos[r]].l;i<=r;i++) re+=A.fun(f[i]);
}
return re;
}
}B;
int main(){
freopen("in","r",stdin);
n=read();
for(int i=;i<=n;i++) a[i]=read(),s[i]=s[i-]+a[i];
for(int i=;i<=n;i++) f[i].l=read(),f[i].r=read();
iniBlock();B.ini();
Q=read();
while(Q--){
op=read();x=read();y=read();
if(op==) B.cha(x,y);
else printf("%llu\n",B.que(x,y));
}
}
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
#define pii pair<int,int>
#define MP make_pair
#define fir first
#define sec second
const int N=1e5+,M=;
typedef unsigned long long ll;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
int n,Q,op,x,y;
ll a[N];
pii f[N];
struct BIT{
ll c[N];
inline void add(int p,ll v){for(;p<=n;p+=(p&-p)) c[p]+=v;}
inline ll sum(int p){ll re=;for(;p;p-=(p&-p)) re+=c[p];return re;}
}C;
inline ll fun(int x){return C.sum(f[x].sec)-C.sum(f[x].fir-);}
struct _Block{int l,r;ll sum;};
struct Block{
int block,m,pos[N],c[M][N],s[N];
_Block b[M];
void ini(){
block=sqrt(n); m=(n-)/block+;
for(int i=;i<=n;i++) pos[i]=(i-)/block+; for(int i=;i<=m;i++){
b[i].l=(i-)*block+; b[i].r= i==m ? n : i*block;
for(int j=b[i].l ; j<=b[i].r ; j++)
s[ f[j].fir ]++,s[ f[j].sec+ ]--;
int *cc=c[i];
for(int j=;j<=n;j++) cc[j]=cc[j-]+s[j],b[i].sum+=cc[j]*a[j],s[j]=;
}
}
void cha(int x,ll v){
v-=a[x];
for(int i=;i<=m;i++) b[i].sum+=c[i][x]*v;
C.add(x,v); a[x]+=v;
}
ll que(int l,int r){
ll re=;
if(pos[l]==pos[r])
for(int i=l;i<=r;i++) re+=fun(i);
else{
for(int i=pos[l]+;i<=pos[r]-;i++) re+=b[i].sum;
for(int i=l;i<=b[pos[l]].r;i++) re+=fun(i);
for(int i=b[pos[r]].l;i<=r;i++) re+=fun(i);
}
return re;
}
}B;
int main(){
freopen("in","r",stdin);
n=read();
for(int i=;i<=n;i++) a[i]=read(),C.add(i,a[i]);
for(int i=;i<=n;i++) f[i].fir=read(),f[i].sec=read();
B.ini();
Q=read();
while(Q--){
op=read();x=read();y=read();
if(op==) B.cha(x,y);
else printf("%llu\n",B.que(x,y));
}
}

BIT

CodeChef Chef and Churu [分块]的更多相关文章

  1. 【Codechef-Hard】Chef and Churu 分块

    题目链接: https://www.codechef.com/problems/FNCS Solution 大力分块.. 对序列分块,维护块内前缀和.块的前缀和,修改时暴力维护两个前缀和,询问单点答案 ...

  2. chef and churu 分块 好题

    题目大意 有一个长度为n的数组A 有n个函数,第i个函数 \[f(l[i],r[i])=\sum_{k=l[i]}^{r[i]}A_k\] 有两种操作: 1)修改A[i] 2)询问第x-y个函数值的和 ...

  3. Codechef FNCS Chef and Churu

    Disciption Chef has recently learnt Function and Addition. He is too exited to teach this to his fri ...

  4. CodeChef:Chef and Problems(分块)

    CodeChef:Chef and Problems 题目大意 有一个长度为n的序列$a_1,a_2,……,a_n$,每次给出一个区间[l,r],求在区间内两个相等的数的最远距离($max(j-i,满 ...

  5. [CC-FNCS]Chef and Churu

    [CC-FNCS]Chef and Churu 题目大意: 一个长度为\(n(n\le10^5)\)的数列\(A_{1\sim n}\),另有\(n\)个函数,第\(i\)个函数会返回数组中标号在\( ...

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

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

  7. CodeChef - FNCS Chef and Churu(分块)

    https://vjudge.net/problem/CodeChef-FNCS 题意: 思路: 用分块的方法,对每个函数进行分块,计算出该分块里每个数的个数,这样的话也就能很方便的计算出这个分块里所 ...

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

  9. CODECHEF Chef and Churus 解题报告

    [CODECHEF]Chef and Churus Description 有一个长度为\(n\)的数组\(A\),有\(n\)个函数,第\(i\)个函数的值为\(\sum_{j=l_i}^{r_i} ...

随机推荐

  1. 数值积分之Simpson公式与梯形公式

    Simpson(辛普森)公式和梯形公式是求数值积分中很重要的两个公式,可以帮助我们使用计算机求解数值积分,而在使用过程中也有多种方式,比如复合公式和变步长公式.这里分别给出其简单实现(C++版): 1 ...

  2. 找出单链表中倒数第K个元素

  3. [学习OpenCV攻略][007][缩小图片]

    cvPryDown(输入图片,输出图片) 根据输出图片的大小,把输入图片进行压缩 cvPryUp(输入图片,输出图片) 根据输出图片的大小,把输入图片进行放大 #include "cv.h& ...

  4. 程序员之殇 —— (The Beginning of the End)噩梦、崩坏

    Look at all those faces out there (当我环视周遭的一张张脸孔) We are so different(我们是如此的不同) But we have one thing ...

  5. POJ 1797 Heavy Transportation(Dijkstra变形——最长路径最小权值)

    题目链接: http://poj.org/problem?id=1797 Background Hugo Heavy is happy. After the breakdown of the Carg ...

  6. PHP headers_sent() 函数

    PHP HTTP 函数 定义和用法 headers_sent() 函数检查 HTTP 标头是否已被发送以及在哪里被发送. 如果报头已发送,则返回 true,否则返回 false. 语法 headers ...

  7. Redis 数据结构与内存管理策略(下)

    Redis 数据结构与内存管理策略(下) 标签: Redis Redis数据结构 Redis内存管理策略 Redis数据类型 Redis类型映射 Redis 数据类型特点与使用场景 String.Li ...

  8. iOS ASIHTTPRequest详解

    ASIHTTPRequest对CFNetwork API进行了封装,并且使用起来非常简单,用Objective-C编写,可以很好的应用在Mac OS X系统和iOS平台的应用程序中.ASIHTTPRe ...

  9. Laravel的unique和exists验证规则的优化

    本文是Laravel实战:任务管理系统(一)的扩展阅读 原文链接:http://pilishen.com/posts/Improvements-to-the-Laravel-unique-and-ex ...

  10. hash类型

    redis的hash是一个string的key与value的映射表.适合存储对象,与string的类型相比,可以节省内存,并且方便获取整个对象 hset  设置hash field的指定值.不存在则先 ...