結果
| 問題 |
No.235 めぐるはめぐる (5)
|
| コンテスト | |
| ユーザー |
nanophoto12
|
| 提出日時 | 2021-05-05 12:03:36 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 1,576 ms / 10,000 ms |
| コード長 | 4,444 bytes |
| コンパイル時間 | 4,299 ms |
| コンパイル使用メモリ | 265,856 KB |
| 最終ジャッジ日時 | 2025-01-21 07:12:20 |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 3 |
ソースコード
#include <bits/stdc++.h>
#define M_PI 3.14159265358979323846 // pi
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll, ll> P;
typedef tuple<ll, ll, ll> t3;
typedef tuple<ll, ll, ll, ll> t4;
#define rep(a,n) for(ll a = 0;a < n;a++)
#define repi(a,b,n) for(ll a = b;a < n;a++)
#include <bits/stdc++.h>
using namespace std;
template<typename T>
void chmax(T& reference, T value) {
reference = max(reference, value);
}
template<typename T>
void chmaxmap(map<T, T>& m, T key, T value) {
if (m.count(key)) {
chmax(m[key], value);
}
else {
m[key] = value;
}
}
template<typename T>
void chmin(T& reference, T value) {
reference = min(reference, value);
}
#include <atcoder/all>
using namespace atcoder;
typedef modint1000000007 mint;
template< typename G >
struct HeavyLightDecomposition {
G& g;
vector< int > sz, in, out, head, rev, par;
HeavyLightDecomposition(G& g) :
g(g), sz(g.size()), in(g.size()), out(g.size()), head(g.size()), rev(g.size()), par(g.size()) {}
void dfs_sz(int idx, int p) {
par[idx] = p;
sz[idx] = 1;
if (g[idx].size() && g[idx][0] == p) swap(g[idx][0], g[idx].back());
for (auto& to : g[idx]) {
if (to == p) continue;
dfs_sz(to, idx);
sz[idx] += sz[to];
if (sz[g[idx][0]] < sz[to]) swap(g[idx][0], to);
}
}
void dfs_hld(int idx, int par, int& times) {
in[idx] = times++;
rev[in[idx]] = idx;
for (auto& to : g[idx]) {
if (to == par) continue;
head[to] = (g[idx][0] == to ? head[idx] : to);
dfs_hld(to, idx, times);
}
out[idx] = times;
}
void build() {
dfs_sz(0, -1);
int t = 0;
dfs_hld(0, -1, t);
}
int la(int v, int k) {
while (1) {
int u = head[v];
if (in[v] - k >= in[u]) return rev[in[v] - k];
k -= in[v] - in[u] + 1;
v = par[u];
}
}
int lca(int u, int v) {
for (;; v = par[head[v]]) {
if (in[u] > in[v]) swap(u, v);
if (head[u] == head[v]) return u;
}
}
template< typename T, typename Q, typename F >
T query(int u, int v, const T& ti, const Q& q, const F& f, bool edge = false) {
T l = ti, r = ti;
for (;; v = par[head[v]]) {
if (in[u] > in[v]) swap(u, v), swap(l, r);
if (head[u] == head[v]) break;
l = f(q(in[head[v]], in[v] + 1), l);
}
return f(f(q(in[u] + edge, in[v] + 1), l), r);
}
template< typename Q >
void add(int u, int v, const Q& q, bool edge = false) {
for (;; v = par[head[v]]) {
if (in[u] > in[v]) swap(u, v);
if (head[u] == head[v]) break;
q(in[head[v]], in[v] + 1);
}
q(in[u] + edge, in[v] + 1);
}
};
typedef vector<vector<int>> UnWeightedGraph;
struct S {
mint value;
mint rate;
};
using F = mint;
S op(S a, S b) { return { a.value + b.value, a.rate + b.rate }; }
S e() { return { 0, 0 }; }
S mapping(F f, S x) {
auto add = f * x.rate;
auto cost = x.value + add;
return { cost, x.rate };
}
F composition(F f, F g) { return f + g; }
F id() { return 0; }
int main() {
int n;
cin >> n;
vector<ll> s(n), c(n);
rep(i, n) cin >> s[i];
rep(i, n) cin >> c[i];
vector<vector<int>> g(n);
rep(i, n - 1) {
int a, b;
cin >> a >> b;
a--; b--;
g[a].push_back(b);
g[b].push_back(a);
}
HeavyLightDecomposition<UnWeightedGraph> hld(g);
hld.build();
lazy_segtree<S, op, e, F, mapping, composition, id> tree(n);
rep(i, n) {
auto id = hld.rev[i];
tree.set(i, { s[id], c[id] });
}
int q;
cin >> q;
rep(i, q) {
ll id, x, y, z;
cin >> id >> x >> y;
x--; y--;
if (id == 0) {
cin >> z;
hld.add(x, y, [&](int x, int y) {
tree.apply(x, y, (mint)z);
});
}
else {
auto cost = hld.query(x, y, (mint)0LL, [&](int x, int y) {
auto p = tree.prod(x, y);
return p.value;
}, [&](auto x, auto y) {
return x + y;
});
cout << cost.val() << endl;
}
}
//cout << ans << endl;
return 0;
}
nanophoto12