結果
問題 |
No.3244 Range Multiple of 8 Query
|
ユーザー |
|
提出日時 | 2025-08-22 23:54:23 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 3,007 ms / 5,000 ms |
コード長 | 3,085 bytes |
コンパイル時間 | 3,704 ms |
コンパイル使用メモリ | 294,472 KB |
実行使用メモリ | 11,868 KB |
最終ジャッジ日時 | 2025-08-22 23:55:18 |
合計ジャッジ時間 | 51,846 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 40 |
ソースコード
/* from bisect import* n,q=map(int,input().split()) s=[*map(int,input())] e=[] for i in range(1000): if i%8==0 and'0'not in str(i): e+=[*map(int,str(i))], idx=[[]for _ in range(10)] for i in range(n): idx[s[i]]+=i, INF=1<<60 bs=[len(idx[i])-1 for i in range(10)] lr=[[*map(int,input().split())]+[i]for i in range(q)] lr.sort(key=lambda x:-x[1]) ans1=[-1]*q for l,r,nq in lr: l-=1 m=min(r-l,3) ans=INF for i in range(1,10): while 0<=bs[i]and idx[i][bs[i]]>=r: bs[i]-=1 for st in e: if m!=len(st): continue p=[0]*10 a=0 pos=r-1 mv=[] for j in range(m): ns=st[~j] k=bs[ns] 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) if ans<INF: ans1[nq]=ans print(*ans1,sep='\n') */ #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_str;cin>>s_str; vector<int> s(n); for(int i=0;i<n;i++) s[i]=s_str[i]-'0'; vector<vector<int>> e; for(int i=0;i<1000;i++){ if(i%8==0){ string t=to_string(i); if(t.find('0')==string::npos){ vector<int> digits; for(char c:t) digits.push_back(c-'0'); e.push_back(digits); } } } vector<vector<int>> idx(10); for(int i=0;i<n;i++) idx[s[i]].push_back(i); const long long INF=1LL<<60; vector<int> bs(10); for(int i=0;i<10;i++) bs[i]=(int)idx[i].size()-1; vector<array<int,3>> lr(q); for(int i=0;i<q;i++){ int l,r;cin>>l>>r; lr[i]={l,r,i}; } sort(lr.begin(),lr.end(),[](auto &a,auto &b){return a[1]>b[1];}); vector<long long> ans1(q,-1); for(auto [l,r,nq]:lr){ l-=1; int m=min(r-l,3); long long ans=INF; for(int i=1;i<10;i++){ while(bs[i]>=0 && idx[i][bs[i]]>=r) bs[i]--; } for(auto &st:e){ if(m!=(int)st.size()) continue; vector<int> p(10,0); long long a=0; int pos=r-1; vector<int> mv; for(int j=0;j<m;j++){ int ns=st[m-1-j]; // ~j in python = -j-1, so reverse int k=bs[ns]; if(0<=k-p[ns] && k-p[ns]<(int)idx[ns].size() && l<=idx[ns][k-p[ns]]){ int nxt=idx[ns][k-p[ns]]; for(int t:mv){ if(t<idx[ns][k-p[ns]]) nxt-=1; } a+=abs(pos-nxt); mv.push_back(idx[ns][k-p[ns]]); p[ns]+=1; }else{ a=INF; break; } pos-=1; } ans=min(ans,a); } if(ans<INF) ans1[nq]=ans; } for(auto v:ans1) cout<<v<<"\n"; }