結果
| 問題 |
No.469 区間加算と一致検索の問題
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2017-12-30 23:18:05 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,702 bytes |
| コンパイル時間 | 2,255 ms |
| コンパイル使用メモリ | 206,396 KB |
| 最終ジャッジ日時 | 2025-01-05 06:43:29 |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 46 WA * 3 |
ソースコード
#include <bits/stdc++.h>
#define show(x) cerr << #x << " = " << x << endl
using namespace std;
using ll = long long;
template <typename T>
ostream& operator<<(ostream& os, const vector<T>& v)
{
os << "sz:" << v.size() << "\n[";
for (const auto& p : v) {
os << p << ",";
}
os << "]\n";
return os;
}
constexpr ll MOD1 = (ll)1e9 + 7LL;
constexpr ll MOD2 = (ll)1e9 + 9LL;
int main()
{
cin.tie(0);
ios::sync_with_stdio(false);
int N, Q;
cin >> N >> Q;
mt19937 mt{random_device{}()};
uniform_int_distribution<ll> dist1{2, MOD1 - 1};
const ll base1 = dist1(mt);
uniform_int_distribution<ll> dist2{2, MOD2 - 1};
const ll base2 = dist2(mt);
vector<ll> value1(N, 1);
vector<ll> value2(N, 1);
for (int i = 1; i < N; i++) {
value1[i] = value1[i - 1] * base1;
value1[i] %= MOD1;
value2[i] = value2[i - 1] * base2;
value2[i] %= MOD2;
}
ll x1 = 0;
ll x2 = 0;
using P = pair<ll, ll>;
map<P, int> hash;
for (int q = 0; q < Q; q++) {
char c;
cin >> c;
if (c == '!') {
int l, r;
ll v;
cin >> l >> r >> v;
const ll add1 = ((r == N ? 0LL : value1[r] * ((MOD1 - v) % MOD1)) + value1[l] * ((MOD1 + v) % MOD1)) % MOD1;
const ll add2 = ((r == N ? 0LL : value2[r] * ((MOD2 - v) % MOD2)) + value2[l] * ((MOD2 + v) % MOD2)) % MOD2;
x1 = (x1 + add1) % MOD1;
x2 = (x2 + add2) % MOD2;
if (hash.find({x1, x2}) == hash.end()) {
hash[{x1, x2}] = q + 1;
}
} else {
cout << hash[{x1, x2}] << endl;
}
}
return 0;
}