제출 #1151449

#제출 시각아이디문제언어결과실행 시간메모리
1151449adaawfMatching (CEOI11_mat)C++20
63 / 100
1507 ms77500 KiB
#include <iostream> #include <vector> #include <map> using namespace std; long long int b = 1777013, bb, mod = 1e9 + 7, z = 0; int a[1000005], f[1000005], lazy[4000005]; long long int power(long long int x, long long int y, long long int mod) { long long int res = 1, h = x; while (y) { if (y & 1) res = res * h % mod; h = h * h % mod; y >>= 1; } return res; } map<int, int> mm; struct HASH { int x, c; } t[4000005]; HASH Merge(HASH aa, HASH bb) { HASH res; res.x = aa.x + bb.x; if (res.x >= mod) res.x -= mod; res.c = aa.c + bb.c; return res; } void push(int v) { if (lazy[v] == 1) return; lazy[v << 1] = 1ll * lazy[v << 1] * lazy[v] % mod; lazy[v << 1 | 1] = 1ll * lazy[v << 1 | 1] * lazy[v] % mod; t[v << 1].x = 1ll * t[v << 1].x * lazy[v] % mod; t[v << 1 | 1].x = 1ll * t[v << 1 | 1].x * lazy[v] % mod; lazy[v] = 1; } void update(int v, int tl, int tr, int l, int r, long long int x) { if (l > r) return; if (tl == l && tr == r) { t[v].x = 1ll * t[v].x * x % mod; lazy[v] = 1ll * lazy[v] * x % mod; return; } push(v); int mid = (tl + tr) >> 1; update(v << 1, tl, mid, l, min(r, mid), x); update(v << 1 | 1, mid + 1, tr, max(l, mid + 1), r, x); t[v] = Merge(t[v << 1], t[v << 1 | 1]); } void update2(int v, int tl, int tr, int x, long long int y) { if (tl == tr) { if (t[v].c == 0) { t[v] = {y, 1}; } else t[v] = {0, 0}; return; } push(v); int mid = (tl + tr) >> 1; if (mid >= x) update2(v << 1, tl, mid, x, y); else update2(v << 1 | 1, mid + 1, tr, x, y); t[v] = Merge(t[v << 1], t[v << 1 | 1]); } int sum(int v, int tl, int tr, int l, int r) { if (l > r) return 0; if (tl == l && tr == r) { return t[v].c; } push(v); int mid = (tl + tr) >> 1; return sum(v << 1, tl, mid, l, min(r, mid)) + sum(v << 1 | 1, mid + 1, tr, max(l, mid + 1), r); } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); long long int n, m, c = 0, d = 0; cin >> n >> m; f[0] = 1; b = 1777013; for (int i = 1; i <= n; i++) { f[i] = 1ll * f[i - 1] * b % mod; int x; cin >> x; c += 1ll * x * f[i]; d = (d + f[i]) % mod; c %= mod; } for (int i = 1; i <= m; i++) { cin >> a[i]; mm[a[i]] = 1; } bb = power(b, mod - 2, mod); for (auto &w : mm) w.second = ++z; vector<int> v; for (int i = 1; i <= n * 4; i++) lazy[i] = 1; for (int i = 1; i <= m; i++) { a[i] = mm[a[i]]; if (i > n) { update2(1, 1, m, a[i - n], 0); update(1, 1, m, a[i - n] + 1, m, bb); } int h = sum(1, 1, m, 1, a[i] - 1) + 1; update2(1, 1, m, a[i], 1ll * f[h] * i % mod); update(1, 1, m, a[i] + 1, m, b); if (i >= n && (t[1].x + mod - d * (i - n) % mod) % mod == c) { v.push_back(i - n + 1); } } cout << v.size() << '\n'; for (int w : v) cout << w << " "; }

컴파일 시 표준 에러 (stderr) 메시지

mat.cpp: In function 'void update2(int, int, int, int, long long int)':
mat.cpp:51:21: warning: narrowing conversion of 'y' from 'long long int' to 'int' [-Wnarrowing]
   51 |             t[v] = {y, 1};
      |                     ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...