답안 #1029822

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1029822 2024-07-21T11:29:28 Z Unforgettablepl Chorus (JOI23_chorus) C++17
0 / 100
0 ms 600 KB
#include <bits/stdc++.h>
using namespace std;

#define int long long

const int INF = 1e18;

struct fenwick{
	vector<int> tree;
	int n;
	fenwick(int n):n(n),tree(n+1){}
	void add(int k,int x){
		while(k<=n){
			tree[k]+=x;
			k+=k&-k;
		}
	}
	int get(int k){
		int ans = 0;
		while(k){
			ans+=tree[k];
			k-=k&-k;
		}
		return ans;
	}
};

int32_t main(){
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	int n,k;
	cin >> n >> k;
	string s;
	cin >> s;
	s.insert(s.begin(),'$');
	vector<int> posA(n+1);
	vector<int> posB(n+1);
	int cntA = 0,cntB = 0;
	for(int i=1;i<=2*n;i++){
		if(s[i]=='A'){
			posA[++cntA]=i;
		} else {
			posB[++cntB]=i;
		}
	}
	auto solve = [&](int penalty){
		vector<pair<int,int>> DP(n+1,{INF,INF});
		DP[0]={0,0};
		for(int i=1;i<=n;i++){
			fenwick addedA(2*n);
			fenwick addedB(2*n);
			int ans = penalty;
			for(int j=i+1;j<=n;j++)addedB.add(posB[j],1);
			for(int j=i;j;j--){
				ans+=addedA.get(2*n)-addedA.get(posB[j]);
				addedB.add(posB[j],1);
				ans+=addedB.get(posA[j]);
				addedA.add(posA[j],1);
				DP[i]=min(DP[i],{DP[j-1].first+ans,DP[j-1].second+1});
			}
		}
		return DP[n];
	};
	int best_penalty = -1;
	for(int jump=(1ll<<50);jump;jump/=2ll){
		if(solve(best_penalty+jump).second>k)best_penalty+=jump;
	}
	best_penalty++;
	cout << solve(best_penalty).first-solve(best_penalty).second*best_penalty << '\n';
}

Compilation message

chorus.cpp: In constructor 'fenwick::fenwick(long long int)':
chorus.cpp:10:6: warning: 'fenwick::n' will be initialized after [-Wreorder]
   10 |  int n;
      |      ^
chorus.cpp:9:14: warning:   'std::vector<long long int> fenwick::tree' [-Wreorder]
    9 |  vector<int> tree;
      |              ^~~~
chorus.cpp:11:2: warning:   when initialized here [-Wreorder]
   11 |  fenwick(int n):n(n),tree(n+1){}
      |  ^~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Incorrect 0 ms 600 KB Output isn't correct
7 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Incorrect 0 ms 600 KB Output isn't correct
7 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Incorrect 0 ms 600 KB Output isn't correct
7 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Incorrect 0 ms 600 KB Output isn't correct
7 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Incorrect 0 ms 600 KB Output isn't correct
7 Halted 0 ms 0 KB -