Mex

给定一个长度为 ​N 的数组。你的程序需要按照输入顺序处理如下两种操作:

1.修改。修改带有两个参数 p​ 和 x​,表示将数组中下标为 p​ 的元素修改为x ​;

2.查询。查询操作带有两个参数 ​L,R ​,查询的结果为没有在数组中从下标为 ​ L 的元素开始到下标为 ​R 的元素为止(两端均包含)的这个子数组中出现过的最小正整数。

输入描述

测试用例第一行为一个正整数N [1,1000 000] ​,表示数组的长度。

第二行为 ​N 个以空格分隔的整数,表示初始数组的每一项。

第三行为一个整数 ​Q [1,100 000],表示操作的数量。

从第四行开始的 Q​ 行,每行包含若干个以空格分隔的整数。其中第一个整数表示操作的类型,1表示修改操作,2表示查询操作;若操作为修改操作,接下来包含两个整数 ​ p和 x (0<=p<N ,1<=x<=1 000 000 000)​,含义如前述所示;若操作为查询操作,接下来包含两个整数 L​ 和 R ​(0<=L<=R<N),含义如前述所示。

保证数组中的每个元素在任意时刻均在[1,1 000 000 000]​ 范围内。

保证所有查询中子数组的长度之和不超过40 000 000​。

输出描述

对于输入中的每一个查询操作,你的程序应该在单独的一行上输出查询的结果。

  测试输入关于“测试输入”的帮助 期待的输出关于“期待的输出”的帮助 时间限制关于“时间限制”的帮助 内存限制关于“内存限制”的帮助 额外进程关于“{$a} 个额外进程”的帮助
测试用例 1 以文本方式显示
  1. 5↵
  2. 1 2 3 4 6↵
  3. 3↵
  4. 2 0 4↵
  5. 1 4 5↵
  6. 2 0 4↵
以文本方式显示
  1. 5↵
  2. 6↵
1秒 64M 0
#include<stdio.h>  
#include<stdlib.h>  
  
int a[1000001],b[1000001],c[1000001];  
int main(){  
    int n,s,x1,x2,x3,n1,i,j,k,u,flag;  
    scanf("%d",&n);  
    for(i=0;i<n;++i)  
    {  
        scanf("%d",&a[i]);  
    }  
    scanf("%d",&s);  
    while(s--)  
    {  
        scanf("%d %d %d",&x1,&x2,&x3);  
        if(x1==1)  
        {  
            a[x2]=x3;  
        }  
        else  
        {         
            flag=0;  
            n1=x3-x2+1;  
            for(i=x2,j=0;i<=x3;++i,++j)  b[j]=a[i];  
            for(k=1;k<n1+1;++k) c[k]=1;  
            for(u=0;u<n1;++u)  
            {  
                if(b[u]>=1&&b[u]<=n1) c[b[u]]=2;  
            }  
            for(u=1;u<n1+1;++u)  
            {  
                if(c[u]==1)  
                {  
                    printf("%d\n",u);  
                    flag=1;  
                    break;  
                }  
            }  
            if(!flag) printf("%d\n",u);   
        }  
    }  
    return 0;  
}  
发布了19 篇原创文章 · 获赞 1 · 访问量 162

猜你喜欢

转载自blog.csdn.net/CN_BIT/article/details/104652118
Mex