LibreOJ 6280
Posted 6262369sss
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LibreOJ 6280相关的知识,希望对你有一定的参考价值。
题目链接:https://loj.ac/problem/6280
加一个数组保存块的和。
代码:
#include<iostream> #include<cstring> #include<algorithm> #include<queue> #include<map> #include<stack> #include<cmath> #include<vector> #include<set> #include<cstdio> #include<string> #include<deque> using namespace std; typedef long long LL; #define eps 1e-8 #define INF 0x3f3f3f3f #define maxn 50010 /*struct point{ int u,w; }; bool operator <(const point &s1,const point &s2) { if(s1.w!=s2.w) return s1.w>s2.w; else return s1.u>s2.u; }*/ LL n,m,k,t,block; LL a[maxn],sum[maxn],tag[maxn]; int lump[maxn]; void add(LL l,LL r,LL w) { for(int i=l;i<=min(lump[l]*block,r);i++)//这里错了n次...这里是r表示n,是为了防止l和r在一个块里面的情况,要引以为戒 { a[i]+=w; sum[lump[l]]+=w; } if(lump[l]!=lump[r]) { for(int i=(lump[r]-1)*block+1;i<=r;i++) { a[i]+=w; sum[lump[r]]+=w; } } for(int i=lump[l]+1;i<=lump[r]-1;i++) { tag[i]+=w; sum[i]+=w*block; } } LL get_sum(LL l,LL r) { LL ans=0; for(int i=l;i<=min(lump[l]*block,r);i++) ans+=a[i]+tag[lump[l]]; if(lump[l]!=lump[r]) { for(int i=block*(lump[r]-1)+1;i<=r;i++) ans+=a[i]+tag[lump[r]]; } for(int i=lump[l]+1;i<=lump[r]-1;i++) ans+=sum[i]; return ans; } int main() { scanf("%lld",&n); block=sqrt(n); fill(sum,sum+maxn-1,0); fill(tag,tag+maxn-1,0); for(int i=1;i<=n;i++) { scanf("%lld",&a[i]); lump[i]=(i-1)/block+1; sum[lump[i]]+=a[i]; } for(int i=1;i<=n;i++) { LL op,l,r,w; scanf("%lld%lld%lld%lld",&op,&l,&r,&w); if(op==0) add(l,r,w); else printf("%lld ",get_sum(l,r)%(w+1)); } return 0; }
以上是关于LibreOJ 6280的主要内容,如果未能解决你的问题,请参考以下文章
#6280. 数列分块入门 4 #6281. 数列分块入门 5