CSP-防疫大数据202209-3

题目链接


模拟题,这里不清除map也可以过,题目所给内存大。

满分代码:

#include 

using namespace std;

struct Node{
	int d;
	int u;
	int r;
};

int n;
map<pair<int,int>,bool> mp;
vector<Node> user;

int main()
{
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	cin >> n;
	for(int i=0;i<n;i++){
		int ri,mi;
		cin >> ri >> mi;

		// 先clear
		// map,bool> tmp;
		for(map<pair<int,int>,bool>::iterator iter = mp.begin();iter!=mp.end();){
			map<pair<int,int>,bool>::iterator it1 = iter;
			iter++;
			if(i - ((it1->first).second) >= 7)	mp.erase(it1);
		}
		// for(auto t:mp){
		// 	if(i - t.first.second < 7)	tmp[t.first] = 1;
		// } 
		// mp.clear();
		// mp = tmp;

		// 插入合法的
		for(int j=1;j<=ri;j++){
			int pij;
			cin >> pij;
			for(int date=i;date<i+7;date++){
				mp[{pij,date}] = 1;
			}
		}

		// 筛选不合法的
		vector<Node> vc;
		for(auto t:user){
			bool f = 1;
			int r = t.r;
			if(i - t.d >= 7)	continue;

			for(int date = t.d;date<=i;date++){
				if(!mp.count({r,date})){
					f = 0;
					break;
				}
			}
			if(f)		vc.push_back(t);
		}
		user.clear();
		user = vc;

		// 必须是七天以内收到的漫游数据
		for(int j=1;j<=mi;j++){
			int d,u,r;
			cin >> d >> u >> r;

			if(i - d >= 7)	continue;
			// check 合法性
			// 从 d 到 i 天地区r均为风险地区即可
			bool f = 1;
			for(int k=d;k<=i;k++){
				if(!mp.count({r,k})){
					f = 0;
					break;
				}
			}

			if(f)	user.push_back({d,u,r});
		}

		set<int> ans;
		for(auto x:user)	ans.insert(x.u);

		cout << i << ' ';
		for(auto x:ans){
			cout << x << ' ';
		}
		cout << '\n';
	}


	return 0;
}

你可能感兴趣的:(liaoyu,算法,c++,算法,图论)