A-B:略
C:可能题意比较绕,第i个答案就是穿着i这个号码(也就是Q[j] = i,这个时候j这个位置),看向的那个人的号码(也就是P[j])
代码:
void solve()
{
int n;
cin >> n;
vi p(n + 1), q(n + 1), ans(n + 1);
rep(i, 1, n) {
cin >> p[i];
}
rep(i, 1, n) {
cin >> q[i];
}
rep(i, 1, n) {
ans[q[i]] = q[p[i]];
}
rep(i, 1, n) {
cout << ans[i] << ' ';
}
}
D:枚举哪两个集合[i,j]计算贡献,用map记录每个集合每个元素a个数,最后枚举i和j中间最小那个map计算贡献即可。
void solve()
{
int n;
cin >> n;
vector<map<int, int>> cnt(n + 1);
vi k(n + 1);
rep(i, 1, n) {
cin >> k[i];
int x;
rep(j, 1, k[i]) {
cin >> x;
cnt[i][x]++;
}
}
double ans = 0;
rep(i, 1, n) {
rep(j, i + 1, n) {
if (sz(cnt[i]) < sz(cnt[j])) {
double dw = 1.0 * k[i] * k[j];
double up = 0;
for (auto &[x, c] : cnt[i]) {
if (cnt[j].count(x)) {

最低0.47元/天 解锁文章
922

被折叠的 条评论
为什么被折叠?



