思路讲解
就是暴力枚举一下就行了。当然要预处理一下。
AC代码
https://acm.hdu.edu.cn/contest/view-code?cid=1172&rid=25007
1 | // Problem: 奸商 |
就是暴力枚举一下就行了。当然要预处理一下。
https://acm.hdu.edu.cn/contest/view-code?cid=1172&rid=25007
1 | // Problem: 奸商 |
首先根据容斥原理,并集=全集-交集。
1 | FOR(i,1,N){ |
那么问题就来到了如何求这个交集。那么我们排列(首先根据rka)以后,只有前面的才有可能是在这个交集之中。
1 | FOR(i,1,N){ |
那么问题就来到了有几个j,使得 rkbj<rkbi 了,这个可以用树状数组解决(类似于逆序对,我们只用考虑前面的比我们大的数字,这里我们也只用考虑前面的,因为后面 rka 不满足)。
1 | for(auto &[x,y,isq]:ele){ |
https://acm.hdu.edu.cn/contest/view-code?cid=1173&rid=10158
1 | // Gospel_rock 补题 |
不难发现,这个x坐标完全取决于奇数操作,y坐标完全取决于偶数操作。
在y有y个操作下,其可以产生 [y+1,2y] 种子集和(就是这个范围内的都能生成)。
1 | FOR(i,1,N){ |
1 | // Problem: Bugged Robot 有缺陷的机器人 |
三个集合的容斥原理
$\left | A \cup B \cup C \right | = \left | A \right | + \left | B \right | + \left | C \right | - \left | A \cap B \right | - \left | A \cap C \right | - \left | B \cap C \right | + \left | A \cap B \cap C \right | $

那么不难发现规律,就是奇加偶减。这就是这段代码的由来。
1 | ll cn=bi.count(); |
那么直接计算合法路径数量比较难,但是我们可以枚举不合法子集。如果s是101(二进制),那么就是第一个素因子要不符合要求(LCM只关注这些数当中的最大的,你可以理解为对素因子取了一个并集,那么gcd就是取了一个交集)。
1 | // s如果这一位是1,就代表这一位的质因数必须不满足要求 |
https://acm.hdu.edu.cn/contest/view-code?cid=1172&rid=22776
1 | // Problem: 树上LCM |
那么容易想到,按照x排序,可以让sumx最大的方式就是排序,然后左边匹配右边。
而且,这样子匹配,左边的谁匹配右边的谁也是不重要的,至少对于sumx不重要,因此我们就可以按照使sumy最大的方式进行匹配。
同理,计算按照y排列能得到的答案即可。
https://codeforces.com/contest/2122/submission/329811774
1 | #include <bits/stdc++.h> |