6450: levil与时间点 map

描述

 

levil有T个时间点会对一个长度未知数组进行操作,开始时数组里仅有一个元素x,接下来每个时间点,levil都会进行下面的操作中的一种。

操作一:输出当前数组中最大元素的最大因子。

操作二:将一个新的数y加入数组。

操作三:输出数y在数组中有几个。

操作四:将数y从数组中删除一个。

但是levil又不想这个数组里的元素特别多,所以从开始到结束,插入数组的数的个数最多只会有103个。

数字n本身不算自己的因子,1算自己的因子;特别的,如果这个数是1,那么因子就是1。

 

 

输入

 

第一行,两个正整数T,x,分别代表T个时间点和数组的初始元素x(1 <= T <= 105,1 <= x <= 108)。

接下来T行,每行开始一个整数opt。

如果opt == 1.则执行操作一。

如果opt == 2.再输入一个数y(1 <= y <= 108),执行操作二。

如果opt == 3.再输入一个数y(1 <= y <= 108),执行操作三。

如果opt == 4.再输入一个数y(1 <= y <= 108),执行操作四。

数据保证删去的数都在数组中,且数组不会为空。

 

 

输出

 

对于每次查询输出一行。

 

 

样例输入

 

8 2
1
2 3
1
3 2
3 4
4 2
1
3 2

样例输出

 

1
1
1
0
1
0

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e3+10,inf = 0x3f3f3f3f;

int main()
{
    map<int,int>mp;
    int t,x; cin >> t >> x;
    mp[x]++;
    while(t--)
    {
        map<int,int>::iterator it;
        int op,y;
        scanf("%d",&op);
        if(op == 1)
        {
            it = --mp.end();
            //while(it->second == 0)it--;
            y = it->first;
            //cout << y << endl;
            int f = 0;
            for(int i = 2; i * i <= y; i++)
            {
                if(y % i == 0)
                {
                    f = 1;
                    cout << y / i << endl;break;
                }
            }
            if(!f)cout << 1 << endl;
        }
        else if(op == 2)
        {
            scanf("%d",&y);
            mp[y]++;
        }
        else if(op == 3)
        {
            scanf("%d",&y);
            if(mp[y]) cout << mp[y] << endl; 
            else cout << 0 << endl,mp.erase(y); 
        }
        else
        {
            scanf("%d",&y);
            mp[y]--;
        }
    }
    return 0;
}

 

 

posted @ 2023-10-13 20:22  CRt0729  阅读(18)  评论(0编辑  收藏  举报