题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6777
题意:第一个人在0时刻已经涂上荧光粉,如果某个人在同一时间、同一地点与涂上荧光粉的人相遇,那他也会沾上荧光粉,结果按照从小到大输出身上有荧光粉的人的编号。
思路:排个序模拟下就好,排序优先次序为时间、时间相同优先地点、两者都相同优先编号。这题代码也许更适合那些不会或者说不是很会用map、vector、pair这些,因为我也不是很会用,太菜了,后面学习一下尝试用新方法写出来。
#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#include <cmath>
#include <stack>
#include <map>
#include <string>
#include <vector>
#include <algorithm>
#include <sstream>
#include <unordered_map>
typedef long long ll;
using namespace std;
struct node{
int id,t,p;
}s[200005];
int n,len,cnt;
bool vis[200005];
bool cmp(struct node x,struct node y)
{
if(x.t!=y.t) return x.t<y.t;
if(x.p!=y.p) return x.p<y.p;
return x.id<y.id;
}
int main()
{
int t; scanf("%d",&t);
while(t--)
{
memset(vis,0,sizeof(vis));
cnt=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&len);
for(int j=0;j<len;j++)
{
scanf("%d %d",&s[cnt].t,&s[cnt].p);
s[cnt++].id=i;
}
}
sort(s,s+cnt,cmp);
vis[1]=1;
for(int i=1;i<cnt;i++)
{
if(s[i].t==s[i-1].t&&s[i].p==s[i-1].p)
{
if(vis[s[i-1].id]==1||vis[s[i].id]==1)
{
vis[s[i].id]=vis[s[i-1].id]=1;
int j=i;
while(s[j].t==s[j-1].t&&s[j].p==s[j-1].p)
{
vis[s[j].id]=vis[s[j-1].id]=1;
j--;
}
}
}
}
int sum=0;
for(int i=1;i<=n;i++)
{
if(vis[i])
{
if(!sum) printf("%d",i),sum++;
else printf(" %d",i);
}
}
printf("\n");
}
return 0;
} 
京公网安备 11010502036488号