kmjp's blog

競技プログラミング参加記です

TopCoder SRM 835 : Div1 Easy Div2 Hard SortTwoArrays

ジャッジはいまだに問題が残ってる…?
https://community.topcoder.com/stat?c=problem_statement&pm=17777

問題

2つの長さNの整数列A,Bがある。
Aの1要素とBの1要素を選んで入れ替える、ということを最大3N回行い、A,Bともに昇順となるようにせよ。

解法

Aの最小値をBの先頭、Bの最小値をAの先頭に持ってくる、という作業を最大3手で行おう。
こうするとA,Bが1要素ずつ位置が確定するので、3N回で条件を満たすことができる。

なお、この問題はNの上限は1000なので、3N回の処理を行おうとすると6000要素の配列を返さなければならない。
ただ、ジャッジがそのような配列をうまく受け取ってくれない様子。よって以下のコードはNが大きい場合にはシステムテストが通らない。

class SortTwoArrays {
	public:
	vector<int> R;
	vector<int> A,B;
	void go(int x,int y) {
		R.push_back(x);
		R.push_back(y);
		swap(A[x],B[y]);
	}
	vector <int> twoSorts(int N, vector <int> a, vector <int> b) {
		R.clear();
		A=a;
		B=b;
		int i,j;
		FOR(i,N) {
			vector<pair<int,int>> V;
			int x=min_element(A.begin()+i,A.begin()+N)-A.begin();
			int y=min_element(B.begin()+i,B.begin()+N)-B.begin();
			
			if(x==i&&y==i) {
				go(i,i);
			}
			else if(x>i&&y==i) {
				go(i,y);
				go(x,i);
			}
			else if(x==i&&y>i) {
				go(x,i);
				go(i,y);
			}
			else {
				go(x,i);
				go(i,y);
				go(x,y);
			}
		}
		return R;
		
	}
}

まとめ

ジャッジが直ってレート再計算とか、今からあり得るのかな…。