結果
| 問題 |
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;
Nachia