觀眾席每一行構成乙個圓形,每個圓形由300個座位組成,對300個座位按照順時針編號1到300,且可以認為有無數多行。現在比賽的組織者希望觀眾進入場地的順序可以更加的有趣,在門票上並沒有規定每個人的座位,而是與這個圈中某個人的相對位置,可以坐在任意一行。
門票上標示的形式如下:a b x 表示第b個人必須在a的順時針方向x個位置(比如a坐在4號位子,x=2,則b必須坐在6號位子)。
現在你就座位志願者在入場口檢票。如果拿到一張門票,與之前給定的矛盾,則被視為是假票,如果無矛盾,視為真票。現在給定該行入場觀眾的順序,以及他們手中的門票,請問其中有多少假票?
第一行兩個數n(1<=n<=50,000)和m(1<=m<=100,000)。n表示人數。
接下來m行,每行三個數a,b,x標示b必須坐在a的順時針方向x個位置。(1<=a<=n), b(1<=b<=n), x(0<=x<300) (a!=b)
以上字母含義如題所述。
僅乙個數,表示在m張票中有多少假票。
10 10
1 2 150
3 4 200
1 5 270
2 6 200
6 5 80
4 7 150
8 9 100
4 8 50
1 7 100
9 2 100
【樣例解釋】
第5張和第10張是假票
【資料範圍】
對於20%的資料:n<=100
對於100%的資料:n<=50,000。
由於有無限多行,所以每個人可以做一行。
每增加乙個條件,相當於將兩行的人合併到一行上。每一行相當於乙個集合,所以就可以想到是並查集了。
假設並查集陣列為 h[n],初始時是 h[i]=i;設乙個距離陣列 d[n],d[i]表示從 i 到 h[i]時的順時針距離。
如果給出的條件中的 a,b,val 中的 a,b 在同一集合,只需要判斷(d[b]-d[a])%300 與 val 的關係,如果不相等,則矛盾,這張票是假票。
如果給出的條件中 a,b 在不同集合,我們就需要並查集合並,每次修改 h[i]的值時,維護一下對應的 d[i]中 i 到 h[i]的距離。
#include
#include
#include
using namespace std;
const int mod=300,maxn=50077;
int n,m,f[maxn],d[maxn],ass=0;
int gf(int u)
int main()
else
}printf("%d",ass);
}
體育場 帶權並查集
description 觀眾席每一行構成乙個圓形,每個圓形由300個座位組成,對300個座位按照順時針編號1到300,且可以認為有無數多行。現在比賽的組織者希望觀眾進入場地的順序可以更加的有趣,在門票上並沒有規定每個人的座位,而是與這個圈中某個人的相對位置,可以坐在任意一行。門票上標示的形式如下 a...
並查集 jzoj1503 體育場
description 觀眾席每一行構成乙個圓形,每個圓形由300個座位組成,對300個座位按照順時針編號1到300,且可以認為有無數多行。現在比賽的組織者希望觀眾進入場地的順序可以更加的有趣,在門票上並沒有規定每個人的座位,而是與這個圈中某個人的相對位置,可以坐在任意一行。門票上標示的形式如下 a...
jzoj1503 體育場 帶權並查集
乙個圓形300公尺的操場,外面位置無數排的椅子,然後給出一些條件,形式為 ab x abx 意思為a在b的順時針方向第x個,求有多少個要求無法滿足 用並查集,然後乙個fa r far 陣列表示離它的fa ther f at he r有多遠,每次壓縮路徑。之後如果輸入的a和b在乙個分量內就進行判斷 f...