- #include
- #include
- #include
- using namespace std;
-
- int main() {
- int n, q;
- cin >> n >> q;
- vector
int>> qs(n); - for (int i = 0; i < n; i++) {
- qs[i].push_back(i);
- }
- while (q--) {
- int op, a, b;
- cin >> op >> a >> b;
- if (op == 1) { // 在第a个队列末尾加入元素b
- qs[a].push_back(b);
- } else if (op == 2) { // 在第a个队列开头加入元素b
- qs[a].push_front(b);
- } else { // 把第b个队列拼到第a个队列后面
- vector<int> temp;
- // 将 deque 的元素转换为 vector
- for (int i = 0; i < qs[b].size(); i++) {
- temp.push_back(qs[b][i]);
- }
- qs[a].insert(qs[a].end(), temp.begin(), temp.end());
- // 清空 deque
- qs[b].clear();
- }
- }
- vector<int> ans;
- for (int i = 0; i < n; i++) {
- ans.insert(ans.end(), qs[i].begin(), qs[i].end());
- }
- for (int i = 1; i < ans.size(); i++) {
- if (ans == qs[i]) {
- ans = qs[0];
- break;
- }
- }
- for (int i = 0; i < ans.size(); i++) {
- cout << ans[i] << " ";
- }
- return 0;
- }
时间限制:3000ms
内存限制:128MB
有" role="presentation" style="position: relative;">个双端队列,所有队列只有一个初始元素,第个队列的初始元素就是。
接下来有次操作,操作有三种:
1 a b:在第a个队列末尾加入元素b。
2 a b:在第a个队列开头加入元素b。
3 a b:把第b个队列拼到第a个队列后面。第b个队列直接消失,在后面的操作里不会再出现。(在这种操作中,数据保证)
最后输出最长的队列的所有元素,从队头到队尾。如果有多个最长的队列,输出编号最小的那个。
第一行输入两个整数和.
下面�q行中每行输入三个整数,代表一组操作。含义见题目描述。
输出一行,为最长队列的所有元素
输入
2 3
1 1 2
2 2 3
3 1 2
输出
1 2 3 2
对于40%的数据,.
对于另外20%的数据,只有操作1和2。
对于100%的数据,,队列中的元素绝对值不超过。