题目链接: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;
}