Submission #1271532

#TimeUsernameProblemLanguageResultExecution timeMemory
1271532WH8Xylophone (JOI18_xylophone)C++20
100 / 100
26 ms624 KiB
#include "xylophone.h"
#include <bits/stdc++.h>
using namespace std;

void solve(int n) {
	vector<int> d(n+1, 0);
	vector<vector<int>> pos(2, vector<int>(n+1, 0));
	for(int i=2;i<=n;i++){
		d[i]=query(i-1, i);
	}
	if(n==2){
		answer(1, 1);
		answer(2, 2);
		return;
	}
	pos[0][2]=d[2], pos[1][2]=-d[2];
	
	for(int i=3;i<=n;i++){
		int c=query(i-2, i);
		if(c==d[i]+d[i-1]){ // same direction
			pos[0][i]=(pos[0][i-1]<0?-d[i]:d[i]);
			pos[1][i]=(pos[1][i-1]<0?-d[i]:d[i]);
		}
		else {
			pos[0][i]=(pos[0][i-1]<0?d[i]:-d[i]);
			pos[1][i]=(pos[1][i-1]<0?d[i]:-d[i]);
		}
	}
	//~ for(int i=2;i<=n;i++){
		//~ cout<<pos[0][i]<<" " << pos[1][i]<<endl;
	//~ }
	int correct=-1;
	vector<vector<int>> sm(2, vector<int>(n+1, 0));
	vector<pair<int,int>> mn={{1, 1}, {1,1}};
	sm[0][1]=sm[1][1]=1;
	for(int i=2;i<=n;i++){
		sm[0][i]=sm[0][i-1]+pos[0][i];
		mn[0]=min(mn[0], {sm[0][i], i});
		sm[1][i]=sm[1][i-1]+pos[1][i];
		mn[1]=min(mn[1], {sm[1][i], i});
		//~ cout<<sm[0][i]<<" "<<sm[1][i]<<endl;
	}
	vector<vector<int>> res(2, vector<int>(n+1, 0));
	for(int i=1;i<=n;i++){
		res[0][i]=sm[0][i]+1-mn[0].first;
		res[1][i]=sm[1][i]+1-mn[1].first;
		//~ cout<<res[0][i]<<" "<<res[1][i]<<endl;
		if(res[0][i]==1 and correct==-1){
			correct=0;
		}
		if(res[1][i]==1 and correct==-1){
			correct=1;
		}
	}
	//~ for(int i=1;i<=n;i++)cout<<res[correct][i]<<endl;
	for(int i=1;i<=n;i++){
		answer(i, res[correct][i]);
	}	
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...