【JSOI2014】歌劇表演
阿新 • • 發佈:2018-05-22
抽象 題目 math HR sum ostream cst main alt
題目
分析
我們抽象的認為一些不能互相辨認的人,被分到了一個集合,每當又有一場演出,就將每個出演的演員扔出集合,再將上次在相同集合的分在同一集合。
然後修改被分的集合和被新創建的時間,當集合只有一個數的時候不可再分。
輸出每個演員所在的集合的最後修改時間,僅當該演員所在的集合中只有一個演員。
#include <cmath> #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <queue> const int maxlongint=2147483647; const int mo=1000000007; const int N=100005; using namespace std; int fa[N*20],tot,t[N*20],n,m,a[N],bz[N*20],d[N],num,sum[N]; int main() { scanf("%d%d",&n,&m); sum[0]=n; for(int i=1;i<=m;i++) { int k; scanf("%d",&k); num=0; for(int j=1;j<=k;j++) { scanf("%d",&a[j]); if(sum[fa[a[j]]]!=1 || bz[fa[a[j]]]) { if(!bz[fa[a[j]]]) { t[fa[a[j]]]=i; d[++num]=fa[a[j]]; sum[fa[a[j]]]--; bz[fa[a[j]]]=++tot; fa[a[j]]=tot; t[tot]=i; sum[tot]=1; } else sum[fa[a[j]]]--,fa[a[j]]=bz[fa[a[j]]],sum[fa[a[j]]]++; } } for(int j=1;j<=num;j++) bz[d[j]]=0; } for(int i=1;i<=n;i++) if(sum[fa[i]]==1) printf("%d ",t[fa[i]]); else printf("0 "); }
【JSOI2014】歌劇表演