首页 > 其他分享 >分块板子

分块板子

时间:2024-04-15 20:34:16浏览次数:31  
标签:belong 分块 int void memset 板子 sizeof sum

预处理

void init(){
    clean();
    scanf("%lld",&n);
    for(i=1;i<=n;i++)scanf("%lld",&a[i]);
    sq=sqrt(n);
    for(i=1;i<=sq;i++){
        st[i]=n/sq*(i-1)+1;
        ed[i]=n/sq*i;
    }
    ed[sq]=n;
    for(i=1;i<=sq;i++){
        for(j=st[i];j<=ed[i];j++)belong[j]=i,sum[i]+=a[j];
            size[i]=ed[i]-st[i]+1;
    }
  }

多测清空

void clean(){
    memset(sum,0,sizeof sum);//块的区间和 
    memset(mark,0,sizeof mark);//块标记 
    memset(st,0,sizeof st);//块的头 
    memset(ed,0,sizeof ed);//块尾 
    memset(belong,0,sizeof belong);//各点所在块编号 
    memset(a,0,sizeof a);//数组 
    memset(size,0,sizeof size);//各个块的元素总数 
}

单点加减

void ad(int x,int y){
    a[x]+=y;
    sum[belong[x]]+=y;
}

区间求和

int Sum(int l,int r){
   int ans=0;
   if(belong[l]==belong[r]){
      for(int i=l;i<=r;i++)ans+=(a[i]+mark[belong[l]]);
   }else{
      for(int i=l;i<=ed[belong[l]];i++)ans+=(a[i]+mark[belong[l]]);
      for(int i=st[belong[r]];i<=r;i++)ans+=(a[i]+mark[belong[r]]);
      for(int i=belong[l]+1;i<belong[r];i++)ans+=(sum[i]+1ll*mark[i]*size[i]);
   }
    return ans;
}

区间修改

void add(int l,int r,int val){
    if(belong[l]==belong[r]){
       for(int i=l;i<=r;i++){
	   a[i]+=val;
	   sum[belong[l]]+=val;
       }
     }else {
	 for(int i=l;i<=ed[belong[l]];i++){
	     a[i]+=val;
	     sum[belong[l]]+=val;
	 }
	 for(int i=st[belong[r]];i<=r;i++){
	    a[i]+=val;
	    sum[belong[r]]+=val;
	  }
	  for(int i=belong[l]+1;i<belong[r];i++)mark[i]+=val;
     }
}

标签:belong,分块,int,void,memset,板子,sizeof,sum
From: https://www.cnblogs.com/0shadow0/p/18136854

相关文章

  • 分块--解决区间问题
    什么时候用分块?当你发现正常数据结构无法解决的时候(比如维度特别多,很不方便或者炸空间),或者复杂到要3个$log$以上才能解决时。(主要还是得看数据范围,分块的做法一般都是$O(\sqrt{n})$及以上的如何分块?定一个块长$B$,整个序列就会被分成$\floor{n/B}$块,对于末尾的不......
  • 数论板子
    线性筛求素数intprime[MAXN];//保存素数boolis_not_prime[MAXN]={1,1};//0和1都不是素数//筛选n以内的所有素数voidxxs(intn){for(inti=2;i<=n;++i){if(!is_not_prime[i]){//如果i是素数prime[++prime[0]]=i;......
  • 线段树的板子题
    线段树支持单点修改,单点查询,区间修改,区间查询pushup:子节点更新父节点pushdown:把懒标记向下传build:初始化一颗树modify:修改一个区间query:查询一个区间线段树的完整代码AcWing243.一个简单的整数问题2链接:https://www.acwing.com/problem/content/244/#include<cstdio>......
  • 主席树的板子题
    题解方法1.可持久化线段树(主席树),代码有详细注释做法:先把值离散化在数值上建立线段树,维护每个数值区间中一共有多少个数问题1:如何求整体第K小数?答:二分,如果0~mid中有cnt数,cnt>=k,递归左边,如果cnt<k,递归右边,找k−cnt小的数。时间复杂的logn问题2:求【1,R】这个区间的第K......
  • JAVA 板子
    代码片段1importjava.io.BufferedReader;importjava.io.BufferedWriter;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.OutputStreamWriter;importjava.io.PrintWriter;importjava.io.StreamTokenizer;publicclassMain{stati......
  • Splay 板子
    普通:bool_Start;#include<bits/stdc++.h>usingnamespacestd;#defineilinline#defineTptemplate<typenameT>#defineTstemplate<typenameT,typename..._T>Tpilvoidread(T&x){ x=0;boolf=0;charc=getchar(); for(;!isdigit(c)......
  • 断点续传-视频文件的分块和合并
    目录一,前言二,断点续传三,断点续传流程:四,java代码测试分块和合并视频文件分块: 视频文件合并:五,应用(简单了解)一,前言通常视频文件都比较大,项目中需要满足大文件的上传要求,http协议本身对上传文件大小没有限制,但是客户的网络质量,电脑硬件环境等参差不齐,如果一个大的......
  • 分块与莫队
    不沾树的博客变短了好多。分块例题这道题显然可以使用线段树乱搞过去,不过为了给主角面子我们假设我们不会做。对于一些难以使用数据结构维护答案的序列问题,我们考虑暴力。但是暴力太慢了,于是人们提出了分块。分块,就是把序列分成许多的小段,通过一些神秘的处理实现优化暴力。......
  • 【学习笔记】数论分块
    先看一个例子:给出正整数\(n(n\leq10^{12})\),计算:\[\sum_{i=1}^n\lfloor\frac{n}{i}\rfloor\]如果直接暴力,复杂度为\(O(n)\),无法在1s内通过,但使用数论分块(整除分块)可以将复杂度降至\(O(\sqrt{n})\)。先看个例子,当\(n=100\)时,\(i\)和\(\lfloor\frac{n}{i}\r......
  • 字符串哈希板子
    #include<iostream>#include<cstring>#defineMAX_SIZE100usingnamespacestd;classStringHash{public:intsize;char*array;char*array_forward;unsignedlonglong*pre_base;unsignedlonglong*hash_array;uns......