线段树+树状数组+分块+循环展开 的模板
#define lson l,m,rt<<1 #define rson m+1 r,rt<<1|1 void update(int rt){ sum[rt]=sum[rt<<1]+sum[rt<<1|1]; } void build(int l,int r,int rt){ if(l==r){ sum[rt]=z[l]; return ; } int m=(l+r)>>1; build(lson); build(rson); update(rt); } build(1,n,1); int query(int l,int r,int rt,int nowl,int nowr){ if(nowl<=l&&r<=nowr) return sum[rt]; int m=(l+r)>>1; int ans=0; if(nowl<=m) ans+=query(lson,nowl,nowr); if(m<nowr) ans+=query(rson,nowl,nowr); return ans; } query(1,n,1,l,r); void modify(int l,int r,int rt,int p,int v) { if(l==r){ sum[rt]=v; return; } int m=(l+r)>>1; if(p<=m) modify(lson,p,v); else modify(rson,p,v); update(rt); } modify(1,n,1,p,v);
/*线段树*/
#define lb(x) ((x)&(-x)) int modify(int p,int v){ for(;p<=n;p+=lb(p)) z[p]+=v; } int query(int p) { int ans=0; for(;p;p-=lb(p)) ans+=a[p]; return ans; } /*树状数组*/
int s=(int)sqrt(n); for (int a=1;a<=n;a++) belong[a]=(a-1)/s+1; for (int a=1;a<=n;a++) right[belong[a]]=a; for (int a=n;a>=1;a--) left[belong[a]]=a; for (int a=1;a<=n;a++) sum[belong[a]]+=z[a]; int query(int l,int r) { int ans=0; if (belong[l]==belong[r]) { for (int a=l;a<=r;a++) ans+=z[a]+col[belong[a]]; } else { for (int a=l;a<=right[belong[l]];a++) ans+=z[a]+col[belong[a]]; for (int a=belong[l]+1;a<belong[r];a++) ans+=sum[a]; for (int a=left[belong[r]];a<=r;a++) ans+=z[a]+col[belong[a]]; } return ans; } void modify(int l,int r,int v) { if (belong[l]==belong[r]) { for (int a=l;a<=r;a++) { z[a]+=v; sum[belong[a]]+=v; } } else { for (int a=l;a<=right[belong[l]];a++) { z[a]+=v; sum[belong[a]]+=v; } for (int a=belong[l]+1;a<belong[r];a++) { col[a]+=v; sum[a]+=(right[a]-left[a]+1)*v; } for (int a=left[belong[r]];a<=r;a++) { z[a]+=v; sum[belong[a]]+=v; } } }
int ans=0; for (int a=1;a<=n;a++) ans += a; for (int a=1;a<=n;a+=2) { ans += a; ans += a+1; }
/*循环展开*/
我博客里有大量的从别的博客复制过来的代码,分析,以及理解,但我一律会在文章后面标记原博客大佬博客名,其中部分会加以连接。
绝无抄袭的意思,只是为了我在复习的时候找博客方便。
如有原作者对此有不满,请在博客留言,我一定会删除该博文。