답안 #389498

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
389498 2021-04-14T06:48:42 Z 8e7 Permutation Recovery (info1cup17_permutation) C++14
43 / 100
4000 ms 60968 KB
//Challenge: Accepted
#include <iostream>
#include <algorithm>
#include <utility>
#include <vector>
#define ll long long
#define maxn 70005
#define ff first
#define ss second
#define io ios_base::sync_with_stdio(0);cin.tie(0);
#define pii pair<int, int>
using namespace std;
//#include <bits/extc++.h>
//using namespace __gnu_pbds;
//template<lcass T> using Tree = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
//find by order, order of key
string q[maxn], b[maxn], c[maxn];
int a[maxn], found[maxn];


string operator *(string a, string b) { //addition
	if (a == "-" || b == "-") return "-";
	if (a.size() < b.size()) swap(a, b);
	int d = a.size() - b.size();
	for (int i = 0;i < d;i++) b += '0';
	string ret;
	int cur = 0, tmp = 0;
	for (int i = 0;i < a.size();i++) {
		cur = tmp;
		cur += a[i] - '0' + b[i] - '0';
		tmp = (cur > 9 ? (cur -= 10, 1) : 0);
		ret += char('0' + cur);
	}
	if (tmp) ret += '1';
	return ret;
}
string operator / (string a, string b) { //subtraction
	if (a == "-") return a;
	int d = a.size() - b.size();
	for (int i = 0;i < d;i++) b += '0';
	string ret;
	int cur = 0, tmp = 0;
	for (int i = 0;i < a.size();i++) {
		cur = tmp;
		cur += a[i] - '0' - (b[i] - '0');
		ret += char('0' + cur + (cur < 0 ? (tmp = -1, 10) : (tmp = 0, 0)));
	}
	while (ret.size() > 1 && ret[ret.size() - 1] == '0') ret.pop_back();
	return ret;
}
bool operator <= (string a, string b) {
	if (a == "-") return false;
	else if (b == "-") return true;
	if (a.size() != b.size()) return a.size() < b.size();
	for (int i = a.size() - 1;i >= 0;i--) {
		if (a[i] != b[i]) return a[i] < b[i];
	}
	return true;
}


string seg[4 * maxn], tag[4 * maxn];
int mpos[4 * maxn];
void upd(int cur, int l, int r) {
	string vl = seg[cur * 2] / tag[cur * 2], vr = seg[cur * 2 + 1] / tag[cur * 2 + 1];
	if (vr <= vl) {
		seg[cur] = vr;
		mpos[cur] = mpos[cur * 2 + 1];
	} else {
		seg[cur] = vl;
		mpos[cur] = mpos[cur * 2];
	}
}
void init(int cur, int l, int r) {
	if (r <= l) return;
	if (r - l == 1) {
		seg[cur] = c[l];
		mpos[cur] = l;
		return;
	}
	int mid = (l + r) / 2;
	init(cur * 2, l, mid);
	init(cur * 2 + 1, mid, r);
	upd(cur, l, r);
}
void dbg(int cur, int l, int r) {
	if (r <= l) return;
	if (r - l == 1) {
		cout << l << " " << r << " " << mpos[cur] << "\n";
		return;
	}
	int mid = (l + r) / 2;
	dbg(cur * 2, l, mid);
	dbg(cur * 2 + 1, mid, r);
	cout << l << " " << r << " " << mpos[cur] << "\n";
}

void remove(int cur, int l, int r, int ind) {
	if (r <= l) return;
	if (r - l == 1) {
		seg[cur] = "-";
		return;
	}

	int mid = (l + r) / 2;
	if (ind < mid) remove(cur * 2, l, mid, ind);
	else remove(cur * 2 + 1, mid, r, ind);
	upd(cur, l, r);
}
void modify(int cur, int l, int r, int ql, int qr, string val) {
	if (r <= l || qr <= l || ql >= r) return;
	if (ql <= l && qr >= r) {
		tag[cur] = tag[cur] * val;
		return;
	}
	int mid = (l + r) / 2;
	modify(cur * 2, l, mid, ql, qr, val);
	modify(cur * 2 + 1, mid, r, ql, qr, val);
	upd(cur, l, r);
}

void pary(string arr[], int n) {
	for (int i = 0;i < n;i++) {
		string tmp = arr[i];
		reverse(tmp.begin(), tmp.end());
		cout << tmp << " ";
	}
	cout << endl;
}
int main() {
	io
	int n;
	cin >> n;
	/*
	for (int i = 0;i < n;i++) {
		string a, b;
		cin >> a >> b;
		reverse(a.begin(), a.end()), reverse(b.begin(), b.end());
		string res = a / b;
		reverse(res.begin(), res.end());
		cout << res << endl;
	}
	*/
	for (int i = 0;i < n;i++) cin >> q[i], reverse(q[i].begin(), q[i].end());
	for (int i = 0;i < n;i++) {
		b[i] = q[i] / (i ? q[i - 1] : "0");
		c[i] = (i ? (q[i - 1] * "1") / b[i] : "0");
	}
	//pary(b, n);
	//pary(c, n);

	init(1, 0, n);
	for (int i = 0;i < n;i++) {
		int ind = mpos[1];
		a[ind] = n - i;
		remove(1, 0, n, ind);
		modify(1, 0, n, ind + 1, n, b[ind]);
		//dbg(1, 0, n);
	}
	for (int i = 0;i < n;i++) cout << a[i] << " ";
	cout << "\n";
}
/*
4
1 2 5 6

6
1 3 5 9 11 21
 */

Compilation message

permutation.cpp: In function 'std::string operator*(std::string, std::string)':
permutation.cpp:28:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   28 |  for (int i = 0;i < a.size();i++) {
      |                 ~~^~~~~~~~~~
permutation.cpp: In function 'std::string operator/(std::string, std::string)':
permutation.cpp:43:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   43 |  for (int i = 0;i < a.size();i++) {
      |                 ~~^~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 15 ms 24440 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 15 ms 24440 KB Output is correct
2 Correct 19 ms 24456 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 15 ms 24440 KB Output is correct
2 Correct 19 ms 24456 KB Output is correct
3 Correct 39 ms 24804 KB Output is correct
4 Correct 30 ms 24716 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 15 ms 24440 KB Output is correct
2 Correct 19 ms 24456 KB Output is correct
3 Correct 39 ms 24804 KB Output is correct
4 Correct 30 ms 24716 KB Output is correct
5 Execution timed out 4027 ms 60968 KB Time limit exceeded
# 결과 실행 시간 메모리 Grader output
1 Correct 15 ms 24440 KB Output is correct
2 Correct 19 ms 24456 KB Output is correct
3 Correct 39 ms 24804 KB Output is correct
4 Correct 30 ms 24716 KB Output is correct
5 Execution timed out 4027 ms 60968 KB Time limit exceeded
# 결과 실행 시간 메모리 Grader output
1 Correct 15 ms 24440 KB Output is correct
2 Correct 19 ms 24456 KB Output is correct
3 Correct 39 ms 24804 KB Output is correct
4 Correct 30 ms 24716 KB Output is correct
5 Execution timed out 4027 ms 60968 KB Time limit exceeded
# 결과 실행 시간 메모리 Grader output
1 Correct 15 ms 24440 KB Output is correct
2 Correct 19 ms 24456 KB Output is correct
3 Correct 39 ms 24804 KB Output is correct
4 Correct 30 ms 24716 KB Output is correct
5 Execution timed out 4027 ms 60968 KB Time limit exceeded
# 결과 실행 시간 메모리 Grader output
1 Correct 15 ms 24440 KB Output is correct
2 Correct 19 ms 24456 KB Output is correct
3 Correct 39 ms 24804 KB Output is correct
4 Correct 30 ms 24716 KB Output is correct
5 Execution timed out 4027 ms 60968 KB Time limit exceeded