結果
問題 |
No.3265 地元に帰れば天才扱い!
|
ユーザー |
![]() |
提出日時 | 2025-09-11 00:14:00 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 796 ms / 2,500 ms |
コード長 | 2,995 bytes |
コンパイル時間 | 4,107 ms |
コンパイル使用メモリ | 286,888 KB |
実行使用メモリ | 18,992 KB |
最終ジャッジ日時 | 2025-09-11 00:14:30 |
合計ジャッジ時間 | 24,912 ms |
ジャッジサーバーID (参考情報) |
judge / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 21 |
ソースコード
#include <bits/stdc++.h> using namespace std; #define For(i, a, b) for(int i = (a); i < (b); i++) #define rep(i, n) For(i, 0, n) #define rFor(i, a, b) for(int i = (a); i >= (b); i--) #define ALL(v) (v).begin(), (v).end() #define rALL(v) (v).rbegin(), (v).rend() #define SZ(v) ((int)(v).size()) using lint = long long; using ld = long double; const int INF = 2000000000; const lint LINF = 1000000000000000000; // 真上から反時計回り const int di[] = {-1, 0, 1, 0}; const int dj[] = {0, -1, 0, 1}; const int di8[] = {-1, -1, 0, 1, 1, 1, 0, -1}; const int dj8[] = {0, -1, -1, -1, 0, 1, 1, 1}; struct SetupIo { SetupIo() { ios::sync_with_stdio(false); cin.tie(nullptr); cout << fixed << setprecision(15); cerr << fixed << setprecision(15); } } setupio; template <class T> bool chmin(T &a, const T &b) { return a > b ? a = b, 1 : 0; } template <class T> bool chmax(T &a, const T &b) { return a < b ? a = b, 1 : 0; } template <class T> T mypow(T a, T b) { T res = 1; while (b) { if (b & 1) { res *= a; } a *= a; b >>= 1; } return res; } template <class T> T modpow(T a, T b, T mod) { T res = 1; while (b) { if (b & 1) { res = (res * a) % mod; } a = (a * a) % mod; b >>= 1; } return res; } #include <atcoder/segtree> #include <atcoder/lazysegtree> using S = lint; S op(S a, S b) { return a + b; } S e() { return 0; } int main() { int N, M; cin >> N >> M; vector<lint> A(N); vector<int> L(N), R(N); rep(i, N) { cin >> A[i] >> L[i] >> R[i]; L[i]--; } vector<int> house(N); rep(i, N) { house[i] = i; } atcoder::segtree<S, op, e> rating(M); rep(i, N) { rating.set(house[i], A[i]); } atcoder::lazy_segtree<S, op, e, S, op, op, e> jimoto(M); rep(i, N) { jimoto.apply(L[i], R[i], 1); } lint ans = 0; rep(i, N) { ans += A[i] * (R[i] - L[i]) - rating.prod(L[i], R[i]); } int Q; cin >> Q; rep(_, Q) { int x, y, u, v; cin >> x >> y >> u >> v; x--, y--, u--; // 一旦岩井星人 x を別の場所へ置いておく // 岩井星人 x の天才度が減少 ans -= A[x] * (R[x] - L[x]) - rating.prod(L[x], R[x]); jimoto.apply(L[x], R[x], -1); // 岩井星人 x のいた家が空になることで, x 以外の星人の天才度が変化 ans += A[x] * jimoto.get(house[x]); // 岩井星人 x を新たな家に引っ越しさせる rating.set(house[x], 0); house[x] = y; rating.set(house[x], A[x]); // 岩井星人 x が新たな家に来ることで, x 以外の星人の天才度が変化 ans -= A[x] * jimoto.get(house[x]); // 岩井星人 x の天才度が変化 L[x] = u, R[x] = v; ans += A[x] * (R[x] - L[x]) - rating.prod(L[x], R[x]); jimoto.apply(L[x], R[x], 1); cout << ans << "\n"; } }