結果
| 問題 |
No.2611 Count 01
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2024-01-20 16:52:08 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 390 ms / 6,000 ms |
| コード長 | 2,456 bytes |
| コンパイル時間 | 1,773 ms |
| コンパイル使用メモリ | 175,928 KB |
| 実行使用メモリ | 29,568 KB |
| 最終ジャッジ日時 | 2024-09-28 05:41:18 |
| 合計ジャッジ時間 | 11,514 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 20 |
ソースコード
#include<bits/stdc++.h>
#include<atcoder/modint>
#include<atcoder/segtree>
using namespace std;
using namespace atcoder;
using mint = modint998244353;
struct S{
mint rsum[2];
mint lsum[2];
mint cnt[2];
mint rmul;
mint lmul;
mint siz;
mint g;
};
S op(S l, S r){
S res;
for(int i=0; i<2; i++){
res.rsum[i] = (l.rsum[i]+l.siz*r.cnt[i]) + r.rsum[i];
res.lsum[i] = l.lsum[i] + (r.lsum[i] + r.siz*l.cnt[i]);
res.cnt[i] = l.cnt[i] + r.cnt[i];
}
res.rmul = (l.rmul+r.cnt[1]*l.rsum[0]+r.cnt[0]*l.rsum[1]+l.siz*r.cnt[0]*r.cnt[1]) + r.rmul;
res.lmul = l.lmul + (r.lmul+l.cnt[1]*r.lsum[0]+l.cnt[0]*r.lsum[1]+r.siz*l.cnt[0]*l.cnt[1]);
res.siz = l.siz + r.siz;
res.g = l.g + r.g + r.siz*l.rmul + l.rsum[0]*r.lsum[1] + l.rsum[1]*r.lsum[0] + l.siz*r.lmul;
return res;
}
S e(){
S res;
for(int i=0; i<2; i++){
res.rsum[i] = 0;
res.lsum[i] = 0;
res.cnt[i] = 0;
}
res.rmul = 0;
res.lmul = 0;
res.siz = 0;
res.g = 0;
return res;
}
void solve(){
int n, q; cin >> n >> q;
segtree<S, op, e> seg(n);
for(int i=0; i<n; i++){
char c; cin >> c;
int cint = c-'0';
S tmp;
//初期化
for(int i=0; i<2; i++){
tmp.rsum[i] = 0;
tmp.lsum[i] = 0;
tmp.cnt[i] = 0;
}
tmp.rsum[cint]++;
tmp.lsum[cint]++;
tmp.cnt[cint]++;
tmp.rmul = 0;
tmp.lmul = 0;
tmp.siz = 1;
tmp.g = 0;
seg.set(i, tmp);
}
while(q--){
int type; cin >> type;
if(type==1){
int i; cin >> i;
i--;
int cint = 0;
if(seg.get(i).cnt[0]==1) cint = 1;
S tmp;
//初期化
for(int i=0; i<2; i++){
tmp.rsum[i] = 0;
tmp.lsum[i] = 0;
tmp.cnt[i] = 0;
}
tmp.rsum[cint]++;
tmp.lsum[cint]++;
tmp.cnt[cint]++;
tmp.rmul = 0;
tmp.lmul = 0;
tmp.siz = 1;
tmp.g = 0;
seg.set(i, tmp);
}
if(type==2){
int l, r; cin >> l >> r;
l--; r--;
cout << seg.prod(l, r+1).g.val() << '\n';
}
}
}
int main(){
cin.tie(nullptr);
ios::sync_with_stdio(false);
int T=1;
//cin >> T;
while(T--) solve();
}