openjudge 9주차 A:List 신해 (vector 구현)

A:List 신해(vector 구현)
통계 질문 제출 총 시간 제한 보기: 4000ms 메모리 제한: 65536kB 설명 다음 명령을 완성합니다: new id - 지정한 번호가 id인 시퀀스 (id<10000) add id num - 번호가 id인 시퀀스에 정수 num merge id1 id2 - 시퀀스 id1과 id2의 수를 합쳐서그리고 id2를 Unique id - 서열 id에서 중복된 요소를 제거하고 out id - 작은 출력에서 큰 출력으로 id로 된 서열의 요소를 공백으로 구분합니다
첫 번째 행에 n 을 입력하여 명령이 몇 개 있는지 나타냅니다.앞으로 n줄마다 명령이 하나씩 있습니다.출력은 제목에 따라 출력해야 한다.샘플 입력 16 new 1 new 2 add 1 1 add 1 2 add 1 3 add 2 1 add 2 2 2 add 2 3 add 2 4 out 1 out 2 merge 1 2 out 1 out 1 out 2 unique 1 out 1 샘플 출력 1 2 3 1 2 3 1 2 1 2 1 2 3 2 3 4 1 2 3 4 1 2 3 4 4 1 2 3 4 1 2 3 4 4 4 4 4 4
id 데이터의 범위가 비교적 작다는 것을 알아차리고 10000vector의 수조를 직접 채우면 된다. 중점은vector의 무거운 부분을 제거하는 데 있다. 그 중에서 합병 조작은 id1=id2의 상황을 주의해야 한다. 말이 많지 않으면 코드를 올린다.

#include
#include
#include
using namespace std;
vector<int>::iterator it;
vector<int >num[10005];
int main() {
	string s;
	int n,id,val;
	cin >> n;
	while (n--) {
		cin >> s;
		if (s == "new") {
			cin >> id;
			continue; }
		if (s == "add") {
			cin >> id>>val;
			num[id].push_back(val);
		}
		if (s == "out") {
			cin >> id;
			if (!num[id].empty()) {
				sort(num[id].begin(), num[id].end());
				it = num[id].begin();
				cout << *it;
				it++;
				for (; it != num[id].end(); it++) {
					cout << " " << *it;
				}
			}
			cout << endl;
		}
		if (s == "unique") {
			cin >> id;
			sort(num[id].begin(), num[id].end());
			num[id].erase(unique(num[id].begin(), num[id].end()),num[id].end());
			//  unique()            ,      ,    vector  
		}
		if (s == "merge") {
			cin >> id >> val;
			if (val != id)//    ,wa      
			 {
				vector<int>tmp;
				tmp.resize(num[id].size() + num[val].size());
				merge(num[id].begin(), num[id].end(), num[val].begin(), num[val].end(), tmp.begin());
				num[id].swap(tmp);
				num[val].clear();
			}
		}
	}
	return 0;
}

좋은 웹페이지 즐겨찾기