Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- int n, testCase, target, d, cur, change;
- int nums[10], dbg[10], has[300];
- bool used[10];
- class IO {
- private:
- // string inFile, outFile;
- // ifstream in;
- // ofstream out;
- public:
- IO () {}
- void print() {
- for (int i = 1; i < 10; i++) {
- cout << nums[i] << " \n"[i==9];
- has[nums[i]]++;
- }
- }
- void print1() {
- for (int i = 1; i < 10; i++) dbg[i] = nums[i];
- // sort(dbg+1, dbg+9);
- for (int i = 1; i < 10; i++)
- cout << dbg[i] << " \n"[i==9];
- }
- void start() {
- cin >> testCase >> n;
- for (int i = 0; i < 300; i++) has[i] = 0;
- cout << "FILE reverse " << testCase << '\n';
- }
- void show(int pos) {
- assert(nums[pos] == target);
- used[pos] = 1;
- cout << "P " << pos << '\n';
- target--;
- }
- void assign(int a, int b) {
- assert(a * b != 0);
- cout << "S " << a << ' ' << b << '\n';
- has[nums[b]]--;
- nums[b] = nums[a] + 1;
- has[nums[b]]++;
- }
- } io;
- void solve() {
- io.start();
- nums[0] = -100;
- target = n;
- // the answer is within range 0...4
- if (n <= 8) {
- for (int i = 1; i < 10; i++)
- nums[i] = i - 1;
- } else if (n <= 44) {
- d = 1;
- nums[9] = n;
- for (int i = 1; i < 9; i++)
- nums[9-i] = max(0, nums[9-i+1] - (1+d*i));
- } else if (n <= 101) {
- d = 2;
- nums[9] = n;
- nums[8] = nums[9]-d-1;
- nums[7] = nums[8]-2*d-1;
- int D = 3, X = 2;
- for (int i = 6; i > 0; i--) {
- nums[i] = max(0, nums[i+1]-d*D-X);
- D++, X++;
- }
- } else if (n <= 130) { // actually n <= 173 but because of bad testcase and wrong answer it has to be between 112 and 139
- d = 3;
- nums[9] = n;
- nums[8] = nums[9]-d-1;
- nums[7] = nums[8]-2*d-1;
- int D = 12;
- for (int i = 6; i > 0; i--) {
- nums[i] = max(0, nums[i+1]-D);
- D += 6;
- }
- } else { // limit 257
- d = 4;
- nums[9] = n;
- nums[8] = nums[9]-d-1;
- nums[7] = nums[8]-2*d-1;
- int D = 18;
- for (int i = 6; i > 0; i--) {
- nums[i] = max(0, nums[i+1]-D);
- D += 9;
- }
- }
- io.print();
- while (1) {
- cur = 0;
- while(cur < 10 && nums[cur] != target) cur++;
- io.show(cur);
- if (target < 0) break;
- int need = 0, ext;
- while(need <= target &&!has[target-need]) need++;
- change = 0;
- for (int i = 1; i < 10; i++)
- if (nums[i] == target-need) change = i;
- if (change && need > 0) {
- io.assign(change, cur);
- for (int j = 1; j < need; j++)
- io.assign(cur, cur);
- }
- ext = d - need;
- change = 0;
- if (ext == d) {
- // don't need to find cur
- for (int i = 1; i < 10; i++) {
- bool x = 1;
- for (int j = 1; j <= d; j++) {
- if (has[nums[i]+j]) x = 0;
- }
- if (nums[i] >= nums[change] &&
- nums[i]+d < target &&
- !has[nums[i]+d] &&
- !has[nums[i]+d+1] &&
- x) change = i;
- }
- } else {
- // find cur
- for (int i = 1; i < 10; i++) {
- bool x = 1;
- for (int j = 1; j <= d; j++) {
- if (has[nums[i]+j]) x = 0;
- }
- if (nums[i]+d < target &&
- nums[i] > nums[change] &&
- !has[nums[i]+d] &&
- used[i] &&
- x) change = i;
- }
- cur = change;
- }
- if (change && ext > 0) {
- io.assign(change, cur);
- for (int j = 1; j < ext; j++) io.assign(cur, cur);
- }
- }
- }
- signed main() {
- ios::sync_with_stdio();
- cin.tie(0);
- cout.tie(0);
- int st = 0, ed = 15;
- // for all testcases:
- // for (int i = st; i <= ed; i++) {
- // string c = "inputs/reverse."+to_string(i)+".in";
- // freopen(c.c_str(), "r", stdin);
- // string d = "outputs/reverse."+to_string(i)+".out";
- // freopen(d.c_str(), "w", stdout);
- // solve();
- // }
- solve();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement