提出 #31435255
ソースコード 拡げる
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
#define rep(i,n) for(int i=0; i<(int)(n); i++)
struct Func{ long long x=0, c=0; };
Func& operator+=(Func& l, Func r){ l.x += r.x; l.c += r.c; return l; }
Func& operator-=(Func& l, Func r){ l.x -= r.x; l.c -= r.c; return l; }
Func operator+(Func l, Func r){ return l += r; }
Func operator-(Func l, Func r){ return l -= r; }
int main() {
string S; cin >> S;
int N = S.size();
int L; cin >> L;
int cnt = (L + 1) / 2;{
int c = 0;
rep(i,N) if(S[i] == '(') c++;
if(c < cnt){
rep(k,N-L+1) cout << "-1\n";
return 0;
}
}
vector<int> posA;
vector<int> posB;
rep(i,N) if(S[i] == '('){
int c = posA.size();
posA.push_back(i - 2 * c);
posB.push_back(i - c);
}
int k = 0;
int posL = 0;
vector<Func> rqA(N*2);
vector<Func> rqB(N*2);
Func sum_rqA;
Func sum_rqB;
auto add_node = [&](int i) -> void {
rqA[N+posA[i]] += Func{1,posA[i]};
if(k-posL*2 <= posA[i]) sum_rqA += Func{1,posA[i]};
rqB[N+posB[i]] += Func{1,posB[i]};
if(posB[i] < k-posL) sum_rqB += Func{1,posB[i]};
};
auto rem_node = [&](int i) -> void {
rqA[N+posA[i]] -= Func{1,posA[i]};
if(k-posL*2 <= posA[i]) sum_rqA -= Func{1,posA[i]};
rqB[N+posB[i]] -= Func{1,posB[i]};
if(posB[i] < k-posL) sum_rqB -= Func{1,posB[i]};
};
auto increment_k = [&]() -> void {
sum_rqA -= rqA[N+k-posL*2];
sum_rqB += rqB[N+k-posL];
k++;
};
auto increment_posL = [&]() -> void {
rem_node(posL);
add_node(posL + cnt);
sum_rqA += rqA[N+k-posL*2-1];
sum_rqA += rqA[N+k-posL*2-2];
sum_rqB -= rqB[N+k-posL-1];
posL++;
};
auto decrement_posL = [&]() -> void {
posL--;
sum_rqA -= rqA[N+k-posL*2-1];
sum_rqA -= rqA[N+k-posL*2-2];
sum_rqB += rqB[N+k-posL-1];
add_node(posL);
rem_node(posL + cnt);
};
rep(i,cnt) add_node(i);
auto calc_score = [&]() -> long long {
auto cA = sum_rqA;
auto cB = sum_rqB;
long long ans = (cA.c - cA.x * (k - posL * 2)) + (-cB.c + cB.x * (k - posL));
return ans;
};
rep(kk,N-L+1){
if(kk != 0) increment_k();
long long score = calc_score();
while(posL + cnt != (int)posA.size()){
increment_posL();
long long new_score = calc_score();
if(score <= new_score){
decrement_posL();
break;
}
score = new_score;
}
cout << score << '\n';
}
return 0;
}
struct ios_do_not_sync{
ios_do_not_sync(){
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
}
} ios_do_not_sync_instance;
提出情報
| 提出日時 | |
|---|---|
| 問題 | M - Swapping Brackets |
| ユーザ | Nachia |
| 言語 | C++ (GCC 9.2.1) |
| 得点 | 800 |
| コード長 | 2560 Byte |
| 結果 | AC |
| 実行時間 | 72 ms |
| メモリ | 37524 KiB |
ジャッジ結果
| セット名 | Sample | All | ||||
|---|---|---|---|---|---|---|
| 得点 / 配点 | 0 / 0 | 800 / 800 | ||||
| 結果 |
|
|
| セット名 | テストケース |
|---|---|
| Sample | sample_00.txt, sample_01.txt, sample_02.txt |
| All | case_00.txt, case_01.txt, case_02.txt, case_03.txt, case_04.txt, case_05.txt, case_06.txt, case_07.txt, case_08.txt, case_09.txt, case_10.txt, case_11.txt, case_12.txt, case_13.txt, case_14.txt, case_15.txt, case_16.txt, case_17.txt, case_18.txt, case_19.txt, case_20.txt, case_21.txt, case_22.txt, case_23.txt, case_24.txt, case_25.txt, case_26.txt, case_27.txt, case_28.txt, case_29.txt, case_30.txt, case_31.txt, case_32.txt, case_33.txt, case_34.txt, case_35.txt, case_36.txt, case_37.txt, case_38.txt, case_39.txt, case_40.txt, case_41.txt, case_42.txt, case_43.txt, case_44.txt, case_45.txt, case_46.txt, case_47.txt, case_48.txt, case_49.txt, sample_00.txt, sample_01.txt, sample_02.txt |
| ケース名 | 結果 | 実行時間 | メモリ |
|---|---|---|---|
| case_00.txt | AC | 72 ms | 37064 KiB |
| case_01.txt | AC | 68 ms | 37152 KiB |
| case_02.txt | AC | 67 ms | 37444 KiB |
| case_03.txt | AC | 70 ms | 37204 KiB |
| case_04.txt | AC | 34 ms | 37180 KiB |
| case_05.txt | AC | 54 ms | 37188 KiB |
| case_06.txt | AC | 40 ms | 37384 KiB |
| case_07.txt | AC | 68 ms | 37132 KiB |
| case_08.txt | AC | 6 ms | 3768 KiB |
| case_09.txt | AC | 49 ms | 37204 KiB |
| case_10.txt | AC | 7 ms | 3876 KiB |
| case_11.txt | AC | 56 ms | 37076 KiB |
| case_12.txt | AC | 9 ms | 3820 KiB |
| case_13.txt | AC | 34 ms | 37156 KiB |
| case_14.txt | AC | 70 ms | 37136 KiB |
| case_15.txt | AC | 6 ms | 3780 KiB |
| case_16.txt | AC | 34 ms | 37168 KiB |
| case_17.txt | AC | 69 ms | 37136 KiB |
| case_18.txt | AC | 69 ms | 37156 KiB |
| case_19.txt | AC | 69 ms | 37348 KiB |
| case_20.txt | AC | 61 ms | 37468 KiB |
| case_21.txt | AC | 71 ms | 37524 KiB |
| case_22.txt | AC | 56 ms | 37496 KiB |
| case_23.txt | AC | 33 ms | 37200 KiB |
| case_24.txt | AC | 38 ms | 37168 KiB |
| case_25.txt | AC | 71 ms | 37168 KiB |
| case_26.txt | AC | 68 ms | 36988 KiB |
| case_27.txt | AC | 66 ms | 37076 KiB |
| case_28.txt | AC | 68 ms | 37168 KiB |
| case_29.txt | AC | 36 ms | 37204 KiB |
| case_30.txt | AC | 8 ms | 3688 KiB |
| case_31.txt | AC | 43 ms | 37164 KiB |
| case_32.txt | AC | 61 ms | 37172 KiB |
| case_33.txt | AC | 34 ms | 37204 KiB |
| case_34.txt | AC | 59 ms | 37208 KiB |
| case_35.txt | AC | 48 ms | 37500 KiB |
| case_36.txt | AC | 34 ms | 37060 KiB |
| case_37.txt | AC | 71 ms | 37048 KiB |
| case_38.txt | AC | 8 ms | 3872 KiB |
| case_39.txt | AC | 69 ms | 37436 KiB |
| case_40.txt | AC | 5 ms | 3588 KiB |
| case_41.txt | AC | 6 ms | 4172 KiB |
| case_42.txt | AC | 67 ms | 33672 KiB |
| case_43.txt | AC | 13 ms | 5364 KiB |
| case_44.txt | AC | 44 ms | 28060 KiB |
| case_45.txt | AC | 32 ms | 20440 KiB |
| case_46.txt | AC | 50 ms | 32884 KiB |
| case_47.txt | AC | 31 ms | 16152 KiB |
| case_48.txt | AC | 23 ms | 15864 KiB |
| case_49.txt | AC | 25 ms | 22664 KiB |
| sample_00.txt | AC | 2 ms | 3504 KiB |
| sample_01.txt | AC | 2 ms | 3584 KiB |
| sample_02.txt | AC | 2 ms | 3576 KiB |