社区讨论

求 C 题简单方法

题目总版参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mm3pycz4
此快照首次捕获于
2026/02/27 01:10
2 周前
此快照最后确认于
2026/02/28 15:05
上周
查看原帖
rt,我 C 题用时居然比 D、E 加起来的用时还多,写了 102 行代码。
CPP
#include<iostream>
#include<vector>
#include<queue>
#include<set>

using namespace std;

const int N = 3e3 + 10, M = 1e6 + 10;
int t, n, x, l[N], p[N]; bool vis[M];
vector<int> a[N], ls, ans;

struct pii{
	int l, i;
	
	bool operator < (const pii & o) const{
		return l > o.l;
	}
};

priority_queue<pii> pq, pq2;
set<int> st;

int main(){
	cin >> t;
	while(t--){
		cin >> n; ans.clear();
		for(int i = 1; i <= n; i++){
			cin >> l[i]; a[i].clear();
			for(int j = 1; j <= l[i]; j++){
				cin >> x; vis[x] = 0;
				a[i].push_back(x);
			}
			p[i] = a[i].size()-1;
			pq.push({a[i].back(), i});
		}
		while(pq.size()){
			int nl = pq.top().l;
			while(pq.size() && pq.top().l == nl){
				st.insert(pq.top().i);
				pq.pop();
			}
//			cout << nl << '\n';
			int mn, mnn; bool fg = 1;
			while(st.size() > 1){
				mn = 1e9;
				for(int i: st){
					mn = min(mn, a[i][p[i]]);
				}
				vis[mn] = 1;
				for(int i: st){
					if(a[i][p[i]] != mn){
						ls.push_back(i);
						pq.push({a[i][p[i]], i});
					}
					else{
						while(p[i] >= 0 && vis[a[i][p[i]]]) p[i]--;
						if(p[i] < 0){
							ls.push_back(i);
							fg = 0;
						}
					}
				}
				for(int i: ls) st.erase(i);
				ls.clear();
				ans.push_back(mn);
				if(fg == 0) break;
			}
			if(st.size() && fg){
				x = *st.begin();
//				cout << x << '\n';
				for(int i = p[x]; i >= 0; i--){
					if(vis[a[x][i]] == 0){
						vis[a[x][i]] = 1;
						ans.push_back(a[x][i]);
					}
				}
				st.clear();
			}
			if(!fg){
				for(int i: st) pq.push({a[i][p[i]], i});
			}
//			for(int i: ans) cout << i << ' ';
//			cout << '\n';
//			cout << pq.size() << '\n';
			while(pq.size()){
				pii tp = pq.top(); pq.pop();
				while(p[tp.i] >= 0 && vis[a[tp.i][p[tp.i]]]){
					p[tp.i]--;
				}
				if(p[tp.i] >= 0) pq2.push({a[tp.i][p[tp.i]], tp.i});
			}
			while(pq2.size()){
				pq.push(pq2.top());
				pq2.pop();
			}
//			cout << pq.size() << '\n';
		}
		for(int i: ans) cout << i << ' ';
		cout << '\n';
	}
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...