結果
| 問題 |
No.2992 Range ABCD String Query
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2024-12-25 10:13:19 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 264 ms / 6,000 ms |
| コード長 | 1,340 bytes |
| コンパイル時間 | 958 ms |
| コンパイル使用メモリ | 78,908 KB |
| 実行使用メモリ | 32,000 KB |
| 最終ジャッジ日時 | 2024-12-25 10:13:35 |
| 合計ジャッジ時間 | 13,458 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 41 |
ソースコード
#include<iostream>
#include<vector>
#include<cassert>
#include<atcoder/segtree>
using namespace std;
struct dat{
int a,ab,abc,abcd,b,bc,bcd,c,cd,d;
};
dat op(dat l,dat r)
{
dat ret;
ret.a=l.a+r.a;
ret.ab=min(l.a+r.ab,l.ab+r.b);
ret.abc=min({l.a+r.abc,l.ab+r.bc,l.abc+r.c});
ret.abcd=min({l.a+r.abcd,l.ab+r.bcd,l.abc+r.cd,l.abcd+r.d});
ret.b=l.b+r.b;
ret.bc=min(l.b+r.bc,l.bc+r.c);
ret.bcd=min({l.b+r.bcd,l.bc+r.cd,l.bcd+r.d});
ret.c=l.c+r.c;
ret.cd=min(l.c+r.cd,l.cd+r.d);
ret.d=l.d+r.d;
return ret;
}
dat e(){return(dat){};}
dat INIT[4];
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
{//a
dat v={};
v.b=v.bc=v.bcd=v.c=v.cd=v.d=1;
v.a=v.ab=v.abc=v.abcd=0;
INIT[0]=v;
}
{//b
dat v={};
v.a=v.c=v.cd=v.d=1;
v.b=v.ab=v.abc=v.abcd=v.bc=v.bcd=0;
INIT[1]=v;
}
{//c
dat v={};
v.a=v.ab=v.b=v.d=1;
v.c=v.bc=v.abc=v.abcd=v.bcd=v.cd=0;
INIT[2]=v;
}
{//d
dat v={};
v.a=v.ab=v.abc=v.b=v.bc=v.c=1;
v.abcd=v.bcd=v.cd=v.d=0;
INIT[3]=v;
}
int N,Q;
string S;
cin>>N>>Q>>S;
vector<dat>init(N);
for(int i=0;i<N;i++)init[i]=INIT[S[i]-'A'];
atcoder::segtree<dat,op,e>seg(init);
for(;Q--;)
{
int OP;cin>>OP;
if(OP==1)
{
int x;char c;
cin>>x>>c;
x--;
seg.set(x,INIT[c-'A']);
}
else
{
int l,r;cin>>l>>r;
dat t=seg.prod(l-1,r);
cout<<t.abcd<<"\n";
}
}
}