結果
| 問題 |
No.3265 地元に帰れば天才扱い!
|
| コンテスト | |
| ユーザー |
srjywrdnprkt
|
| 提出日時 | 2025-10-20 17:09:19 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 272 ms / 2,500 ms |
| コード長 | 1,950 bytes |
| コンパイル時間 | 3,167 ms |
| コンパイル使用メモリ | 282,436 KB |
| 実行使用メモリ | 12,672 KB |
| 最終ジャッジ日時 | 2025-10-20 17:09:38 |
| 合計ジャッジ時間 | 17,118 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 21 |
ソースコード
#include <bits/stdc++.h>
#include <atcoder/fenwicktree>
using namespace std;
using namespace atcoder;
using ll = long long;
//using mint = modint998244353;
int main(){
cin.tie(nullptr);
ios_base::sync_with_stdio(false);
/*
差分を考える。
X_kが元々住んでいた家をZ_kとする。
(R-L+1) * A_k - [L, R]のレートの和だけ減少、
Z_kを地元として含むX_k以外の岩井の数*A_kだけ増加し、
引越し後は、
(V-U+1) * A_k - [U, V]のレートの和だけ増加、
と
Y_kを地元として含むX_k以外の岩井の数*A_kだけ減少する。
だけ天才度の和が増加する。
range add point sumで家xを含む区間の数。
point add range sumで区間[U, V]内のレートの和を求める。
*/
ll N, M, Q, ans=0;
cin >> N >> M;
vector<ll> A(N), L(N), R(N);
fenwick_tree<ll> tc(M+1), ts(M+1);
vector<ll> where(N); //iが住んでいる家の番号
for (int i=0; i<N; i++){
cin >> A[i] >> L[i] >> R[i];
L[i]--;
R[i]--;
tc.add(L[i], 1);
tc.add(R[i]+1, -1);
ts.add(i, A[i]);
where[i] = i;
}
for (int i=0; i<N; i++) ans += (R[i]-L[i]+1) * A[i] - ts.sum(L[i], R[i]+1);
cin >> Q;
while(Q--){
ll X, Y, U, V, Z;
cin >> X >> Y >> U >> V;
X--; Y--; U--; V--;
ans -= (R[X]-L[X]+1) * A[X] - ts.sum(L[X], R[X]+1);
Z = where[X];
ans += (tc.sum(0, Z+1)-(L[X] <= Z && Z <= R[X])) * A[X];
where[X] = Y;
ts.add(Z, -A[X]);
ts.add(Y, A[X]);
tc.add(L[X], -1);
tc.add(R[X]+1, 1);
L[X] = U; R[X] = V;
tc.add(L[X], 1);
tc.add(R[X]+1, -1);
ans += (R[X]-L[X]+1) * A[X] - ts.sum(L[X], R[X]+1);
ans -= (tc.sum(0, Y+1)-(L[X] <= Y && Y <= R[X])) * A[X];
cout << ans << '\n';
}
return 0;
}
srjywrdnprkt