A - Zero Array(2019省赛训练-3)

Input
1           //t组样例
5 5         //下一行n个数,q次操作
3 2 1 5 4
1 2 3       //操作1,表示把数组第2个位置变成3,变成 3 3 1 5 4
2           //操作2,表示输出要用几次能把n个数变成0。
1 3 2       //怎么变呢,上例先减1变成2 2 0 4 3,不为0的数减2
1 4 1       //变成0 0 0 2 1,不为0的数减1,变成0 0 0 1 0,
2           //不为0的数减1,全为0,最后全变成0,共需要4次。
Output
4
4

思路:操作2变0,就是看数组里面有几个不为0的数。 

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <sstream>
#include <cstdio>
#include <vector>
#include <string>
#include <cmath>
#include <stack>
#include <queue>
#include <map>
#include <set>
#define MAX 0x3f3f3f3f
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const double PI = acos(-1);
const ll M=1e5+7;
const ll mod=1e9+7;
map<ll,ll>m;
ll aa[M];
int main()
{
    ll t,i;
    scanf("%lld",&t);
    while(t--)
    {
        ll n,p,e,a,b;
        m.clear();
        ll ans=0;
        scanf("%lld%lld",&n,&p);
        for(i=1;i<=n;i++)
        {
            scanf("%lld",&aa[i]);
            m[aa[i]]++;
            if(m[aa[i]]==1)
                ans++;
        }
        for(i=0;i<p;i++)
        {
            scanf("%lld",&e);
            if(e==1)
            {
                scanf("%lld%lld",&a,&b);
                ll f=aa[a];
                aa[a]=b;
                m[f]--;
                if(m[f]==0)
                    ans--;
                m[b]++;
                if(m[b]==1)
                    ans++;

            }
            else
            {
                if(m[0]!=0)
                    printf("%lld\n",ans-1);
                    //cout<<ans-1<<endl;
                else
                    printf("%lld\n",ans);
            }
        }
    }
    return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值