結果
問題 | No.1609 String Division Machine |
ユーザー | 👑 Nachia |
提出日時 | 2021-07-16 22:10:06 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 63 ms / 2,000 ms |
コード長 | 5,251 bytes |
コンパイル時間 | 1,100 ms |
コンパイル使用メモリ | 86,652 KB |
最終ジャッジ日時 | 2025-01-23 02:06:31 |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 5 |
other | AC * 37 |
ソースコード
// Nachia くんだよ #include <iostream> #include <vector> #include <algorithm> using namespace std; using ll = long long; using ull = unsigned long long; #define rep(i,n) for(int i=0; i<(n); i++) template<class S, S op(S,S), S e()> struct RQ { int N; vector<S> A; void mergev(int i){ if(i<N) A[i] = op(A[i*2], A[i*2+1]); } RQ(int n = 0){ N=1; while (N<n) N*=2; A.assign(N*2,e()); } RQ(const vector<S>& a) : RQ(a.size()){ for(int i=0; i<a.size(); i++) A[i+N] = a[i]; for(int i=N-1; i>=1; i--) mergev(i); } void set(int p, S x){ p+=N; A[p] = x; for(int d=1; (1<<d)<=N; d++) mergev(p>>d); } S prod(int l, int r, int a=0, int b=0, int i=-1){ if(i==-1){ a=0; b=N; i=1; } if(r<=a || b<=l) return e(); if(l<=a && b<=r) return A[i]; S q1 = prod(l, r, a, (a+b)/2, i*2); S q2 = prod(l, r, (a+b)/2, b, i*2+1); return op(q1, q2); } // bool cmp(S) template<class E> int minleft(int r, E cmp, int a=0, int b=0, int i=-1){ static S x; if(i == -1){ a = 0; b = N; i = 1; x = e(); } if(r <= a) return a; if(b <= r){ S nx = op(A[i], x); if(cmp(nx)){ x = nx; return a; } } if(b-a == 1) return b; int q = minleft(r, cmp, (a+b)/2, b, i*2+1); if(q > (a+b)/2) return q; return minleft(r, cmp, a, (a+b)/2, i*2); } // bool cmp(S) template<class E> int maxright(int l, E cmp, int a=0, int b=0, int i=-1){ static S x; if(i == -1){ a = 0; b = N; i = 1; x = e(); } if(b <= l) return b; if(l <= a){ S nx = op(x, A[i]); if(cmp(nx)){ x = nx; return b; } } if(b-a == 1) return a; int q = maxright(l, cmp, a, (a+b)/2, i*2); if(q < (a+b)/2) return q; return maxright(l, cmp, (a+b)/2, b, i*2+1); } }; struct RQ2 { struct S{ int a; }; struct F{ int x; }; static S op(S l, S r){ return { min(l.a, r.a) }; } static S e(){ return { 1001001001 }; } static void mapping(F f, S& x){ x.a = min(f.x,x.a); } static void compose(F f, F& x){ x.x = min(f.x,x.x); } static F id(){ return { 1001001001 }; } struct Node{ S s; F f; }; int N; vector<Node> A; void mapf(int i, F f){ compose(f, A[i].f); mapping(f, A[i].s); } void mergev(int i){ if(i<N) A[i].s = op(A[i*2].s, A[i*2+1].s); mapping(A[i].f, A[i].s); } void spread(int i){ if(i<N){ mapf(i*2, A[i].f); mapf(i*2+1, A[i].f); } A[i].f = id(); } RQ2(int n = 0){ N=1; while (N<n) N*=2; A.assign(N*2,{ e(), id() }); } RQ2(const vector<S>& a) : RQ2(a.size()){ for(int i=0; i<a.size(); i++) A[i+N].s = a[i]; for(int i=N-1; i>=1; i--) mergev(i); } void set(int p, S x){ for(int d=1; (1<<d)<=N; d++) spread(p>>d); p+=N; A[p].s = x; for(int d=1; (1<<d)<=N; d++) mergev(p>>d); } void apply(int l, int r, F x, int a=0, int b=0, int i=-1){ if(i==-1){ a=0; b=N; i=1; } if(r<=a || b<=l) return; if(l<=a && b<=r){ mapf(i, x); return; } spread(i); apply(l, r, x, a, (a+b)/2, i*2); apply(l, r, x, (a+b)/2, b, i*2+1); A[i].s = op(A[i*2].s, A[i*2+1].s); } S prod(int l, int r, int a=0, int b=0, int i=-1){ if(i==-1){ a=0; b=N; i=1; } if(r<=a || b<=l) return e(); if(l<=a && b<=r) return A[i].s; spread(i); S q1 = prod(l, r, a, (a+b)/2, i*2); S q2 = prod(l, r, (a+b)/2, b, i*2+1); return op(q1, q2); } // bool cmp(S) template<class E> int minleft(int r, E cmp, int a=0, int b=0, int i=-1){ static S x; if(i == -1){ a = 0; b = N; i = 1; x = e(); } if(r <= a) return a; if(b <= r){ S nx = op(A[i].s, x); if(cmp(nx)){ x = nx; return a; } } if(b-a == 1) return b; spread(i); int q = minleft(r, cmp, (a+b)/2, b, i*2+1); if(q > (a+b)/2) return q; return minleft(r, cmp, a, (a+b)/2, i*2); } // bool cmp(S) template<class E> int maxright(int l, E cmp, int a=0, int b=0, int i=-1){ static S x; if(i == -1){ a = 0; b = N; i = 1; x = e(); } if(b <= l) return b; if(l <= a){ S nx = op(x, A[i].s); if(cmp(nx)){ x = nx; return b; } } if(b-a == 1) return a; spread(i); int q = maxright(l, cmp, a, (a+b)/2, i*2); if(q < (a+b)/2) return q; return maxright(l, cmp, (a+b)/2, b, i*2+1); } }; int RmQe(){ return 1001001001; } int RmQop(int l,int r){ return min(l,r); } using RmQ = RQ2; //<int,RmQop,RmQe>; int RMQe(){ return -1001001001; } int RMQop(int l,int r){ return max(l,r); } using RMQ = RQ<int,RMQop,RMQe>; int main() { const int X = 200000; string S; cin >> S; int N = S.size(); RmQ ans(N); RMQ G(N); rep(i,N) if(S[i] != '?') G.set(i,S[i]*X+X-i-1); ans.apply(0,N,{(int)'z'}); ans.set(0,{(int)'z'}); if(G.prod(0,N) < 0){ cout << string(N,'a') << "\n"; return 0; } while(G.prod(0,N) >= 0){ int p = 0; while(true){ int x = G.prod(p,N); if(x < 0) break; int i = X - x % X - 1; int c = x / X; G.set(i,-1); ans.apply(p,i,{c}); p = i; } ans.apply(p+1,N,{'a'}); } rep(i,N) if(S[i] == '?') S[i] = ans.prod(i,i+1).a; cout << S << "\n"; return 0; } struct ios_do_not_sync{ ios_do_not_sync(){ ios::sync_with_stdio(false); cin.tie(nullptr); } } ios_do_not_sync_instance;