我們抽象的認為一些不能互相辨認的人,被分到了乙個集合,每當又有一場演出,就將每個出演的演員扔出集合,再將上次在相同集合的分在同一集合。
然後修改被分的集合和被新建立的時間,當集合只有乙個數的時候不可再分。
輸出每個演員所在的集合的最後修改時間,僅當該演員所在的集合中只有乙個演員。
#include #include #include #include #include #include #include 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()
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 歌劇表演
傳送門 沒想到吧我半夜切的 這道題應該算是 text 裡面比較簡單的吧。考慮用集合關係來表示分辨關係,具體地說就是我們把所有演員分成若干個集合,滿足同乙個集合內的演員兩兩不能分辨。初始時所有演員位於同乙個集合內。然後對於某次參加了演出的演員,他們可能分別來自不同的集合,那麼這些集合就會有兩類不同的組...
題解 JSOI2014 歌劇表演
我們可以把這些人拆成一些集合,保證對於乙個集合你只知道這個整體,而無法分辨出哪一部分是哪些人 起初所有人都在乙個集合中 我們對於每一次操作,肯定會有一些人屬於同乙個集合 那你就可以從這個集合中分辨出這些人來,把這些人摳出來重新丟進乙個集合 最後乙個人乙個集合的就可以被分辨出來 include inc...
JZOJ3864 JSOI2014 歌劇表演
我們想想乙個人在什麼情況下會被發現 我們給每個數標上乙個識別號,相同的識別號代表這兩個數性質相同無法識別,而當乙個數擁有乙個唯一的識別號時,該數就可以被識別。為了不讓識別號混亂,又要讓區間的數的識別號的相對位置不變,我們每次取1 n中的最大值t,每次區間中若遇到乙個新出現的識別號,我們就用t 1給它...