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;
}