結果
| 問題 | No.3639 Itsukin |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-08-25 14:24:00 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.90.0) |
| 結果 |
AC
|
| 実行時間 | 148 ms / 2,000 ms |
| + 537µs | |
| コード長 | 3,076 bytes |
| 記録 | |
| コンパイル時間 | 2,282 ms |
| コンパイル使用メモリ | 347,892 KB |
| 実行使用メモリ | 15,872 KB |
| 最終ジャッジ日時 | 2026-08-25 14:24:58 |
| 合計ジャッジ時間 | 8,546 ms |
|
ジャッジサーバーID (参考情報) |
judge3_0 / judge2_0 |
(要ログイン)
| サブタスク | 配点 | 結果 |
|---|---|---|
| サンプル | 0 % | AC * 1 |
| 小課題1 | 10 % | AC * 6 |
| 小課題2 | 15 % | AC * 5 |
| 小課題3 | 15 % | AC * 16 |
| 小課題4 | 20 % | AC * 10 |
| 小課題5 | 10 % | AC * 15 |
| 小課題6 | 30 % | AC * 35 |
| 合計 | 100 点 |
ソースコード
#include <bits/stdc++.h>
#include <cassert>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
using pll = pair<ll,ll>;
using vb = vector<bool>;
using vi = vector<int>;
using vll = vector<long long>;
using vvi = vector<vi>;
using vvll = vector<vll>;
using vpii = vector<pii>;
using vpll = vector<pll>;
using vs = vector<string>;
using vc = vector<char>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define all(a) (a).begin(), (a).end()
#define uniq(v) sort(all(v)), (v).erase(unique(all(v)),(v).end())
#define lb(v,x) int(lower_bound(all(v),(x))-(v).begin())
#define ub(v,x) int(upper_bound(all(v),(x))-(v).begin())
#define rrep(i,n) for(int i = (int)(n) - 1; i>=0; i--)
#define rep1(i,n) for(int i=1; i <=(int)(n);i++)
#define reps(i,s,n) for(int i=(int)(s);i<(int)(n); i++)
#define koz " "
#define tor "\n"
template<class T> using min_pq = priority_queue<T, vector<T>, greater<T>>;
template<class T> bool chmin(T& a, const T& b){if(b<a){a=b;return true;}return false;}
template<class T> bool chmax(T& a, const T& b){if(a<b){a=b;return true;}return false;}
template<typename T, typename U> T ceil(T x, U y){
assert(y!=0);
if(y<0) x=-x,y=-y;
return (x>0 ? (x+y-1)/y : x/y);
}
template<typename T, typename U> T floor(T x, U y){
assert(y!=0);
if(y<0) x=-x,y=-y;
return (x>0 ? x/y : (x-y+1)/y);
}
template<typename T> int popcnt(T x){return __builtin_popcountll(x);}
const int dx[]={1,0,-1,0,1,1,-1,-1};
const int dy[]={0,1,0,-1,1,-1,1,-1};
const int INF = 1045141919;
const ll LINF = 3643648101145141919;
struct UnionFind {
vector<int> par, sz;
UnionFind(int n) : par(n, -1), sz(n, 1) {
iota(all(par),0);
}
int find(int x) {
if (par[x] == x) return x;
return par[x] = find(par[x]);
}
bool unite(int x, int y) {
int rx = find(x); int ry = find(y);
if (rx == ry) return false;
if (sz[rx] < sz[ry]) swap(rx, ry);
par[ry] = rx;
sz[rx] += sz[ry];
return true;
}
bool same(int x, int y) {
return find(x) == find(y);
}
int size(int x) {
return sz[find(x)];
}
};
void solve(){
int n,m;
cin >> n >> m;
vector<tuple<ll,int,int>> edge(m);
rep(i,m){
int u,v;
cin >> u >> v;
u--,v--;
ll w;
cin >> w;
edge[i]={w,u,v};
}
int q;
cin >> q;
vector<tuple<ll,int,int>> que(q);
rep(i,q){
ll p,t;
cin >> p >> t;
t--;
que[i]={p,t,i};
}
vll ans(q);
sort(all(que));
sort(all(edge));
UnionFind uf(n);
int idx=0;
for(auto [p,t,num]:que){
while(idx<m){
auto[w,u,v]=edge[idx];
if(w<=p){
uf.unite(u,v);
idx++;
}
else break;
}
ans[num]=uf.sz[uf.find(t)];
}
rep(i,q) cout << ans[i] << tor;
}
int main() {
cin.tie(nullptr);
ios::sync_with_stdio(false);
cout << fixed << setprecision(16);
int _ = 1;
//cin >> _;
while(_--) solve();
}