当然可以用并查集做,不过你需要按秩合并+路径压缩(才可能过),因为数据范围十分不友好......
USACO的官方做法更为优秀。首先题目告诉我们牛们加入的前后顺序不影响结果(自己证明也很容易,显然两头牛到达一个房子最后的结果看起来是一样的)。所以我们不妨先把牛们都安排在它们喜欢的房子,然后$O(n)$扫描一遍模拟把它们放进对应的房子这个过程。因为第一次我们先扫到前面,可能后面一些牛之后又到了前面,所以要再扫一遍。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int N=3000005; 6 int n,k,x,y,a,b,s; 7 int cow[N],used[N]; 8 int main() 9 { 10 scanf("%d%d",&n,&k); 11 for(int i=1;i<=k;i++) 12 { 13 scanf("%d%d%d%d",&x,&y,&a,&b); 14 for(int j=1;j<=y;j++) cow[(1ll*a*j+b)%n]+=x; 15 } 16 for(int i=0;i<n;i++) 17 {s+=cow[i]; if(s) s--;} 18 for(int i=0;i<n;i++) 19 { 20 s+=cow[i]; if(s) s--; 21 else {printf("%d",i); break;} 22 } 23 return 0; 24 }