답안 #796088

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
796088 2023-07-28T06:07:07 Z ono_de206 앵무새 (IOI11_parrots) C++14
81 / 100
2000 ms 43264 KB
#include "encoder.h"
#include "encoderlib.h"
#include<bits/stdc++.h>
using namespace std;

#define in insert
#define all(x) x.begin(),x.end()
#define pb push_back
#define eb emplace_back
#define ff first
#define ss second

//#define int long long
 
typedef long long ll;
typedef vector<int> vi;
typedef set<int> si;
typedef multiset<int> msi;
typedef pair<int, int> pii;
typedef vector<pii> vpii;

const int B = 321, A = 65;
struct bigNum {
	array<int, A> dig;
	bigNum(int x = 0) {
		for(int i = 0; i < A; i++) {
			dig[i] = x % B;
			x /= B;
		}
	}
	bigNum& operator+=(const bigNum &b) {
		int carry = 0;
		for(int i = 0; i < A; i++) {
			dig[i] += b.dig[i] + carry;
			carry = dig[i] / B;
			dig[i] %= B;
		}
		return *this;
	};
	bigNum& operator-=(const bigNum &b) {
		for(int i = 0; i < A; i++) {
			dig[i] -= b.dig[i];
			while(dig[i] < 0) {
				assert(i + 1 < A);
				dig[i] += B;
				dig[i + 1]--;
			}
		}
		return *this;
	}
	bigNum& operator*=(const int &b) {
		int carry = 0;
		for(int i = 0; i < A; i++) {
			dig[i] *= b;
			dig[i] += carry;
			carry = dig[i] / B;
			dig[i] %= B;
		}
		return *this;
	}
	friend bigNum operator+(const bigNum &a, const bigNum &b) {
		return bigNum(a) += b;
	}
	friend bigNum operator-(const bigNum &a, const bigNum &b) {
		return bigNum(a) -= b;
	}
	friend bigNum operator*(const bigNum &a, const int &b) {
		return bigNum(a) *= b;
	}
	int compare(const bigNum &a) {
		for(int i = A - 1; i >= 0; i--) {
			if(a.dig[i] > dig[i]) return -1;
			else if(a.dig[i] < dig[i]) return 1;
		}
		return 0;
	}
	bool operator<(const bigNum &b) {
		return this->compare(b) == -1;
	}
	bool operator>(const bigNum &b) {
		return this->compare(b) == 1;
	}
	bool operator==(const bigNum &b) {
		return this->compare(b) == 0;
	}
	bool operator!=(const bigNum &b) {
		return this->compare(b) != 0;
	}
	friend ostream& operator<<(ostream& out, const bigNum &a) {
		for(int i = 0; i < 10; i++) {
			out << a.dig[i];
			if(i + 1 < A) out << ", ";
		}
		out << ';';
	}
};


void encode(int n, int a[]) {
	bigNum val(0);
	vector<bigNum> pw(1, 1);
	for(int i = 1; i < n; i++) {
		pw.pb(pw.back() * 256);
	}
	for(int i = 0; i < n; i++) {
		val += pw[i] * a[i];
	}
	int len = n * 5;
	vector<vector<bigNum>> dp(len + 1, vector<bigNum>(256, 0));
	// dp[0] = vector<bigNum>(256, 1);
	dp[0][0] = 1;
	for(int i = 1; i <= len; i++) {
		for(int j = 0; j < 256; j++) {
			dp[i][j] = dp[i - 1][j];
			if(j - 1 >= 0) dp[i][j] += dp[i][j - 1];
		}
	}
	for(int i = len; i >= 1; i--) {
		int ans = 0;
		for(int j = 0; j < 256; j++) {
			if(dp[i][j] > val) {
				ans = j;
				break;
			}
			val -= dp[i][j];
		}
		send(ans);
	}
}
#include "decoder.h"
#include "decoderlib.h"
#include<bits/stdc++.h>
using namespace std;

#define in insert
#define all(x) x.begin(),x.end()
#define pb push_back
#define eb emplace_back
#define ff first
#define ss second

//#define int long long
 
typedef long long ll;
typedef vector<int> vi;
typedef set<int> si;
typedef multiset<int> msi;
typedef pair<int, int> pii;
typedef vector<pii> vpii;

const int B = 321, A = 65;
struct bigNum {
	array<int, A> dig;
	bigNum(int x = 0) {
		for(int i = 0; i < A; i++) {
			dig[i] = x % B;
			x /= B;
		}
	}
	bigNum& operator+=(const bigNum &b) {
		int carry = 0;
		for(int i = 0; i < A; i++) {
			dig[i] += b.dig[i] + carry;
			carry = dig[i] / B;
			dig[i] %= B;
		}
		return *this;
	};
	bigNum& operator-=(const bigNum &b) {
		for(int i = 0; i < A; i++) {
			dig[i] -= b.dig[i];
			while(dig[i] < 0) {
				dig[i] += B;
				dig[i + 1]--;
			}
		}
		return *this;
	}
	bigNum& operator*=(const int &b) {
		int carry = 0;
		for(int i = 0; i < A; i++) {
			dig[i] = dig[i] * b + carry;
			carry = dig[i] / B;
			dig[i] %= B;
		}
		return *this;
	}
	friend bigNum operator+(const bigNum &a, const bigNum &b) {
		return bigNum(a) += b;
	}
	friend bigNum operator-(const bigNum &a, const bigNum &b) {
		return bigNum(a) -= b;
	}
	friend bigNum operator*(const bigNum &a, const int &b) {
		return bigNum(a) *= b;
	}
	int compare(const bigNum &a) {
		for(int i = A - 1; i >= 0; i--) {
			if(a.dig[i] > dig[i]) return -1;
			else if(a.dig[i] < dig[i]) return 1;
		}
		return 0;
	}
	bool operator<(const bigNum &b) {
		return this->compare(b) == -1;
	}
	bool operator>(const bigNum &b) {
		return this->compare(b) == 1;
	}
	bool operator==(const bigNum &b) {
		return this->compare(b) == 0;
	}
	bool operator!=(const bigNum &b) {
		return this->compare(b) != 0;
	}
	friend ostream& operator<<(ostream& out, const bigNum &a) {
		for(int i = 0; i < 10; i++) {
			out << a.dig[i];
			if(i + 1 < A) out << ", ";
		}
		out << ';';
	}
};

void decode(int n, int l, int x[]) {
	sort(x, x + l);
	int len = n * 5;
	vector<vector<bigNum>> dp(len + 1, vector<bigNum>(256, 0));
	// dp[0] = vector<bigNum>(256, 1);
	dp[0][0] = 1;
	for(int i = 1; i <= len; i++) {
		for(int j = 0; j < 256; j++) {
			dp[i][j] = dp[i - 1][j];
			if(j - 1 >= 0) dp[i][j] += dp[i][j - 1];
		}
	}
	vector<int> ret;
	bigNum val(0);
	for(int i = l - 1; i >= 0; i--) {
		for(int j = 0; j < x[i]; j++) {
			val += dp[i + 1][j];
		}
	}
	// cout << val << " val here\n";
	vector<bigNum> pw(1, 1);
	for(int i = 1; i < n; i++) {
		pw.pb(pw.back() * 256);
	}
	// for(int i = 0; i < n; i++) {
	// 	cout << pw[i] << '\n';
	// }
	// cout << '\n';
	for(int i = n - 1; i >= 0; i--) {
		// cout << val << '\n';
		int ans = 0;
		while(pw[i] < val || pw[i] == val) {
			ans++;
			val -= pw[i];
		}
		ret.pb(ans);
	}
	reverse(all(ret));
	for(int x : ret) {
		// cout << x << ' ';
		output(x);
	}
	// cout << '\n';
}

Compilation message

encoder.cpp: In function 'std::ostream& operator<<(std::ostream&, const bigNum&)':
encoder.cpp:95:2: warning: no return statement in function returning non-void [-Wreturn-type]
   95 |  }
      |  ^

decoder.cpp: In function 'std::ostream& operator<<(std::ostream&, const bigNum&)':
decoder.cpp:93:2: warning: no return statement in function returning non-void [-Wreturn-type]
   93 |  }
      |  ^
# 결과 실행 시간 메모리 Grader output
1 Correct 54 ms 6312 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 287 ms 6596 KB Output is correct
2 Correct 381 ms 8720 KB Output is correct
3 Correct 534 ms 11164 KB Output is correct
4 Correct 567 ms 11764 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 271 ms 6624 KB Output is correct
2 Correct 382 ms 8756 KB Output is correct
3 Correct 524 ms 11144 KB Output is correct
4 Correct 564 ms 11956 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 273 ms 6560 KB Output is correct
2 Correct 554 ms 11780 KB Output is correct
3 Correct 721 ms 14356 KB Output is correct
4 Correct 1154 ms 20960 KB Output is correct
5 Correct 1190 ms 21620 KB Output is correct
6 Correct 1237 ms 22364 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 565 ms 11916 KB Output is correct - P = 5.000000
2 Correct 1237 ms 22440 KB Output is correct - P = 5.000000
3 Correct 1280 ms 23020 KB Output is correct - P = 5.000000
4 Execution timed out 2126 ms 34364 KB Time limit exceeded
5 Execution timed out 2424 ms 40652 KB Time limit exceeded
6 Execution timed out 2487 ms 42724 KB Time limit exceeded
7 Execution timed out 2538 ms 43264 KB Time limit exceeded