JZOJ B組 體育場

2021-08-21 07:47:26 字數 1340 閱讀 2852

觀眾席每一行構成乙個圓形,每個圓形由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...