1.解题思路
建立日期和风险地区集合的映射,建立日期和风险用户集合的映射,每当在第i天收到风险地区列表时,其后七天该地区也为风险地区,直接加入,再清空第i天的前七天及更早时候的漫游数据,遍历漫游数据,判断涉及的地区是否从漫游时间d到当天i一直为风险地区,若是,则将其用户加入风险用户列表。
2.满分代码
#include<bits/stdc++.h>
using namespace std;
map<int,set<int>>area;
map<int,set<int>>user;
struct data{int d,u,r;bool operator<(const data& a)const{return d<a.d;}
};
multiset<data>route_data;
int n;
void deletedata(int today)
{auto x=route_data.lower_bound({today-6});route_data.erase(route_data.begin(),x);
}
bool is_risk(int today,data x)
{for(int i=x.d;i<=today;i++){if(area[i].count(x.r)==0)return false;}return true;
}
int main()
{cin>>n;for(int i=0;i<n;i++){int r,m;cin>>r>>m;while(r--){int pij;cin>>pij;area[i].insert(pij);for(int k=1;k<7;k++)area[i+k].insert(pij);}while(m--){int d,u,r;cin>>d>>u>>r;data tmp;tmp.d=d;tmp.u=u;tmp.r=r;route_data.insert(tmp);}deletedata(i);for(auto it:route_data){if(is_risk(i,it))user[i].insert(it.u);}}for(int i=0;i<n;i++){cout<<i<<" ";for(auto it:user[i]){cout<<it<<" ";}cout<<endl;}return 0;
}