結果
問題 |
No.3244 Range Multiple of 8 Query
|
ユーザー |
|
提出日時 | 2025-08-22 23:35:49 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
TLE
|
実行時間 | - |
コード長 | 3,192 bytes |
コンパイル時間 | 3,979 ms |
コンパイル使用メモリ | 298,268 KB |
実行使用メモリ | 13,612 KB |
最終ジャッジ日時 | 2025-08-22 23:37:01 |
合計ジャッジ時間 | 21,366 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 21 TLE * 3 -- * 16 |
ソースコード
// Original Python3 code (must be included according to AtCoder rules) /* from bisect import* n,q=map(int,input().split()) s=input() e=[] for i in range(1000): if i%8==0 and'0'not in str(i): e+=[*str(i)], idx={} for i in'123456789': idx[i]=[] for i in range(n): idx[s[i]]+=i, INF=1<<60 bs=[-1]*10 for _ in range(q): l,r=map(int,input().split()) l-=1 d=r-l m=min(d,3) ans=INF for i in range(1,10): bs[i]=bisect(idx[str(i)],r-1)-1 for st in e: if m!=len(st): continue p={} a=0 pos=r-1 mv=[] for j in range(m): ns=st[~j] k=bs[int(ns)] if ns not in p: p[ns]=0 if 0<=k-p[ns]<len(idx[ns])and l<=idx[ns][k-p[ns]]: nxt=idx[ns][k-p[ns]] for t in mv: if t<idx[ns][k-p[ns]]: nxt-=1 a+=abs(pos-nxt) mv+=idx[ns][k-p[ns]], p[ns]+=1 else: a=INF break pos-=1 ans=min(ans,a) print([-1,ans][ans<INF]) */ #include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n, q; cin >> n >> q; string s; cin >> s; vector<string> e; for (int i = 0; i < 1000; i++) { if (i % 8 == 0) { string t = to_string(i); if (t.find('0') == string::npos) { string tmp = ""; for (char c : t) tmp.push_back(c); e.push_back(tmp); } } } unordered_map<char, vector<int>> idx; for (char c = '1'; c <= '9'; c++) idx[c] = {}; for (int i = 0; i < n; i++) { idx[s[i]].push_back(i); } const long long INF = 1LL << 60; vector<int> bs(10, -1); while (q--) { int l, r; cin >> l >> r; l -= 1; int d = r - l; int m = min(d, 3); long long ans = INF; for (int i = 1; i <= 9; i++) { auto &vec = idx['0' + i]; auto it = upper_bound(vec.begin(), vec.end(), r - 1); bs[i] = int(it - vec.begin()) - 1; } for (auto &st : e) { if (m != (int)st.size()) continue; unordered_map<char, int> p; long long a = 0; int pos = r - 1; vector<int> mv; bool ok = true; for (int j = 0; j < m; j++) { char ns = st[m - 1 - j]; // st[~j] in Python int k = bs[ns - '0']; if (!p.count(ns)) p[ns] = 0; int idxpos = k - p[ns]; if (0 <= idxpos && idxpos < (int)idx[ns].size() && l <= idx[ns][idxpos]) { int nxt = idx[ns][idxpos]; for (int t : mv) { if (t < idx[ns][idxpos]) nxt -= 1; } a += abs(pos - nxt); mv.push_back(idx[ns][idxpos]); p[ns] += 1; } else { a = INF; ok = false; break; } pos -= 1; } ans = min(ans, a); } if (ans < INF) cout << ans << "\n"; else cout << -1 << "\n"; } }