标签:qidx ch 树状 int read LG3374 rg query 模板
题意
如题,已知一个数列,你需要进行下面两种操作:
- 将某一个数加上x
- 求出某区间每一个数的和
对于100%的数据:N<=500000,M<=500000
分析
cdq分治解决,参照mlystdcall的讲解。
时间复杂度\(O((N+M) \log_2 (N+M))\)
代码
#include<bits/stdc++.h>
#define rg register
#define il inline
#define co const
template<typename T>il T read()
{
rg T data=0,w=1;
rg char ch=getchar();
while(!isdigit(ch))
{
if(ch=='-') w=-1;
ch=getchar();
}
while(isdigit(ch))
{
data=data*10+ch-'0';
ch=getchar();
}
return data*w;
}
template<typename T>il T read(rg T&x)
{
return x=read<T>();
}
typedef long long ll;
co int MAXN=5e5+1,MAXM=5e5+1,MAXQ=MAXN+MAXM*2;
struct Query
{
int type,idx;
ll val;
bool operator<(co Query&x)co
{
return idx^x.idx?idx<x.idx:type<x.type;
}
}query[MAXQ],tmp[MAXQ];
ll ans[MAXQ];
int qidx=0,aidx=0;
void cdq(int L,int R) // [L,R)
{
if(R-L<=1) return;
int M=(L+R)/2;
cdq(L,M),cdq(M,R);
ll sum=0;
int p=L,q=M,o=0;
while(p<M&&q<R)
{
if(query[p]<query[q])
{
if(query[p].type==1) sum+=query[p].val;
tmp[o++]=query[p++];
}
else
{
if(query[q].type==2) ans[query[q].val]-=sum;
else if(query[q].type==3) ans[query[q].val]+=sum;
tmp[o++]=query[q++];
}
}
while(p<M)
tmp[o++]=query[p++];
while(q<R)
{
if(query[q].type==2) ans[query[q].val]-=sum;
else if(query[q].type==3) ans[query[q].val]+=sum;
tmp[o++]=query[q++];
}
std::copy(tmp,tmp+o,query+L);
}
int main()
{
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
int n=read<int>(),m=read<int>();
for(int i=1;i<=n;++i)
query[qidx].idx=i,query[qidx].type=1,query[qidx++].val=read<ll>();
for(int i=0;i<m;++i)
{
read(query[qidx].type);
if(query[qidx].type==1) read(query[qidx].idx),read(query[qidx++].val);
else
{
int l=read<int>(),r=read<int>();
query[qidx].idx=l-1,query[qidx++].val=aidx;
query[qidx].type=3,query[qidx].idx=r,query[qidx++].val=aidx++;
}
}
cdq(0,qidx);
for(int i=0;i<aidx;++i)
printf("%lld\n",ans[i]);
return 0;
}
标签:qidx,ch,树状,int,read,LG3374,rg,query,模板 来源: https://www.cnblogs.com/autoint/p/10351561.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。