AtCoder Beginner Contest 392(A-G)题解

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)) {
         
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值