【Atcoder】 [ARC141D] Non-divisible Set

文章讲述了在Atcoder和Luogu竞赛中的一个问题,涉及如何在特定限制下,选择一个二进制表示的奇数,只允许选择一个。通过计算符合条件的奇数k的区间范围,作者提供了一种高效的时间复杂度为O(nlnn)的解法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接

Atcoder方向
Luogu方向

题目解法

神仙题!
考虑到 a i < 2 m a_i<2m ai<2m 的奇怪限制,可以得到对于 k ∗ 2 i ( k k*2^i(k k2i(k 为奇数 ) ) ) 的形式的所有数中,只能选出 1 1 1 个,且必须选出一个,因为 1 − 2 m 1-2m 12m 的奇数只有 m m m
考虑满足条件的形式是什么,即对于 k 1 ∗ 2 i , k 2 ∗ 2 j k_1*2^i,k_2*2^j k12i,k22j,不存在 i < j i<j i<j k 1 < k 2 k1<k2 k1<k2
这启发我们对每个 i i i 算出符合条件 k k k 的区间范围 L k , R k L_k,R_k Lk,Rk(确实有数的出现的范围)
具体如何求解 L k , R k L_k,R_k Lk,Rk?这里以 L k L_k Lk 举例,只要从大到小枚举 k k k,然后 L k = max ⁡ { L d + 1 } ( k ∣ d ) L_k=\max\{L_d+1\}(k|d) Lk=max{Ld+1}(kd)
然后把 a i a_i ai 查封成 k ∗ 2 i k*2^i k2i 的形式,易知当 L [ i ] ≤ k ≤ R [ i ] L[i]\le k\le R[i] L[i]kR[i] 的时候是有解的,否则无解(还有一些无解条件是不能得到所有的奇数 k k k 或者 L k > R k L_k>R_k Lk>Rk
时间复杂度 O ( n ln ⁡ n ) O(n\ln n) O(nlnn)

#include <bits/stdc++.h>
using namespace std;
const int N=1000100;
int n,m,a[N],L[N],R[N];
bool vis[N];
inline int read(){
	int FF=0,RR=1;
	char ch=getchar();
	for(;!isdigit(ch);ch=getchar()) if(ch=='-') RR=-1;
	for(;isdigit(ch);ch=getchar()) FF=(FF<<1)+(FF<<3)+ch-48;
	return FF*RR;
}
int find(int x){
    for(int i=0,bs=1;;i++,bs<<=1) if(bs>x) return i-1;
}
int ed(){
    for(int i=1;i<=n;i++) puts("No");
    exit(0);
}
int main(){
	n=read(),m=read();
	for(int i=1;i<=n;i++) a[i]=read(),vis[a[i]]=1;
	for(int i=1;i<=m<<1;i+=2){
		bool flg=0;
		for(int j=i;j<=m<<1;j<<=1) if(vis[j]){ flg=1;break;}
		if(!flg) ed();
	}
	for(int i=1;i<=m<<1;i+=2) R[i]=find((m<<1)/i);
	for(int i=1;i<=m<<1;i+=2){
        while(R[i]>=0&&!vis[i<<R[i]]) R[i]--;
		for(int j=3*i;j<=m<<1;j+=i<<1) R[j]=min(R[j],R[i]-1);
    }
	for(int i=(m<<1)-1;i>=1;i-=2){
		for(int j=3*i;j<=m<<1;j+=i<<1) L[i]=max(L[i],L[j]+1);
        while((i<<L[i])<=(m<<1)&&!vis[i<<L[i]]) L[i]++;
    }
    for(int i=1;i<=m<<1;i+=2) if(L[i]>R[i]) ed();
	for(int i=1;i<=n;i++){
		int k=0;
		while(~a[i]&1) a[i]>>=1,k++;
		if(L[a[i]]<=k&&k<=R[a[i]]) puts("Yes");
		else puts("No");
	}
	fprintf(stderr,"%d ms\n",int(1e3*clock()/CLOCKS_PER_SEC));
	return 0;
}

### 解决YOLOv8验证时张量维度不匹配问题 在处理YOLOv8验证过程中遇到的`RuntimeError: The size of tensor a (80) must match the size of tensor b (84)`错误,主要源于模型预期的输出尺寸与实际数据集中的目标框标签尺寸不符。此情况类似于其他框架中因类别数或图像尺寸设置不当引发的问题[^3]。 #### 错误原因分析 - **类别数量差异**:假设训练配置设定的目标分类数目为80类(含背景),但在验证集中存在额外的4种类别,这将导致维度冲突。 - **图像分辨率适配不良**:如果验证图片经过缩放或其他变换后未能保持原始比例,可能导致特征映射层输出的空间维度发生变化,进而影响后续操作如锚点分配等过程中的张量形状一致性校验失败。 #### 解决策略 针对上述两种可能性,建议采取如下措施: 1. **确认并统一类别定义** - 审查项目内所有涉及类别索引的地方,确保训练和测试/验证阶段使用的类别列表完全相同。 - 修改配置文件中关于`nc`参数(number of classes)以及对应权重初始化部分的相关数值至正确的类别总数加一(考虑背景类)。 2. **调整输入图像规格** - 对于特定的数据集如BSD68,需预先检查其样本特性,并据此实施必要的预处理步骤以满足网络架构的要求。例如,当采用具有固定步幅卷积核的设计时,应保证输入图像宽度高度均为指定因子(此处可能是4)的倍数[^1]。 - 使用适当的插值方法重设图像大小到最接近的理想尺寸而不改变长宽比,或者通过裁切去除边缘区域来实现这一点。 ```python import cv2 def preprocess_image(image_path, target_size=(640, 640)): img = cv2.imread(image_path) h, w = img.shape[:2] # Calculate scaling factor while preserving aspect ratio r = min(target_size[0]/h, target_size[1]/w) new_unpad = int(round(w * r)), int(round(h * r)) dw = (target_size[1] - new_unpad[0]) % 4 # Ensure width divisible by 4 dh = (target_size[0] - new_unpad[1]) % 4 # Ensure height divisible by 4 top, bottom = dh//2, dh-(dh//2) left, right = dw//2, dw-(dw//2) resized_img = cv2.resize(img, new_unpad, interpolation=cv2.INTER_LINEAR) padded_img = cv2.copyMakeBorder(resized_img, top, bottom, left, right, cv2.BORDER_CONSTANT, value=[0, 0, 0]) return padded_img ``` 3. **更新标注信息** - 如果确实是因为增加了新的物体类型而导致了类别计数增加,则除了同步修改模型外,还需相应地修正现有的ground truth标记文档,使其反映最新的分类体系。 完成以上更改之后再次尝试运行验证流程,观察是否解决了原有的张量尺寸不兼容问题。同时注意保存好每次实验的日志记录以便追溯调试历史。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值