数组

题目描述:

给定一个长度为 nn 的数组 a[]a[],有三种操作:

  • 操作1:格式 1xyy 将数组中值为 xx 的数据改为 a[y]a[y]
  • 操作2:格式 2xx 输出 a[x]a[x] 的值为多少
  • 操作3:格式 3xx 输出值为 xx 的数有多少个

输入数据:

第一行有一个正整数 nn,表示数组长度。

第二行有 nn 个正整数,第 ii 个正整数为 a[i]a[i]。

第三行有一个正整数 qq,表示操作次数,之后的 qq 行每行一种操作,

第一种操作的格式为 : 1xyy

第二种操作的格式为 : 2xx

第三种操作的格式为 : 3xx

输出数据:

对于每次第二种和第三种操作,输出对应的值,每次输出占一行。

评测用例规模与约定:

对于 40% 的数据:1 \le n,q \le 1000 ,1 \le a[i] \le 1000001n,q1000,1a[i]100000.

对于 100% 的数据: 1 \le n,q \le 100000,1 \le a[i] \le 1000001n,q100000,1a[i]100000.

输出时每行末尾的多余空格,不影响答案正确性

样例输入复制
3
1 2 3
3
1 2 3
2 3
3 3
样例输出复制
3
2
样例解释

最初数组为 [1,2,3][1,2,3]。

第一次操作将值为 22 的数据变为 a[3]a[3]。

数组变成 [1,3,3][1,3,3]。

第二次操作询问 a[2]a[2] 的值为多少。输出答案为: 33。

第三次操作询问值为 33 的元素有多少个。输出答案为: 22。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+10;
const ll mod=1e9+7;
const double eps=1e-7;
int T,n,q,op,x,y;
int c[maxn],to[maxn],cnt[maxn];
int getf(int cur){
    return cur==to[cur]?cur:to[cur]=getf(to[cur]);
}
int solve(int cur){
    return getf(c[cur]);
}
int main() {
    //freopen("1.txt","r",stdin);
    scanf("%d",&n);
    for(int i=0;i<=100006;++i)to[i]=i;
    for(register int i=1;i<=n;++i)scanf("%d",c+i),cnt[c[i]]++;
    scanf("%d",&q);
    for(register int i=1;i<=q;++i){
        scanf("%d",&op);
        if(op==1){
            scanf("%d%d",&x,&y);
            int nx=solve(y);
            if(!cnt[x]||x==nx)continue;
            to[x]=nx;
            cnt[nx]+=cnt[x],cnt[x]=0;
        }
        else if(op==2){
            scanf("%d",&x);
            printf("%d\n",solve(x));
        }
        else{
            scanf("%d",&x);
            printf("%d\n",cnt[x]);
        }
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/czy-power/p/11334003.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值