[Ynoi2011]初始化

0|1题目传送门

1|0题意

  • 给定一个序列,支持区间求和和跳点加(即对于 y+kx(kN) 位置上加)

2|0Sol

第一道完全没有提示做出的 Ynoi。

考虑到题目和 P3396 哈希冲突 有点像,不如先看一下那一题题解吧。

获得灵感了吗?

对于修改操作,我们仍然分两类。

  1. x<n

同样考虑记录 fij 表示 x=iy=j 的修改总和。

我们考虑统计答案。

答案即为 i=lrai+i=1nj=1i(fi,j×(rjil1ji))

显然可以分开算后用前缀和优化掉一个 n

si,j 表示 fi,jj 一维取前缀和,即 si,j=k=1jfi,k

答案即可表示为 i=lrai+i=1n((si,i×(ril1i))+si,r%isi,(l1)%r)

事实上这个意义比上式更好理解。(

修改处理 si,j 即可。

  1. xn

暴力修改即可

如上式,考虑迅速求 i=lrai,那么考虑分块。

总复杂度 O((n+m)n)

2|1记得开 long long

2|2Code

// wish to get better qwq #include<bits/stdc++.h> #define re register int #define pb push_back using namespace std; typedef long long ll; template <typename T> void rd(T &x){ ll fl=1;x=0;char c=getchar(); for(;!isdigit(c);c=getchar()) if(c=='-') fl=-fl; for(;isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+c-'0'; x*=fl; } void wr(ll x){ if(x<0) x=-x,putchar('-'); if(x<10) putchar(x+'0'); if(x>9) wr(x/10),putchar(x%10+'0'); } // ---------- IO ---------- // const int N=2e5+5,SQ=505,mod=1e9+7; int n,m,op,l,r,qaq,len,tot; ll a[N],sum[SQ],s[SQ][SQ]; // s[i][j] 指 x=i [1,j] 中 add 的值 inline int block(int x){return (x-1)/len+1;} inline int L(int x){return (x-1)*len+1;} inline int R(int x){return x*len;} inline void modify(int x,int y,int z){ if(x>=tot){ for(re i=y;i<=n;i+=x) a[i]+=z,sum[block(i)]+=z; return ; } for(re i=y;i<=x;i++) s[x][i]+=z; // cout<<x<<' '<<y<<' '<<z<<endl; // for(re i=0;i<=x;i++) cout<<s[x][i]<<' ';cout<<endl; return ; } inline ll query(int l,int r){ ll ans=0;int lb=L(block(l)+1),rb=R(block(r)-1),tmp=block(r)-1; if(block(l)==block(r)){ for(re i=l;i<=r;i++) ans+=a[i]; } else{ for(re i=l;i<lb;i++) ans+=a[i]; for(re i=rb+1;i<=r;i++) ans+=a[i]; for(re i=block(l)+1;i<=tmp;i++) ans+=sum[i]; } // cout<<ans<<endl; for(re i=1;i<=tot;i++) ans+=s[i][r%i]-s[i][(l-1)%i]+s[i][i]*(r/i-(l-1)/i); return ans; } // ---------- Sqrt & Operations ---------- // int main(){ // freopen(".in","r",stdin); // freopen(".out","w",stdout); rd(n);rd(m);len=(int)sqrt(n);tot=block(n); for(re i=1;i<=n;i++) rd(a[i]),sum[block(i)]+=a[i]; for(re i=1;i<=m;i++){ rd(op);rd(l);rd(r); if(op==1) rd(qaq),modify(l,r,qaq); else wr(query(l,r)%mod),puts(""); } return 0; } // ---------- Main ---------- //

__EOF__

本文作者Daniel Jiang
本文链接https://www.cnblogs.com/danieljiang/p/14410767.html
关于博主:JSOIer 高一萌新 求带/kel
版权声明:awa
声援博主:求赞/kel
posted @   Demoe  阅读(114)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· .NET Core 中如何实现缓存的预热?
· 三行代码完成国际化适配,妙~啊~
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
点击右上角即可分享
微信分享提示