首页 > 其他分享 >分块学习笔记

分块学习笔记

时间:2023-07-18 21:14:44浏览次数:46  
标签:lid const 分块 int long 学习 tag 笔记 rid

分块学习笔记

区间加:

对于每个区间 \([l,r]\),如果 \(lid=rid\),那么就暴力加。否则中间块加到 \(sum[i]\) 和 \(tag[i]\) 内,其余散块暴力加到 \(a[i]\) 内。注意不会存在最后一个块长不为 \(len\) 的情况,因为 \(rid-1\) 总是不会在最后一个块内。

区间和:

对于每个区间 \([l,r]\),如果 \(lid=rid\),那么就暴力查,加的是 \(a[i]\) 和 \(tag[i]\)。否则中间块直接加 \(sum[id]\),左右散块暴力加 \(a[i]\) 和 \(tag[i]\)。记得处处取模。

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+7;
int tag[N],belongs[N],cnt,a[N],sum[N];
int len;
int n;
void add(int l,int r,int x){
	int lid=belongs[l],rid=belongs[r];
	if(lid==rid){
		for(int i=l;i<=r;i++) a[i]+=x,sum[lid]+=x;
		return;
	}
	for(int i=l;belongs[i]==lid;i++) a[i]+=x,sum[lid]+=x;
	for(int i=lid+1;i<rid;i++) tag[i]+=x,sum[i]+=len*x;
	for(int i=r;belongs[i]==rid;i--) a[i]+=x,sum[rid]+=x;
}
int query(int l,int r,int p){
	int lid=belongs[l],rid=belongs[r];
	int ans=0;
	if(lid==rid){
		for(int i=l;i<=r;i++) ans+=a[i],ans%=p,a[i]+=tag[lid],ans%=p;
		return ans%p;
	}
	for(int i=l;belongs[i]==lid;i++) ans+=a[i],ans%=p,ans+=tag[lid],ans%=p;
	for(int i=lid+1;i<rid;i++) ans+=sum[i],ans%=p;
	for(int i=r;belongs[i]==rid;i--) ans+=a[i],ans%=p,ans+=tag[rid],ans%=p;
	return ans%p;
}
signed main(){
	// freopen("data.in","r",stdin);
	scanf("%lld",&n);
	len=sqrt(n);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
		belongs[i]=(i-1)/len+1;
		sum[belongs[i]]+=a[i]; 
	}
	for(int i=1;i<=n;i++){
		int op,l,r,c;
		scanf("%lld%lld%lld%lld",&op,&l,&r,&c);
		if(op==0) add(l,r,c);
		else printf("%lld\n",query(l,r,c+1));
	}
	return 0;
}

整除分块

#include<bits/stdc++.h>
using namespace std;
#define int long long
int division_block(int n){
	int res=0;
	for(int l=1,r;l<=n;l=r+1){
		r=n/(n/l);
		res+=n/l*(r-l+1);
	}
	return res;
}
int n;
signed main(){
	cin>>n;
	printf("%lld",division_block(n));
	return 0;
}

根号算法优化DP

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+7;
const int mod=1e9+7;
const int MAXN=2e3+7;
int f[MAXN][N];
int n,k;
int cnt,block_len[N];
void init(){
	for(int l=1,r;l<=n;l=r+1){
		r=n/(n/l),block_len[++cnt]=r-l+1; 
	}
}
signed main(){
	cin>>n>>k;
	init();
	for(int i=1;i<=cnt;i++) f[0][i]=1;
	for(int i=1;i<=k;i++){
		for(int j=1;j<=cnt;j++)
			f[i][j]=(f[i][j]+(block_len[j]*f[i-1][cnt-j+1]%mod)%mod)%mod;
		for(int j=1;j<=cnt;j++)
			f[i][j]=(f[i][j]+f[i][j-1]%mod)%mod;
	}
	printf("%lld",f[k][cnt]%mod);
	return 0;
}

根号

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+7;

int n,m,ans;
int d[N],A[N],B[N],vis[N];
vector<int> G[N];

int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		scanf("%d%d",&A[i],&B[i]);
		++d[A[i]],++d[B[i]];
	}
	for(int i=1;i<=m;i++){
		int u=A[i],v=B[i];
		if(d[u]>d[v]) swap(u,v);
		else if(d[u]==d[v]&&u>v) swap(u,v);
		G[u].push_back(v); 
	}
	for(int u=1;u<=n;u++){
		for(int v:G[u]) vis[v]=u;
		for(int v:G[u]){
			for(int w:G[v]) if(vis[w]==u) ++ans;
		}
	}
	printf("%d",ans);
	return 0;
} 

标签:lid,const,分块,int,long,学习,tag,笔记,rid
From: https://www.cnblogs.com/Zimo233/p/17564126.html

相关文章

  • Docker学习路线7:构建容器镜像
    容器镜像是可执行的软件包,包括运行应用程序所需的所有内容:代码、运行时、系统工具、库和设置。通过构建自定义镜像,您可以在任何支持Docker的平台上无缝地部署应用程序及其所有依赖项。Dockerfile构建容器镜像的关键组件是Dockerfile。它本质上是一个包含有关如何组装Docker镜......
  • Learning hard C#学习笔记——读书笔记 04
    1.什么是接口接口可以认为是一种规范,它是一种类的构建规范,它里面定义了一系列的方法和类型,但是没有具体的实现,需要继承它的类去自我实现2.接口的定义使用VS2022在解决方案管理器这里,添加新建项在添加新建项模板这里,选择接口最后创建出来的接口如下usingSystem;......
  • Learning hard C#学习笔记——读书笔记 05
    1.什么是IL语言我们开篇介绍C#的时候,就介绍了C#的编译过程,C#会通过编译器先编译成IL语言(IntermediateLanguage),IL代码会存放在一个程序集中IL(IntermediateLanguage),它称为CIL或者MSIL,IL是由ECMA组织(也就是定义JS标准的那个组织),提供完整的定义和规范。使用VisualStudio......
  • 第八节 小组学习
    错题整理某算法计算时间表示为递推关系式:T(N)=N+T(N/2),则该算法时间复杂度为()A.\(O(n^2)\)B.\(O(NlogN)\)C.\(O(N)\)D.\(O(1)\)题解根据递推关系式\(T(N)=N+T(N/2)\),每次的运算规模减少一半\((N/2)\),并且每次的运算时间是线性的\((N)\)。这是一种典型的......
  • 网络流学习笔记
    网络流1.关于网络的一些定义:(1)网络:网络(又称流网络\(Flow\Network\))是指一个有向图\(\G=(V,E)\)。每条边\((u,v)\inE\)都有个权值\(c(u,v)\),称之为容量\((Capacity)\),\(\forall(u,v)\notinE,c(u,v)=0\).其中有两个特殊点:分别是源点\((Source)s\inV\)和汇点\((Sink......
  • Reactjs学习-组件之间传值
    本篇是关于React的基础-父子组件之间传值子组件想使用父组件的某个属性父组件就需要把这个属性传递给子组件,子组件就可以用this.props.属性名来接收子组件调用父组件的方法父组件就需要把这个方法以属性的方式传递给子组件,子组件就可以用this.属性名来调用,要注意this指向......
  • linux bluez编程学习「1」
    之前搭建好了环境并且实现了一个简单的demo,这次多学习几个hci层函数并进行运用hci层函数可以见usr/includde/bluetooth/hci_lib.h中1.开启与关闭设备inthci_open_dev(intdev_id);inthci_close_dev(intdd);hci_open_dev会使用socket()创建一个AF_BLUETOOTH域的套接字描......
  • Reactjs学习-JSX语法
    本篇是关于React的基础-JSX语法什么是JSX在js文件中写html,这样的语法就是JSX 如何书写跟html写法一致,注意,首字母大写的标签是组件,首字母小写的,例如div是html元素 有哪些注意事项1.在类组件中写注释,用花括号包起来2.style中的某个属性需要用state中的值, 用模......
  • 【组合数学】康托展开 学习笔记
    康托展开将\(1...n\)的所有排列按照字典序进行排序,某个排列的排名可以通过康托展开的方法求出。原理观察排列\(2,3,1,4\)和\(2,3,4,1\),发现第一个不同的位置是第三位,而且第一个排列的第三位比第二个小,根据字典序的性质,第一个排列的排名在第二个之前。从这里我们也可以发......
  • 软件测试-基础阶段学习
    阶段目标  能独立针对web项目实施功能测试 一、测试介绍什么是软件测试使用技术手段验证软件是否满足需求测试主流技能功能测试自动化测试接口测试性能测试主流方向建议:功能测试+接口测试自动化测试+接口功能+性能二、测试常用分类2.1阶段划分单元测试......