提出 #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
結果
AC × 3
AC × 53
セット名 テストケース
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