結果
| 問題 |
No.2325 Skill Tree
|
| コンテスト | |
| ユーザー |
shin3110
|
| 提出日時 | 2023-05-28 15:46:26 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,659 bytes |
| コンパイル時間 | 2,522 ms |
| コンパイル使用メモリ | 180,956 KB |
| 実行使用メモリ | 20,020 KB |
| 最終ジャッジ日時 | 2024-12-27 08:40:08 |
| 合計ジャッジ時間 | 28,487 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 25 WA * 11 |
ソースコード
/*
∧∧∩
( ゚∀゚)/ キタ━━━━━━(゚∀゚)━━━━━━!!!!
⊂ ノ ゆっくり見てってね!!!!!!!!
(つ ノ
o (ノ
\ ☆
| o
(⌒ ⌒ヽ / ☆
\ (´⌒ ⌒ ⌒ヾ /
('⌒ ; ⌒ ::⌒ )
(´ ) ::: ) /
☆─ (´⌒;: ::⌒`) :; )
*/
#include <bits/stdc++.h>
using namespace std;
#define rep(i, s, n) for (int i = (s); i < (int)(n); i++)
typedef long long ll;
#define _GLIBCXX_DEBUG
ll l[200009], a[200009];
bool f[200009];
ll gcd(int i, map<ll, ll>& was, vector<int>& pnt) {
f[i] = true;
ll w, num;
if(!f[a[i]]) {
num = gcd(a[i], was, pnt);
} else {
num = was[a[i]];
}
if(num == -1) {
return -1;
}
w = max(l[i], num);
pnt.push_back(w);
return w;
}
int countElementsLessThanOrEqual(const std::vector<int>& nums, int a) {
int left = 0;
int right = nums.size() - 1;
// 二分探索
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] <= a) {
left = mid + 1;
} else {
right = mid - 1;
}
}
// leftはa以下の要素の個数を表す
return left;
}
int main() {
ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int n; cin >> n;
rep(i, 2, n+1) {
cin >> l[i] >> a[i];
}
map<ll, ll> was;
rep(i, 1, n+1) {
was[i] = -1;
}
vector<int> pnt;
f[1] = true;
was[1] = 0;
pnt.push_back(0);
rep(i, 2, n+1) {
if(f[i]) continue;
f[i] = true;
ll num;
if(!f[a[i]]) {
num = gcd(a[i], was, pnt);
} else {
num = was[a[i]];
}
if(num == -1) {
was[i] = -1;
continue;
}
was[i] = max(l[i], num);
pnt.push_back(was[i]);
}
sort(pnt.begin(), pnt.end());
int q; cin >> q;
while(q--) {
int z; cin >> z;
if(z == 1) {
int x; cin >> x;
int cnt = countElementsLessThanOrEqual(pnt, x);
cout << cnt << endl;
} else {
int y; cin >> y;
cout << was[y] << endl;
}
}
}
shin3110