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