QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#670009#3040. ContainerNephren_SakuraWA 3ms35176kbC++141.9kb2024-10-23 20:14:342024-10-23 20:14:35

Judging History

This is the latest submission verdict.

  • [2024-10-23 20:14:35]
  • Judged
  • Verdict: WA
  • Time: 3ms
  • Memory: 35176kb
  • [2024-10-23 20:14:34]
  • Submitted

answer

#include<bits/stdc++.h>
using namespace std;
#define int long long
int sub,n,c,sum[1000005][2],dp[1005][1005],pre[1005][1005],a[1000005],in[1000005];
string s,t;
vector<int> id,ID[2],v[1000005];
queue<int> q;
vector<pair<int,int> > ans;
int help(int x){return (x+1)/2*c+(x/2)*4+(x%2)*3;}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>c>>s>>t;
	s=" "+s,t=" "+t;
	for(int i=1; i<=n; i++){
		sum[i][0]+=sum[i-1][0],sum[i][1]+=sum[i-1][1];
		if(s[i]=='2') id.push_back(i);
		if(t[i]=='2') ID[i%2].push_back(i),sum[i][i%2]++;
	}
	for(int i=0; i<=id.size(); i++)
		for(int j=0; j<=id.size(); j++)
			dp[i][j]=(int)1e18;
	dp[0][0]=0;
	for(int i=0; i<id.size(); i++)
		for(int j=0; j<=i; j++){
			if(dp[i][j]!=(int)1e18){
				if(j<ID[0].size()){
					int x=abs(ID[0][j]-id[i]),val=dp[i][j]+help(x)+max(0ll,sum[ID[0][j]][1]+j-i);
					if(dp[i+1][j+1]>val) dp[i+1][j+1]=val,pre[i+1][j+1]=0;
				}
				if(i-j<ID[1].size()){
					int x=abs(ID[1][i-j]-id[i]),val=dp[i][j]+help(x)+max(0ll,sum[ID[1][i-j]][0]-j);
					if(dp[i+1][j]>val) dp[i+1][j]=val,pre[i+1][j]=1;
				}
			}
		}
	int i=id.size(),j=ID[0].size();
	while(i){
		if(pre[i][j]) i--,a[i]=ID[1][i-j];
		else i--,j--,a[i]=ID[0][j];
	}
	for(int i=0; i<id.size(); i++) for(int j=i+1; j<id.size(); j++)
		if(a[i]<a[j]){
			if(id[i]<a[i]) v[j].push_back(i),in[i]++;
			else v[i].push_back(j),in[j]++;
		}
	for(int i=0; i<id.size(); i++) if(!in[i]) q.push(i);
	while(!q.empty()){
		int cur=q.front();
		q.pop();
		int x=id[cur],y=a[cur];
		while(x+2<=y) ans.push_back(make_pair(x,x+2)),x+=2;
		while(x-2>=y) ans.push_back(make_pair(x-2,x)),x-=2;
		while(x<y) ans.push_back(make_pair(x,x+1)),x++;
		while(x>y) ans.push_back(make_pair(x-1,x)),x--;
		for(int nxt:v[cur]){
			in[nxt]--;
			if(!in[nxt]) q.push(nxt);
		}
	}
	cout<<ans.size()<<'\n';
	sort(ans.begin(),ans.end());
	for(pair<int,int> p:ans) cout<<p.first<<' '<<p.second<<'\n';
	return 0;
}

詳細信息

Test #1:

score: 100
Accepted
time: 0ms
memory: 34528kb

input:

5 2
11221
21112

output:

2
1 3
4 5

result:

ok good job!

Test #2:

score: -100
Wrong Answer
time: 3ms
memory: 35176kb

input:

7 0
2212121
1212122

output:

4
1 2
2 4
4 6
6 7

result:

wrong answer invalid plan.