結果
| 問題 | No.3756 Udon Network |
| ユーザー |
|
| 提出日時 | 2026-10-10 22:25:36 |
| 言語 | C++23(gcc16) (gcc 16.1.0 + boost 1.92.0 + ACL) |
| 結果 |
TLE
不安定
|
| 実行時間 | - |
| コード長 | 2,516 bytes |
| 記録 | |
| コンパイル時間 | 5,240 ms |
| コンパイル使用メモリ | 367,744 KB |
| 実行使用メモリ | 202,612 KB |
| 最終ジャッジ日時 | 2026-10-10 22:26:35 |
| 合計ジャッジ時間 | 13,331 ms |
|
ジャッジサーバーID (参考情報) |
judge1_0 / judge4_1 |
(要ログイン)
| サブタスク | 配点 | 結果 |
|---|---|---|
| Example | 0 % | AC * 8 |
| Subtask $1$ | 2 % | AC * 15 |
| Subtask $2$ | 4 % | AC * 22 |
| Subtask $3$ | 8 % | AC * 3 TLE * 1 -- * 5 |
| Subtask $4$ | 16 % | AC * 2 -- * 8 |
| Subtask $5$ | 32 % | AC * 3 -- * 7 |
| Subtask $6$ | 38 % | AC * 22 TLE * 1 -- * 30 |
| 合計 | 4 * 6% = 24 点 |
ソースコード
#include <bits/stdc++.h>
#define pb push_back
#define All(a) (a).begin(),(a).end()
#define Sz(a) ((int)(a).size())
#define pii pair<int,int>
#define f first
#define s second
#define INF (int)(1e18)
#define MOD (int)(1e9+7)
#define MAXN 500005
#define enl '\n'
#define DB(CODE) cout<<'\t'<<CODE<<'\n';
#define SP <<' '<<
#define int long long
typedef long long ll;
using namespace std;
int par[MAXN],sz[MAXN];
set<int> num[MAXN];
int root(int u){
return par[u]=(u==par[u])?u:root(par[u]);
}
void join(int u,int v){
if(sz[u]<sz[v]) swap(u,v);
par[v]=u;
sz[u]+=sz[v];
if(Sz(num[u])<Sz(num[v])) swap(num[u],num[v]);
for(auto &x: num[v]) num[u].insert(x);
num[v].clear();
}
void testcase(){
int n,m,q;
cin >> n >> m >> q;
int a[n];
for(int i=0; i<n; i++) cin >> a[i];
vector<pair<int,pii>> edge(m);
for(auto &p: edge){
cin >> p.s.f >> p.s.s >> p.f;
p.s.f--; p.s.s--;
}
sort(All(edge));
vector<int> w={0};
vector<vector<pii>> add(1);
int i=0,j=0;
while(i<m){
w.pb(edge[i].f);
add.pb(vector<pii>(0));
while(i<m && edge[i].f==edge[j].f){
add.back().pb(edge[i].s);
i++;
}
j=i;
}
m=add.size();
w.pb(-1);
vector<pii> qr(q);
vector<int> l(q,0),r(q,m-1);
for(auto &p: qr) cin >> p.f >> p.s,p.f--;
stack<int> bin[m];
for(int i=0; i<q; i++) bin[(l[i]+r[i])/2].push(i);
int done=0;
vector<int> ans(q,m);
while(done<q){
for(int i=0; i<n; i++){
par[i]=i; sz[i]=1;
num[i].clear();
num[i].insert(a[i]);
}
for(int i=0; i<m; i++){
// update
for(auto &e: add[i]){
int u=root(e.f),v=root(e.s);
if(u!=v) join(u,v);
}
// bsearch
while(!bin[i].empty()){
int idx=bin[i].top();
bin[i].pop();
if(l[idx]<=r[idx]){
if(Sz(num[root(qr[idx].f)])>=qr[idx].s){
r[idx]=i-1;
ans[idx]=i;
} else l[idx]=i+1;
if(l[idx]<=r[idx]) bin[(l[idx]+r[idx])/2].push(idx);
else done++;
}
}
}
}
for(int i=0; i<q; i++) cout << w[ans[i]] << enl;
}
signed main(){
cin.tie(0)->sync_with_stdio(false);
int t=1;
//cin >> t;
while(t--){
testcase();
}
return 0;
}
/*
*/