結果
| 問題 | No.3756 Udon Network |
| ユーザー |
|
| 提出日時 | 2026-10-16 10:50:24 |
| 言語 | C++23 (gcc 15.3.0 + boost 1.92.0 + ACL) |
| 結果 |
AC
不安定
|
| 実行時間 | 1,488 ms / 2,000 ms |
| + 19µs | |
| コード長 | 1,787 bytes |
| 記録 | |
| コンパイル時間 | 2,966 ms |
| コンパイル使用メモリ | 357,720 KB |
| 実行使用メモリ | 102,160 KB |
| 最終ジャッジ日時 | 2026-10-24 13:07:16 |
| 合計ジャッジ時間 | 44,650 ms |
|
ジャッジサーバーID (参考情報) |
judge3_0 / judge1_0 |
| 純コード判定待ち |
(要ログイン)
| サブタスク | 配点 | 結果 |
|---|---|---|
| Example | 0 % | AC * 8 |
| Subtask $1$ | 2 % | AC * 15 |
| Subtask $2$ | 4 % | AC * 22 |
| Subtask $3$ | 8 % | AC * 9 |
| Subtask $4$ | 16 % | AC * 10 |
| Subtask $5$ | 32 % | AC * 10 |
| Subtask $6$ | 38 % | AC * 53 |
| 合計 | 4 * 100% = 400 点 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
int main(void){
int n,m,q;
cin>>n>>m>>q;
vector<vector<array<int,2>>>parent(n),ans(n);
vector<vector<int>>d(n);
vector<set<int>>s(n);
for(int i=0;i<n;i++){
int a;
cin>>a;
parent[i].push_back({0,i});
ans[i].push_back({0,1});
d[i].push_back(i);
s[i].insert(a);
}
vector<array<int,3>>edge(m);
for(int i=0;i<m;i++){
cin>>edge[i][1]>>edge[i][2]>>edge[i][0];
edge[i][1]--,edge[i][2]--;
}
sort(edge.begin(),edge.end());
vector<int>xs;
xs.push_back(0);
for(auto &x:edge){
int p1=parent[x[1]][(int)parent[x[1]].size()-1][1],p2=parent[x[2]][(int)parent[x[2]].size()-1][1];
if(p1==p2)continue;
xs.push_back(x[0]);
if(d[p1].size()>d[p2].size())swap(p1,p2);
for(auto &y:d[p1]){
d[p2].push_back(y);
parent[y].push_back({x[0],p2});
}
for(auto &y:s[p1]){
s[p2].insert(y);
}
ans[p2].push_back({x[0],(int)s[p2].size()});
}
while(q--){
int now,c;
cin>>now>>c;
now--;
int mn=0,mx=xs.size();
while(mx-mn){
int mid=(mx+mn)/2;
int val=xs[mid];
auto iter=lower_bound(parent[now].begin(), parent[now].end(),(array<int,2>){val+1,-1});
int pos = iter-parent[now].begin()-1;
int par=parent[now][pos][1];
iter=lower_bound(ans[par].begin(), ans[par].end(),(array<int,2>){val+1,-1});
pos=iter-ans[par].begin()-1;
if(ans[par][pos][1]>=c){
mx=mid;
}else{
mn=mid+1;
}
}
cout<<(mx==xs.size()?-1:xs[mx])<<endl;
}
return 0;
}