首页 > 其他分享 >2024清明节北斗课堂总结(4.4---4.6)

2024清明节北斗课堂总结(4.4---4.6)

时间:2024-04-07 12:56:47浏览次数:33  
标签:4.4 4.6 return int sum mid --- 背包 dat

背景

通过学校老师的指引,我在清明节仅仅3天的假期内,上了长达18个小时的课程。

课程

虽然有一点点的累,但还是学到真本事的。

Day1

第一天,介绍是说上数据结构。本来我是认为会先将想栈、队列、链表等简单并可以用 STL的数据结构,但一上来,就讲了树。

另附:给我们讲课的是 mrsrz。

树的遍历:

太简单了,有深搜序,广搜序,拓扑序。

就不一一说明了。

线段树

线段树在上学期,Underage_potato大佬为吾辈讲了一番,但听是听懂了,但似乎我好像不会大代码。

但到了现在,我似乎可以独自打代码了,现鄙人将自己丑陋的代码向大众展示一番。

#include<bits/stdc++.h>
using namespace std;
int n,m,x,y,k,a[100005];
struct nod{
	int l,r;
	int dat;
	long long sum,add;
}t[400000];

void build(int p,int l,int r){
	t[p].l=l;
	t[p].r=r;
	if(l==r){
		t[p].sum=a[l];
		t[p].dat=a[l];
		return;
	}
	int mid=(l+r)/2;
	build(p*2,l,mid);
	build(p*2+1,mid+1,r);
	t[p].sum=t[p*2].sum+t[p*2+1].sum;
	t[p].dat=max(t[p*2].dat,t[p*2+1].dat);
}
//建树 
void cg(int p,int x,int v){
	if(t[p].l==t[p].r){
		t[p].dat=v;
		return ;
	}
	int mid=(t[p].l+t[p].r)/2;
	if(x<=mid)cg(p*2,x,v);
	else cg(p*2+1,x,v);
	t[p].dat=max(t[p*2].dat,t[p*2+1].dat); 
}
//单点修改
void pushdown(int p){
	if(t[p].add){
		t[p*2].sum+=t[p].add*(t[p*2].r-t[p*2].l+1);
		t[p*2+1].sum+=t[p].add*(t[p*2+1].r-t[p*2+1].l+1);
		t[p*2].add+=t[p].add;
		t[p*2+1].add+=t[p].add;
		t[p].add=0;
	}
}
//lazy tag的下传 
void cg2(int p,int l,int r,int d){
	if(l<=t[p].l&&r>=t[p].r){
		t[p].sum+=(long long)d*(t[p].r-t[p].l+1);
		t[p].add+=d;
		return ;
	}
	pushdown(p);
	int mid=(t[p].l+t[p].r)/2;
	long long val=0;
	if(l<=mid)cg2(p*2,l,r,d);
	if(r>mid)cg2(p*2+1,l,r,d);
	t[p].sum=t[p*2].sum+t[p*2+1].sum;
}
//区间修改 
int ask(int p,int l,int r){
	if(l<=t[p].l&&r>=t[p].r)return  t[p].sum;
	pushdown(p);
	int mid=(t[p].l+t[p].r)/2;
	int val=0;
	if(l<=mid)val+=ask(p*2,l,r);
	if(r>mid)val+=ask(p*2+1,l,r);
	return val;
} 
//区间查询
int main() {
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i];
	build(1,1,n);
	while(m--){
		int f;
		cin>>f>>x>>y;
		if(f==1){
			cin>>k;
			cg2(1,x,y,k);
		}else{
			cout<<ask(1,x,y)<<"\n";
		}
	}
	return 0;
}

线段树与2分相结合:

#include<bits/stdc++.h>
using namespace std;
int c[10000],n;
void add(int i,int x){for(;i<=n;i+=i&-i)c[i]+=x;}
int ask(int i){int x=0;for(;i>0;i-=i&-i)x+=c[i];return x;}
int kth(int k){
	int =1,r=n;l=mid+1;
	   
	while(l<r){
		int mid=(l+r)>>1;
		if(a[mid]<k)k-=a[mid],
		else r=mid;
	} 
}
int main(){	
	return 0;
}

树状数组

树状数组是一个与线段树极为相似的东西。

现将老师奉献的两行(一行单点增加,一行区间查询)代码置于此处。

void add(int i,int x){for(;i<=n;i+=i&-i)c[i]+=x;}
int ask(int i){int x=0;for(;i>0;i-=i&-i)x+=c[i];return x;}

st表

在课上,老师还讲了一个求区间最值的东西,叫做 ST表。

查询只需 \(O(1)\) 的复杂度,但有较为复杂的预处理。

void ST_pwork(){
	for(int i=1;i<=n;i++)f[i][0]=a[i];
	int t=log(n)/log(2)+1;
	for(int j=1;j<t;j++)
	    for(int i=1;i<=n-(1<<j);i++)
	        f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1])
}
void ST_ask(int l,int r){
	int k=log(r-l+1)/log(2);
	return max(f[l][k],f[r-(1<<k)+1][k]);
}

树链刨分

就不讲了。

Day2

Day2 讲了DP,我将背包DP全部听懂。

背包DP

01背包

我们可以将动态方程表现为 \(f[i][j][k]=1/0\)表示选到第 \(i\) 个背包容量为 \(j\) 总价格为 \(k\) 的状态是否存在。

但由于复杂度太大,所以我们可以将其改造成 \(f[i][j]=k\) 表示为选到第 \(i\) 个,背包容量为 \(j\) 最大总价格为 \(k\) 或\(f[i][j]=k\) 表示为选到第 \(i\) 个,最大总价格为\(j\),背包容量为 \(k\) 。

但打完代码后我们会发现 \(i\) 的状态是只有 \(i\) 和 \(i-1\) 的所以也可以省。

动态转移方程就变成了 \(f[j]=max(f[j],f[j-v[i]]+w[i])\) 。

int f[1000000];
	memset(f,0xcf,sizeof(f));
	f[0]=0;
	for(int i=1;i<=n;i++)
	    for(int j=m;j>=v[i];j--)
	        f[j]=max(f[j],f[j-v[i]]+w[i]);
	int ans=0;;
	for(int j=0;j<=m;j++)
		ans=max(ans,f[j]);

完全背包

物品不在是 只有一个,变成了有无数个。

int f[1000000];
	memset(f,0xcf,sizeof(f));
	f[0]=0;
	for(int i=1;i<=n;i++)
	    for(int j=v[i];j<=m;j++)
	        f[j]=max(f[j],f[j-v[i]]+w[i]);
	int ans=0;;
	for(int j=0;j<=m;j++)
		ans=max(ans,f[j]);

易发现就是将 01背包的 \(j\) 的循环顺序调换了。

多重背包

int f[1000000];
	memset(f,0xcf,sizeof(f));
	f[0]=0;
	for(int i=1;i<=n;i++)
	    for(int j=1;j<=c[i];j++)
	        for(int k=m;k>=v[i];k--)    
				f[k]=max(f[k],f[j-v[i]]+w[i]);
	int ans=0;
	for(int j=0;j<=m;j++)
		ans=max(ans,f[j]);

易发现就是 01背包加了数量限制。

标签:4.4,4.6,return,int,sum,mid,---,背包,dat
From: https://www.cnblogs.com/AUBSwords/p/18118823

相关文章

  • kube-apiserver限流机制原理
    Kubernetes的kube-apiserver组件提供了一种限流机制来保护API服务器不会因为过多的请求而过载。这是通过几种机制实现的,包括基于速率的限流(RBAC)和基于并发连接数的限流。基于速率的限流:kube-apiserver可以配置为限制来自每个用户的请求速率。这是通过--basic-auth-file参......
  • HTB-Archetype
    HTB-Archetype1.TASK1问题:哪个TCP端口托管着数据库服务器?识别运行数据库服务的端口,通常通过端口扫描(如使用nmap)来完成。nmap-sV10.129.57.230答案:14332.TASK2问题:通过SMB共享的非管理员共享的名称是什么?smbclient-L10.129.57.230答案:backups3.TASK3问题......
  • Pdfium.Net.Free 一个免费的Pdfium的 .net包装器--可视化编辑pdf
    Pdfium.Net.Free支持.NETFramework4.0.NETFramework4.5.NETStandard2.0.Net8.0可以和PdfiumViewer.Free共同使用预览pdf,也可以直接引用Pdfium.Net.Free操作pdf,解决部分.NetCore调用的问题,Pdfium.Net.Free封装了现有Pdfium的函数,实现了部分操作pdf的功能,部分功......
  • 二叉树-统一迭代法
    迭代法实现的前中后序遍历,除了前序和后序相互关联,中序则是另一种风格。我们需要针对三种遍历方式实现统一风格的代码。如何统一风格:解决访问节点(遍历节点)和处理节点(将元素放进结果集)不一致的情况。将访问的节点放入栈中,把要处理的节点放入栈中但是做标记(紧接着放入一个空指针)......
  • 增强检索问答RAG研究成果综述 Retrieval-Augmented Generation for AI-Generated Cont
    文章目录引言背景贡献*相关工作**路线图*初步*概述**生成器*Transformer模型LSTMDiffusion模型***GAN****检索器*稀疏检索*:*密集检索*:****其他方法**:*方法*RAG基础*基于查询的RAG(Query-basedRAG)*:****基于潜在表示的RAG**(LatentRepresentation-basedRA......
  • Python量化交易系统实战--量化交易入门
    作者:麦克煎蛋  出处:https://www.cnblogs.com/mazhiyong/转载请保留这段声明,谢谢! 这个系列的文章主要是基于慕课网的量化交易学习的笔记,顺便也加了自己的一些理解和优化。一边学一边写,回头再梳理。  量化交易是指以先进的数学模型替代人为的主观判断,利用计算机技术从庞......
  • 最高法--招标工程量清单与后续施工图纸中工程量相差甚大,施工人以此为由主张重调整组价
     (2019)最高法民终379号  金义祥、株洲银泰房地产开发有限公司建设工程施工合同纠纷二审民事判决书上诉人主张:(一)一审判决采信以固定总价为基数进行造价鉴定属于认定事实错误。本案应按固定单价方式鉴定,工程款总额为216839234.6元,银泰公司欠东欣公司工程款108377634.6元,东欣公司......
  • Protobuf - Well-Known Types
     Any (message)Api (message)BoolValue (message)BytesValue (message)DoubleValue (message)Duration (message)Empty (message)Enum (message)EnumValue (message)Field (message)Field.Cardinality (enum)Field.Kind (enum)FieldMask (message)Fl......
  • 【阅读笔记】MySQL的多版本并发控制(MVCC-Multiversion Concurrency Control)
    摘自:高性能MySQL(第四版)MVCC的作用InnoDB和XtraDB存储引擎通过多版本并发控制(MVCC,MultiversionConcurrencyControl)解决了幻读的问题MVCC的应用MySQL的大多数事务型存储引擎使用的都不是简单的行级锁机制。它们会将行级锁和可以提高并发性能的多版本并发控制(MVCC)技术结合使用......
  • 最高法--对图纸中没有,但承包人自行施工的工作内容,发包人明显知晓但验收时均未持异议,应
    (2020)最高法民终483号  浙江省三建建设集团有限公司与咸阳凯创置业有限责任公司等建设工程施工合同纠纷上诉案本院认为:二审法院认为:对于室内不同墙体交界处纤维网格布费用902384.57元。凯创公司上诉提出,合同约定承包人不得对原工程设计进行变更,施工图纸未设计不同墙体交界处......