Submission #63764

# Submission time Handle Problem Language Result Execution time Memory
63764 2018-08-02T17:19:45 Z bazsi700 Board (CEOI13_board) C++14
80 / 100
200 ms 2044 KB
#include <bits/stdc++.h>
using namespace std;

#define MOD 1000000007
#define ll long long int
#define vi vector<int>
#define vii vector< vector<int> >
#define PI 3.1415926535897932384626433832795
#define INF 9223372036854775807LL

//15:20

bool node1[100005];
bool node2[100005];
bool dist[100005];
bool temp[100005];
ll cn1[100005];
ll cn2[100005];
int lev1,lev2;
int levdist;

void calcdist() {
	levdist = 0;
	bool rem = false;
	for(int i = lev1; i >= 0; i--) {
		bool nod1 = node1[i];
		bool nod2 = node2[i];
		if(rem) {
			rem = false;
			if(nod2 && !nod1) {
				temp[i] = false;
			} else if(!nod2 && !nod1) {
				temp[i] = true;
				rem = true;
			} else if(nod1 && nod2) {
				temp[i] = true;
				rem = true;
			} else if(nod1 && !nod2) {
				temp[i] = false;
				rem = true;
			}
		} else {
			if(nod2 && !nod1) {
				temp[i] = true;
			} else if(nod1 == nod2) {
				temp[i] = false;
			} else {
				temp[i] = true;
				rem = true;
			}
		}
	}
	int ind = -1;
	for(int i = 0; i <= lev1; i++) {
		if(temp[i] && ind == -1) {
			ind = 0;
		}
		if(ind != -1) {
			dist[ind++] = temp[i];
		}
	}
	levdist = ind-1;
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	string a;
	string b;
	cin >> a >> b;
	//a = transf(a);
	//b = transf(b);
	//cout << a << " " << b << endl;
	node1[0] = node2[0] = 1;
	lev1 = lev2 = 0;
	for(int i = 0; i < a.length(); i++) {
		if(a.at(i) == '1') {
			lev1++;
		} else if(a.at(i) == '2') {
			lev1++;
			node1[lev1] = true;
		} else if(a.at(i) == 'L') {
			cn1[lev1]--;
		} else if(a.at(i) == 'R') {
			cn1[lev1]++;
		} else {

			if(cn1[lev1] > 0) {
				int add = cn1[lev1]/2;
				if(node1[lev1]) {
					if(cn1[lev1]%2 == 1) {
						add++;
					}
				}
				cn1[lev1] = 0;
				cn1[lev1-1]+= add;
			} else if(cn1[lev1] < 0) {
				int add = (-cn1[lev1])/2;
				if(!node1[lev1]) {
					if((-cn1[lev1])%2 == 1) {
						add++;
					}
				}
				cn1[lev1] = 0;
				cn1[lev1-1]-= add;
			}
			node1[lev1] = false;
			lev1--;
		}
	}
	for(int i = 0; i < b.length(); i++) {
		if(b.at(i) == '1') {
			lev2++;
		} else if(b.at(i) == '2') {
			lev2++;
			node2[lev2] = true;
		} else if(b.at(i) == 'L') {
			cn2[lev2]--;
		} else if(b.at(i) == 'R') {
			cn2[lev2]++;
		} else {

			if(cn2[lev2] > 0) {
				int add = cn2[lev2]/2;
				if(node2[lev2]) {
					if(cn2[lev2]%2 == 1) {
						add++;
					}
				}
				cn2[lev2] = 0;
				cn2[lev2-1]+= add;
			} else if(cn2[lev2] < 0) {
				int add = (-cn2[lev2])/2;
				if(!node2[lev2]) {
					if((-cn2[lev2])%2 == 1) {
						add++;
					}
				}
				cn2[lev2] = 0;
				cn2[lev2-1]-= add;
			}
			node2[lev2] = false;
			lev2--;
		}
	}
	ll rem = 0;
	for(int i = 100000; i >= 0; i--) {
		if(cn1[i] > 0) {
			rem+= cn1[i];
		}
			if(rem%2 && node1[i]) {
				node1[i] = false;
				rem/=2;
				rem++;
			} else if(rem%2 && !node1[i]) {
				node1[i] = true;
				rem/=2;
			} else {
				rem/=2;
			}
		//}
	}
	rem = 0;
	for(int i = 100000; i >= 0; i--) {
		if(cn1[i] < 0) {
			rem-= cn1[i];
		}
			if(rem%2 && node1[i]) {
				rem--;
				node1[i] = false;
			} else if(rem%2 && !node1[i]) {
				rem++;
				node1[i] = true;
			}
			rem/=2;
		//}
	}
	rem = 0;
	for(int i = 100000; i >= 0; i--) {
		if(cn2[i] > 0) {
			rem+= cn2[i];
		}
			if(rem%2 && node2[i]) {
				node2[i] = false;
				rem/=2;
				rem++;
			} else if(rem%2 && !node2[i]) {
				node2[i] = true;
				rem/=2;
			} else {
				rem/=2;
			}
		//}
	}
	rem = 0;
	for(int i = 100000; i >= 0; i--) {
		if(cn2[i] < 0) {
			rem-= cn2[i];
		}
			if(rem%2 && node2[i]) {
				rem--;
				node2[i] = false;
			} else if(rem%2 && !node2[i]) {
				rem++;
				node2[i] = true;
			}
			rem/=2;
		//}
	}
	if(lev1 > lev2) {
		swap(lev1,lev2);
		swap(node1,node2);
	} else if(lev1 == lev2) {
		bool bad = false;
		bool eq = true;
		for(int i = 0; i <= lev1; i++) {
			if(node1[i] != node2[i]) {
				eq = false;
				if(node1[i]) {
					bad = true;
				}
				break;
			}
		}
		if(eq) {
			cout << 0;
			return 0;
		}
		if(bad) {
			swap(node1,node2);
		}
	}
	int wasdif = lev2-lev1;
	for(int i = 0; i < lev2-lev1; i++) {
		lev2--;
	}
	ll ans = INF;
	ll nod1 = 0;
	ll nod2 = 0;
	int waslev = lev1;
	calcdist();
	for(int goesupmore = 0; goesupmore < waslev; goesupmore++) {
		if(lev1 <= 10) {
			if(nod1 == 0) {
				for(int i = 0; i <= lev1; i++) {
					nod1*=2;
					if(node1[i]) {
						nod1++;
					}
					nod2*=2;
					if(node2[i]) {
						nod2++;
					}
				}
			}
			//cout << nod1 << " " << nod2 << endl;
			ans = min(ans,wasdif+goesupmore*2+abs(nod1-nod2));
			nod1/=2;
			nod2/=2;
		} else {
			if(levdist <= 60) {
				calcdist();
				ll dis = 0;
				for(int i = 0; i <= levdist; i++) {
					dis*=2;
					if(dist[i]) {
						dis++;
					}
				}
				ans = min(ans,wasdif+goesupmore*2+dis);
				if(dis == 0) {
					break;
				}
				lev1--;
				lev2--;
			} else {
				lev1--;
				lev2--;
				levdist--;
			}
		}
	}
	ans = min(ans,wasdif+waslev*2+abs(nod1-nod2));
	calcdist();
	ll dis = 0;
	for(int i = 0; i <= levdist; i++) {
		dis*=2;
		if(dist[i]) {
			dis++;
		}
	}
	ans = min(ans,wasdif+waslev*2+dis);
	//cout << node2 << endl;
	cout << ans;
	return 0;
}

Compilation message

board.cpp: In function 'int main()':
board.cpp:75:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i < a.length(); i++) {
                 ~~^~~~~~~~~~~~
board.cpp:110:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i < b.length(); i++) {
                 ~~^~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 4 ms 376 KB Output is correct
2 Correct 4 ms 376 KB Output is correct
3 Correct 4 ms 436 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 7 ms 688 KB Output is correct
2 Correct 5 ms 764 KB Output is correct
3 Correct 6 ms 1008 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 4 ms 1008 KB Output is correct
2 Correct 4 ms 1008 KB Output is correct
3 Correct 4 ms 1008 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 5 ms 1008 KB Output is correct
2 Correct 7 ms 1008 KB Output is correct
3 Correct 6 ms 1008 KB Output is correct
4 Correct 4 ms 1008 KB Output is correct
5 Correct 3 ms 1008 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 4 ms 1008 KB Output is correct
2 Correct 3 ms 1008 KB Output is correct
3 Correct 4 ms 1008 KB Output is correct
4 Correct 4 ms 1008 KB Output is correct
5 Correct 4 ms 1008 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 5 ms 1008 KB Output is correct
2 Correct 5 ms 1008 KB Output is correct
3 Correct 4 ms 1008 KB Output is correct
4 Correct 4 ms 1008 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 4 ms 1008 KB Output is correct
2 Correct 6 ms 1148 KB Output is correct
3 Correct 6 ms 1148 KB Output is correct
4 Correct 5 ms 1148 KB Output is correct
5 Correct 4 ms 1148 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 8 ms 1916 KB Output is correct
2 Correct 7 ms 1916 KB Output is correct
3 Incorrect 4 ms 1916 KB Output isn't correct
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 7 ms 2044 KB Output is correct
2 Correct 6 ms 2044 KB Output is correct
3 Correct 32 ms 2044 KB Output is correct
4 Correct 55 ms 2044 KB Output is correct
5 Correct 5 ms 2044 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 9 ms 2044 KB Output is correct
2 Correct 7 ms 2044 KB Output is correct
3 Correct 5 ms 2044 KB Output is correct
4 Correct 164 ms 2044 KB Output is correct
5 Correct 160 ms 2044 KB Output is correct
6 Execution timed out 1084 ms 2044 KB Time limit exceeded