QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#645318#3040. ContainerY204335WA 0ms8364kbC++142.1kb2024-10-16 17:43:452024-10-16 17:43:45

Judging History

你现在查看的是最新测评结果

  • [2024-10-16 17:43:45]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:8364kb
  • [2024-10-16 17:43:45]
  • 提交

answer

#include<bits/stdc++.h>
#define fir first
#define sec second
using namespace std;
const int N=1010,inf=0x3f3f3f3f;
int n,c,cnt[2][N],dp[N][N],lst[N][N],nxt[N],sum[N];
string s,t;
vector<int>a,b[2],e[N];
vector<pair<int,int>>ans;
int calc(int x){
	return ((x/2+(x&1))*c+x/2*4+3*(x&1));
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(nullptr);
	cin>>n>>c>>s>>t;
	s='#'+s;
	t='#'+t;
	for(int i=1;i<=n;i++){
		cnt[0][i]=cnt[0][i-1];
		cnt[1][i]=cnt[1][i-1];
		if(s[i]=='B'){
			a.push_back(i);
		}
		if(t[i]=='B'){
			b[i&1].push_back(i);
			cnt[i&1][i]++;
		}
	}
	memset(dp,0x3f,sizeof(dp));
	dp[0][0]=0;
	for(int i=0;i<(int)a.size();i++){
		for(int j=0;j<=i;j++){
			if(dp[i][j]!=inf){
				if(j+1<=(int)b[0].size()){
					int temp=dp[i][j]+calc(abs(b[0][(j+1)-1]-a[(i+1)-1]))+max(0,cnt[1][b[0][(j+1)-1]]-(i-j));
					if(dp[i+1][j+1]>temp){
						dp[i+1][j+1]=temp;
						lst[i+1][j+1]=1;
					}
				}
				if(i-j+1<=(int)b[1].size()){
					int temp=dp[i][j]+calc(abs(b[1][(i-j+1)-1]-a[(i+1)-1]))+max(0,cnt[0][b[1][(i-j+1)-1]]-j);
					if(dp[i+1][j]>temp){
						dp[i+1][j]=temp;
						lst[i+1][j]=0;
					}
				}
			}
		}
	}
	int i=a.size(),j=b[0].size();
	while(i){
		if(lst[i][j]){
			i--;
			j--;
			nxt[i]=b[0][j];
		}
		else{
			i--;
			nxt[i]=b[1][i-j];
		}
	}
	for(int i=0;i<(int)a.size();i++){
		for(int j=i+1;j<(int)a.size();j++){
			if(nxt[i]<nxt[j]){
				if(a[i]<nxt[i]){
					e[j].push_back(i);
					sum[i]++;
				}
				else{
					e[i].push_back(j);
					sum[j]++;
				}
			}
		}
	}
	queue<int>du;
	for(int i=0;i<(int)a.size();i++){
		if(!sum[i]){
			du.push(i);
		}
	}
	while(!du.empty()){
		int nw=du.front(),x=a[nw];
		du.pop();
		if(x>nxt[nw]){
			while(nxt[nw]<=x-2){
				ans.push_back({x-2,x});
				x-=2;
			}
		}
		if(x<nxt[nw]){
			while(x+2<=nxt[nw]){
				ans.push_back({x,x+2});
				x+=2;
			}
		}
		if(x!=nxt[nw]){
			if(x>nxt[nw])swap(x,nxt[nw]);
			ans.push_back({x,nxt[nw]});
		}
		for(auto i:e[nw]){
			sum[i]--;
			if(!sum[i]){
				du.push(i);
			}
		}
	}
	cout<<ans.size()<<endl;
	for(auto i:ans){
		cout<<i.fir<<' '<<i.sec<<endl;
	}
	return 0;
}

详细

Test #1:

score: 0
Wrong Answer
time: 0ms
memory: 8364kb

input:

5 2
11221
21112

output:

0

result:

wrong answer invalid plan.