Round #504 D. Array Restoration .

本文介绍了一个CodeForces竞赛题目解决方案,该题要求判断并还原一个带有特殊标记的数组,通过追踪数组中各元素的位置来判断其合理性,并提供了一段C++实现代码。

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

题目:http://codeforces.com/contest/1023

对于一个长度n的数组进行q次查询,i从1到q,第i次将任意一段连续的部分全部染成i。

最后得到的数组中可能会存在“污点”0.即最后对数组的任意子集set为0.

给出n和q,以及带污点的长为n的数组,判断是否能将其还原成没有0的合理数组。

如果可以则输出任意一合理数组。

思路:先统计每个数的出现的最左位置和最右位置,然后从q到1查询,判断q的最左到最右中间有没有不合理的数(小于q)。

因为一定会有q次查询所有最后至少有一个q存在,否则就是被0覆盖了,所以要先判断q、0的存在问题。
如果无q有0,就将最左的0设置为q(其实任意了);
然后在判断是否合理,如果第i次判断时遇到了0可以直接将0设置为i,注意判断时一定要跳过已经判断了的部分。

注意初始化时的范围选择


#include<cstdio>

const int maxn = 200015;
int n,q,a[maxn],r[maxn],l[maxn],fa[maxn];
 
int mfind(int x){return fa[x]==x?x:fa[x]=mfind(fa[x]);}
int m_max(int i,int j){return i>j?i:j;}
int m_min(int i,int j){return i<j?i:j;}
 
int main(){
    scanf("%d%d",&n,&q);
    for(int i=0;i<=q;i++){//note is q
        r[i]=0;
        l[i]=n;
    }
 
    for(int i=0;i<n;i++){
        scanf("%d",a+i);
        r[a[i]]=m_max(r[a[i]],i);
        l[a[i]]=m_min(l[a[i]],i);
    }
 
    for(int i=0;i<=n;i++)fa[i]=i;//note can equ n
 
    if(l[q]>r[q]){
        if(l[0]>r[0]){
            puts("NO");
            return 0;
        }
 
        a[l[0]]=q;
        fa[l[0]]=mfind(l[0]+1);
    }
 
 
    for(int i=q;i;i--){
        for(int j=mfind(l[i]);j<=r[i];j=mfind(j)){
            if(a[j]<i&&a[j]){
                 puts("NO");
                return 0;
            }
 
            a[j]=i;
            fa[j]=mfind(j+1);
        }
    }
 
    puts("YES");
    for(int i=0;i<n;i++)
        printf("%d ",a[i]?a[i]:1," \n"[i==n-1]);
    return 0;
}

转载于:https://www.cnblogs.com/lingyuanchuang/p/9498599.html

### 使用 `skimage.restoration.circular_psf` 函数的方法 在 Scikit-Image (即 skimage) 库中,`restoration` 模块提供了多种用于图像恢复的技术。其中,`circular_psf` 是一种特定的点扩散函数 (Point Spread Function, PSF),通常用于模拟圆形光圈成像系统的光学模糊效果[^1]。 以下是关于如何使用 `skimage.restoration.circular_psf` 的详细说明: #### 导入必要的模块 为了调用此函数,需先安装并导入 Scikit-Image 库中的相关模块: ```python from skimage import restoration import numpy as np import matplotlib.pyplot as plt ``` #### 创建 Circular PSF 通过指定参数来生成一个圆形 PSF 数组。以下是一个简单的例子: ```python psf_radius = 5 # 圆形半径大小 shape = (100, 100) # 输出数组形状 # 调用 circular_psf 函数 circular_psf_array = restoration.circular_psf(psf_radius, shape=shape) # 可视化结果 plt.imshow(circular_psf_array, cmap=&#39;gray&#39;) plt.title(&#39;Circular PSF Array&#39;), plt.axis(&#39;off&#39;) plt.show() ``` 上述代码片段展示了如何创建一个具有给定半径和形状的圆形 PSF,并将其可视化为灰度图。需要注意的是,`circular_psf` 参数的具体定义可能依赖于版本差异,请查阅官方文档确认最新行为[^2]。 #### 关键参数解释 - **`radius`**: 定义圆的半径长度。 - **`shape`**: 设置输出二维数组的高度和宽度尺寸,默认情况下会根据半径自动生成正方形区域。 如果未明确指定这些参数,则可能会引发错误或者返回不符合预期的结果。 --- ### 注意事项 尽管 Skimage 提供了许多强大的工具支持高级图像处理需求,但在实际应用过程中仍需注意其局限性和适用范围。例如,在某些高性能计算场景下 OpenCV 或者 GPU 加速框架可能是更好的选择。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值