競技プログラミング日記

主に AtCoder の記事です

AtCoder Beginner Contest 259E

ABC259E

操作する場所 \(i \in N\) を全探索. 操作を何もしてないときも含めて,\(N+1\) 通りを考える. 何もしてないときの \(LCM(a)\) を \(L\) とおく. \(LCM_{j \in N, j \neq i}(a_{j})\) を \(L_{i}\) とおく.

\(i\) 番目を数えるかどうかは, \(a_{i}\) のある素因数 \(p\) の指数 \(e\) が,単独 max かを判定できれば良い.

  • (0): その様な素因数 \(p\) が存在する場合, \(L_{i} \neq L\).
  • (1): 存在しない場合, \(L_{i} = L\). この場合は,\(L_{i}\) の代わりに \(L\) の方を数える.

また,(0) を満たす \(i,j \in N, i \neq j\) を任意にとると, \(L_{i} \neq L_{j}\).
したがって,求める答えは,
     (0) の \(i \in N\) の個数) + \(d\).
ここで, \(d\) は,(1) を満たす \(i\) が存在するなら \(1\), そうでなければ \(0\).

使っている記号,マクロ等 "https://ecsmtlir.hatenablog.com/entry/2022/12/23/131925"


// p.first >= p.second
void change(pll &p, ll x){
  if(x > p.first){
    p.second = p.first;
    p.first = x;
  }else if(x > p.second){
    p.second = x;
  }
}

// return true iff 単独max
bool judge(pll p, ll x){
  if(x == p.first){
    if(x == p.second){
      return false;
    }else{
      return true;
    }
  }else {
    return false;
  }
}


int main() {
  ll n; cin >> n;
  vector<map<ll, ll>> mp(n);
  map<ll, pll> f;
  rep(i,n){
    ll m; cin >> m;
    rep(j,m){
      ll p,e ; cin >> p >> e;

      mp[i][p] = e;
      change(f[p], e);
    }
  }

  ll ans = 1;
  rep(i,n){
    bool flg = false;
    for(auto [p,e]:mp[i]){
      if(judge(f[p], e)){
        flg = true;
        break;
      }
    }
    if(flg){
      ans++;
    }
  }
  chmin(ans, n);
  cout << ans << endl;


  return 0;
}