codeforces1325F Ehabs Last Theorem

本文深入探讨了Codeforces上编号为1325/F的题目,解析了如何通过深度优先搜索(DFS)树的性质来寻找长度为sqrt(n)的环,以及在不存在此类环的情况下,如何选取至少sqrt(n)个点的策略。文章分享了作者的解题过程和对DFS树特性的理解,同时附上了完整的C++代码实现。

https://codeforces.com/problemset/problem/1325/F

做了上一题感觉自己已经领悟了dfs树的性质了,然后这题又搞了一年。。。越写越错,还是看了题解

最后还是有dfs树的性质我不知道,题解里给了篇博客https://codeforces.com/blog/entry/68138,得好好学学。。。

设ceil(sqrt(n))=len,

就是说,如果有点的度都大于等于len,那么一定会有长度为len的环

如果找不到环,那么对于dfs树中的每一个点,向上的边数都<len-1,因为有len-1条向上的边,又没有重边的自环,肯定就有长度为len的环。

那么我们按dfs的顺序从下到上,每次把这个点向上连到的祖先节点都给标记了,最多只能标记len-2个,如果一个点没有被标记过,就入答案集合,由于len-2<=floor(sqrt(n)),所以一定至少找到len个。

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

const int maxl=2e5+10;

int n,m,ans,cas,k,tot,cnt,len;
int a[maxl],du[maxl];
int low[maxl],dep[maxl],fa[maxl],dis[maxl];
vector<int> e[maxl];
bool vis[maxl],in[maxl];
vector<int> b[maxl];

inline void dfs(int u)
{
	vis[u]=true;b[u].push_back(u);
	for(int v:e[u])
	{
		if(vis[v]) continue;
		fa[v]=u;dep[v]=dep[u]+1;
		dfs(v);
	}
}

inline void prework()
{
	scanf("%d%d",&n,&m);
	int u,v;
	len=sqrt(n);
	if(len*len<n)
		len++;
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d",&u,&v);
		e[u].push_back(v);du[u]++;
		e[v].push_back(u);du[v]++;
	}
	dfs(1);
} 

inline void dfs2(int u)
{
	vis[u]=true;
	for(int v:e[u])
	{
		if(vis[v]) continue;
		dfs2(v);
	}
	if(!in[u] && tot<len)
	{
		a[++tot]=u;
		for(int v:e[u])
			in[v]=true;
	}
}

inline void mainwork()
{
	dep[0]=maxl;
	for(int i=1;i<=n;i++)
	{
		low[i]=i;
		for(int v:e[i])
		if(dep[v]<dep[low[i]])
			low[i]=v;
		if(dep[i]-dep[low[i]]+1>=len)
		{
			ans=2;
			int u=i;
			while(u!=low[i])
			{
				a[++tot]=u;
				u=fa[u];
			}
			a[++tot]=low[i];
			return;
		}
	}
	memset(vis,false,sizeof(vis[0])*(n+1));
	dfs2(1);ans=1;
}

inline void print()
{
	assert(ans!=0);
	if(ans==1)
	{
		puts("1");
		for(int i=1;i<=len;i++)
			printf("%d%c",a[i],(i==len)?'\n':' ');
	}
	else
	{
		puts("2");
		printf("%d\n",tot);
		for(int i=1;i<=tot;i++)
			printf("%d%c",a[i],(i==tot)?'\n':' ');		
	}
}

int main()
{
	int t=1;
	//scanf("%d",&t);
	for(cas=1;cas<=t;cas++)
	{
		prework();
		mainwork();
		print();
	}
	return 0;
}

 

基于TROPOMI高光谱遥感仪器获取的大气成分观测资料,本研究聚焦于大气污染物一氧化氮(NO₂)的空间分布与浓度定量反演问题。NO₂作为影响空气质量的关键指标,其精确监测对环境保护与大气科学研究具有显著价值。当前,利用卫星遥感数据结合先进算法实现NO₂浓度的高精度反演已成为该领域的重要研究方向。 本研究构建了一套以深度学习为核心的技术框架,整合了来自TROPOMI仪器的光谱辐射信息、观测几何参数以及辅助气象数据,形成多维度特征数据集。该数据集充分融合了不同来源的观测信息,为深入解析大气中NO₂的时空变化规律提供了数据基础,有助于提升反演模型的准确性与环境预测的可靠性。 在模型架构方面,项目设计了一种多分支神经网络,用于分别处理光谱特征与气象特征等多模态数据。各分支通过独立学习提取代表性特征,并在深层网络中进行特征融合,从而综合利用不同数据的互补信息,显著提高了NO₂浓度反演的整体精度。这种多源信息融合策略有效增强了模型对复杂大气环境的表征能力。 研究过程涵盖了系统的数据处理流程。前期预处理包括辐射定标、噪声抑制及数据标准化等步骤,以保障输入特征的质量与一致性;后期处理则涉及模型输出的物理量转换与结果验证,确保反演结果符合实际大气浓度范围,提升数据的实用价值。 此外,本研究进一步对不同功能区域(如城市建成区、工业带、郊区及自然背景区)的NO₂浓度分布进行了对比分析,揭示了人类活动与污染物空间格局的关联性。相关结论可为区域环境规划、污染管控政策的制定提供科学依据,助力大气环境治理与公共健康保护。 综上所述,本研究通过融合TROPOMI高光谱数据与多模态特征深度学习技术,发展了一套高效、准确的大气NO₂浓度遥感反演方法,不仅提升了卫星大气监测的技术水平,也为环境管理与决策支持提供了重要的技术工具。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
Codeforces 2123F 问题中,目标是通过重新排列数组 $ a $ 来最小化不动点的数量。所谓“不动点”是指在重新排列后的数组中满足 $ a_i = i $ 的位置。该问题要求设计一种策略,以最优方式重新排列数组元素,使得这样的不动点数量最少。 为了解决这个问题,可以采用贪心算法和图论思想相结合的策略: - 首先,观察到如果某个值 $ i $ 出现了多次(即 $ a_i = i $),那么这些重复的值必须被移动到其他位置,以消除不动点。 - 对于那些没有出现在其索引上的值(例如 $ a_i \neq i $),可以通过交换操作将其移动到合适的位置,从而避免产生新的不动点。 一个有效的解决方案可以基于以下步骤: 1. 构建一个映射表,记录每个值出现的位置。 2. 找出所有当前值等于其索引的位置(即当前的不动点)。 3. 尝试通过交换来消除这些不动点。优先考虑将这些值移动到未被占用的位置,并确保不会引入新的不动点。 4. 在无法完全消除所有不动点的情况下,选择最优的交换策略以尽可能减少不动点的数量。 以下是 Python 中的一个示例实现,用于解决此类问题的基本思路: ```python def minimize_fixed_points(n, a): pos = {} fixed_points = [] # 记录每个值的出现位置,并找出初始的不动点 for i in range(n): if a[i] == i + 1: fixed_points.append(i) if a[i] not in pos: pos[a[i]] = [] pos[a[i]].append(i) # 如果没有重复的值,则可以直接交换以消除所有不动点 result = a[:] for i in fixed_points: found = False for val in pos: if val != i + 1 and len(pos[val]) > 0: j = pos[val].pop() result[i], result[j] = result[j], result[i] found = True break if not found: # 特殊情况处理:当只剩下一个值时 for j in range(n): if j != i and result[j] != j + 1: result[i], result[j] = result[j], result[i] break return result # 示例输入 n = int(input()) a = list(map(int, input().split())) result = minimize_fixed_points(n, a) print(' '.join(map(str, result))) ``` 此代码实现了上述逻辑,并尝试通过交换来最小化不动点的数量。对于大多数情况,它能够有效消除所有不动点;在某些特殊情况下(例如所有值都唯一且存在多个不动点),则需要特别处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值