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; }