Comet OJ - 模拟赛 #2 Day2

本文分享了竞赛编程中解决三道难题的策略,包括暴力枚举优化、树状数组应用、区间操作与懒惰传播技巧,深入解析了质因数分解、奇偶数处理及线段树优化等关键算法。

正题

      今天不会做的题是第一题

      T1

      开场想到T1不会那么难,就直接暴力枚举x的因子,时间复杂度O(n\sqrt x \log_2n),结果拿到了70分的好成绩。

      考虑到x的因子并没有那么多,根本不需要根号去枚举,而是质因数分解之后,暴力dfs枚举因子。

      首先50000以内的质数只有大概3000个左右(并没有那么多,用黎曼猜想估算),其次分解是log的,所以就是O(3000+\log_2 x),题解写的是O(\frac{\sqrt x}{\log x}),我也不知道为什么。然后dfs找因子的复杂度就是O(\sigma_0(x)),这个没有疑问。

      接着暴力用树状数组维护就可以通过。

      但是发现有大约O(n*1536)次修改和O(q)次查询,所以我们只需要一个O(1),O(\sqrt n)的分块维护就可以了。

      T2

      一血好评

      把同一种颜色的坐标提出来,然后考虑一个左边的区间能和那些右边的区间乘起来贡献到答案里面。

      显然要么端点重合,要么隔一个点,要么隔三个点...所以直接分奇偶记录就可以了。

      复杂度O(n+m)

#include<bits/stdc++.h>
using namespace std;

const int N=1000010;
vector<int> F[N];
int n,m;
int t[2],op;
long long ans=0;

int main(){
	scanf("%d %d",&n,&m);
	int x;
	for(int i=1;i<=n;i++) scanf("%d",&x),F[x].push_back(i);
	for(int i=1;i<=m;i++) if(F[i].size()){
		t[0]=t[1]=0;op=0;
		t[op]=F[i][0];F[i].push_back(n+1);
		for(int j=0;j+1<F[i].size();j++){
			ans+=1ll*t[op]*(F[i][j+1]-F[i][j]);
			op^=1;t[op]+=F[i][j+1]-F[i][j];
		}
	}
	printf("%lld\n",ans);
}

      T3

      难得两重lazy写对了,结果被丧心病狂的出题人卡掉了一个点????

      首先考虑序列上的情况,树上的情况可以花费log的时间转成序列。

      发现要做的有两种事情,给区间内奇数/偶数加w,区间奇数/偶数求和。

      直接维护发现找不到奇数偶数的关系,我是先发现w为奇数的时候,修改后,要么区间内全同奇,要么区间内全同偶,否则奇偶不变,所以我们先给区间内对应的数加上w,不考虑奇偶变化的情况,再统一修改奇偶情况。

       发现现在到区间上面有两种操作:区间给黑/白点加上w,区间染黑/白。

       发现染黑或者染白后区间就在一起了,所以我们只需要记录四个lazy,区间不在一起之前,给黑/白点加了多少,区间在一起变成什么颜色(不在一起为-1),在一起之后整个区间一共加了多少。

       当然一些基本的区间奇偶和,奇偶数个数分别有多少个还是要记录的,具体可以参照代码,比较好懂。

       开了Ofast才能通过。请教群内的大佬后,这个维护是O(1)下传lazy的,所以可以用LCT做到大常数的一个log。

#pragma GCC optimize("Ofast")
#include<bits/stdc++.h>
#define ls now<<1
#define rs now<<1|1
using namespace std;

const int N=160010;
struct edge{
	int y,next;
}s[N<<1];
int first[N],len=0,n,m,num;
int son[N],tot[N],top[N],fa[N],ima[N],dep[N];
long long t[N<<2][2],sum[N<<2][2],a_lazy[N<<2][2],C[N<<2],A[N<<2];

inline char nc(){
    static char buf[5000000],*p1=buf,*p2=buf;
    return p1==p2&&(p2=(p1=buf)+fread(buf,1,5000000,stdin),p1==p2)?EOF:*p1++;
}
inline void read(int&sum){
    char ch=nc();sum=0;
    while(!(ch>='0'&&ch<='9'))ch=nc();
    while(ch>='0'&&ch<='9')sum=sum*10+ch-48,ch=nc();
    return ;
}

void ins(int x,int y){
	s[++len]=(edge){y,first[x]};first[x]=len;
}

void dfs(int x){
	tot[x]=1;
	for(int i=first[x];i!=0;i=s[i].next) if(s[i].y!=fa[x]){
		fa[s[i].y]=x;dep[s[i].y]=dep[x]+1;
		dfs(s[i].y);
		tot[x]+=tot[s[i].y];
		if(tot[s[i].y]>tot[son[x]]) son[x]=s[i].y;
	}
}

void dfs_2(int x,int tp){
	top[x]=tp;ima[x]=++num;
	if(son[x]) dfs_2(son[x],tp);
	for(int i=first[x];i!=0;i=s[i].next) if(s[i].y!=fa[x] && s[i].y!=son[x]) dfs_2(s[i].y,s[i].y);
}

void Add(int now,int op,int c,int l,int r){
	if(C[now]==-1){
		a_lazy[now][op]+=c;
		sum[now][op]+=1ll*t[now][op]*c;
	}
	else if(op==C[now]) A[now]+=c,sum[now][op]+=1ll*(r-l+1)*c;
}

void C_type(int now,int op,int l,int r){
	if(C[now]==-1) A[now]=0;
	sum[now][op]+=sum[now][op^1];sum[now][op^1]=0;
	t[now][op]=r-l+1;t[now][op^1]=0;C[now]=op;
}

void push_down(int now,int l,int r){
	int mid=(l+r)/2;
	if(a_lazy[now][0]) Add(ls,0,a_lazy[now][0],l,mid),Add(rs,0,a_lazy[now][0],mid+1,r);
	if(a_lazy[now][1]) Add(ls,1,a_lazy[now][1],l,mid),Add(rs,1,a_lazy[now][1],mid+1,r);
	if(C[now]!=-1){
		C_type(ls,C[now],l,mid);C_type(rs,C[now],mid+1,r);
		Add(ls,C[now],A[now],l,mid);Add(rs,C[now],A[now],mid+1,r);
	}
	a_lazy[now][0]=a_lazy[now][1]=A[now]=0;
	C[now]=-1;
}

void add(int now,int x,int y,int op,int c,int l=1,int r=n){
	if(x==l && y==r){Add(now,op,c,l,r);return ;}
	push_down(now,l,r);
	int mid=(l+r)/2;
	if(y<=mid) add(ls,x,y,op,c,l,mid);
	else if(mid<x) add(rs,x,y,op,c,mid+1,r); 
	else add(ls,x,mid,op,c,l,mid),add(rs,mid+1,y,op,c,mid+1,r);
	sum[now][op]=sum[ls][op]+sum[rs][op];
}

long long get_sum(int now,int x,int y,int op,int l=1,int r=n){
	if(x==l && y==r) return sum[now][op];
	push_down(now,l,r);
	int mid=(l+r)/2;
	if(y<=mid) return get_sum(ls,x,y,op,l,mid);
	else if(mid<x) return get_sum(rs,x,y,op,mid+1,r);
	else return get_sum(ls,x,mid,op,l,mid)+get_sum(rs,mid+1,y,op,mid+1,r);
}

void c_type(int now,int x,int y,int op,int l=1,int r=n){
	if(x==l && y==r){C_type(now,op,l,r);return ;}
	push_down(now,l,r);
	int mid=(l+r)/2;
	if(y<=mid) c_type(ls,x,y,op,l,mid);
	else if(mid<x) c_type(rs,x,y,op,mid+1,r);
	else c_type(ls,x,mid,op,l,mid),c_type(rs,mid+1,y,op,mid+1,r);
	sum[now][0]=sum[ls][0]+sum[rs][0];
	t[now][0]=t[ls][0]+t[rs][0];
	sum[now][1]=sum[ls][1]+sum[rs][1];
	t[now][1]=t[ls][1]+t[rs][1];
}

long long solve(int type,int x,int y,int c){
	long long ans=get_sum(1,x,y,type);
	if(type==0){
		add(1,x,y,1,c);
		if(c&1) c_type(1,x,y,0);
	}
	if(type==1){
		add(1,x,y,0,c);
		if(c&1) c_type(1,x,y,1);
	}
	return ans;
}

void build(int now,int l,int r){
	t[now][0]=r-l+1;C[now]=-1;
	if(l==r) return ;
	int mid=(l+r)/2;
	build(ls,l,mid);
	build(rs,mid+1,r);
}

int main(){
	read(n);read(m);
	int type,x,y,c,tx,ty;
	long long ans=0;
	for(int i=1;i<n;i++) read(x),read(y),ins(x,y),ins(y,x);
	dep[1]=1;dfs(1);dfs_2(1,1);
	build(1,1,n);
	while(m--){
		read(type),read(x),read(y),read(c);type--;
		ans=0;tx=top[x];ty=top[y];
		while(tx!=ty){
			if(dep[tx]>dep[ty]) swap(x,y),swap(tx,ty);
			ans+=solve(type,ima[ty],ima[y],c);
			y=fa[ty];ty=top[y];
		}
		if(dep[x]>dep[y]) swap(x,y);
		ans+=solve(type,ima[x],ima[y],c);
		printf("%lld\n",ans);
	}
}

 

# YOLOv5 🚀 requirements # Usage: pip install -r requirements.txt # Base ------------------------------------------------------------------------ gitpython ipython # interactive notebook matplotlib>=3.2.2 numpy>=1.18.5 opencv-python>=4.1.1 Pillow>=7.1.2 psutil # system resources PyYAML>=5.3.1 requests>=2.23.0 scipy>=1.4.1 thop>=0.1.1 # FLOPs computation torch>=1.7.0 # see https://pytorch.org/get-started/locally (recommended) torchvision>=0.8.1 tqdm>=4.64.0 # protobuf<=3.20.1 # https://github.com/ultralytics/yolov5/issues/8012 # Logging --------------------------------------------------------------------- tensorboard>=2.4.1 # clearml>=1.2.0 # comet # Plotting -------------------------------------------------------------------- pandas>=1.1.4 seaborn>=0.11.0 # Export ---------------------------------------------------------------------- # coremltools>=6.0 # CoreML export # onnx>=1.9.0 # ONNX export # onnx-simplifier>=0.4.1 # ONNX simplifier # nvidia-pyindex # TensorRT export # nvidia-tensorrt # TensorRT export # scikit-learn<=1.1.2 # CoreML quantization # tensorflow>=2.4.1 # TF exports (-cpu, -aarch64, -macos) # tensorflowjs>=3.9.0 # TF.js export # openvino-dev # OpenVINO export # Deploy ---------------------------------------------------------------------- # tritonclient[all]~=2.24.0 # Extras ---------------------------------------------------------------------- # mss # screenshots # albumentations>=1.0.3 # pycocotools>=2.0 # COCO mAP # roboflow # ultralytics # HUB https://hub.ultralytics.com
05-25
【事件触发一致性】研究多智能体网络如何通过分布式事件驱动控制实现有限时间内的共识(Matlab代码实现)内容概要:本文围绕多智能体网络中的事件触发一致性问题,研究如何通过分布式事件驱动控制实现有限时间内的共识,并提供了相应的Matlab代码实现方案。文中探讨了事件触发机制在降低通信负担、提升系统效率方面的优势,重点分析了多智能体系统在有限时间收敛的一致性控制策略,涉及系统模型构建、触发条件设计、稳定性与收敛性分析等核心技术环节。此外,文档还展示了该技术在航空航天、电力系统、机器人协同、无人机编队等多个前沿领域的潜在应用,体现了其跨学科的研究价值和工程实用性。; 适合人群:具备一定控制理论基础和Matlab编程能力的研究生、科研人员及从事自动化、智能系统、多智能体协同控制等相关领域的工程技术人员。; 使用场景及目标:①用于理解和实现多智能体系统在有限时间内达成一致的分布式控制方法;②为事件触发控制、分布式优化、协同控制等课题提供算法设计与仿真验证的技术参考;③支撑科研项目开发、学术论文复现及工程原型系统搭建; 阅读建议:建议结合文中提供的Matlab代码进行实践操作,重点关注事件触发条件的设计逻辑与系统收敛性证明之间的关系,同时可延伸至其他应用场景进行二次开发与性能优化。
【四旋翼无人机】具备螺旋桨倾斜机构的全驱动四旋翼无人机:建模与控制研究(Matlab代码、Simulink仿真实现)内容概要:本文围绕具备螺旋桨倾斜机构的全驱动四旋翼无人机展开,重点研究其动力学建模与控制系统设计。通过Matlab代码与Simulink仿真实现,详细阐述了该类无人机的运动学与动力学模型构建过程,分析了螺旋桨倾斜机构如何提升无人机的全向机动能力与姿态控制性能,并设计相应的控制策略以实现稳定飞行与精确轨迹跟踪。文中涵盖了从系统建模、控制器设计到仿真验证的完整流程,突出了全驱动结构相较于传统四旋翼在欠驱动问题上的优势。; 适合人群:具备一定控制理论基础和Matlab/Simulink使用经验的自动化、航空航天及相关专业的研究生、科研人员或无人机开发工程师。; 使用场景及目标:①学习全驱动四旋翼无人机的动力学建模方法;②掌握基于Matlab/Simulink的无人机控制系统设计与仿真技术;③深入理解螺旋桨倾斜机构对飞行性能的影响及其控制实现;④为相关课题研究或工程开发提供可复现的技术参考与代码支持。; 阅读建议:建议读者结合提供的Matlab代码与Simulink模型,逐步跟进文档中的建模与控制设计步骤,动手实践仿真过程,以加深对全驱动无人机控制原理的理解,并可根据实际需求对模型与控制器进行修改与优化。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值