Submission #621407

# Submission time Handle Problem Language Result Execution time Memory
621407 2022-08-03T18:35:47 Z M_W Scales (IOI15_scales) C++17
74.1071 / 100
118 ms 440 KB
#include <bits/stdc++.h>
#include "scales.h"
using namespace std;
vector<vector<int>> all_perm;
int A = 37, B = 61, M = 9122, last = 1;

int randInt(){
	last = ((last * A) + B) % M;
	return last;
}

void init(int T){
	vector<int> perm = {1, 2, 3, 4, 5, 6};
	do{
		all_perm.push_back(perm);
	} while(next_permutation(perm.begin(), perm.end()));
}

bool condition(int i1, int j1, int k1, int i2, int j2, int k2, int type1, int type2, int x1, int y1, int z1, int x2, int y2, int z2){
	// Check to choose 1 instead of 2
	int mx1 = max({i1, j1, k1}), mx2 = max({i2, j2, k2});
	int mn1 = min({i1, j1, k1}), mn2 = min({i2, j2, k2});
	int sm1 = i1 + j1 + k1, sm2 = i2 + j2 + k2;
	
	int r = randInt();
	return mx1 < mx2 || (mx1 == mx2 && type1 > type2) || (mx1 == mx2 && type1 == type2 && x1 >= x2);
}

void orderCoins(){
	vector<vector<int>> cases = all_perm;
	while(cases.size() > 1){
		array<int, 9> ask = {INT_MAX, 0, 0, 0, 0, 0, 1000, 1000, 1000};
		for(int i = 1; i <= 6; i++){
			for(int j = i + 1; j <= 6; j++){
				for(int k = j + 1; k <= 6; k++){
					int hi = 0, hj = 0, hk = 0; // heavy count (case left)
					int li = 0, lj = 0, lk = 0; // light count (case left)
					int mi = 0, mj = 0, mk = 0; // median count (case left)
					for(auto x : cases){
						int ii, jj, kk;
						for(int p = 0; p < 6; p++){
							if(x[p] == i) ii = p;
							if(x[p] == j) jj = p;
							if(x[p] == k) kk = p;
						}
						// Case1: Getheaviest
						if(max({ii, jj, kk}) == ii) hi++;
						if(max({ii, jj, kk}) == jj) hj++;
						if(max({ii, jj, kk}) == kk) hk++;
						
						// Case2: Getlightest
						if(min({ii, jj, kk}) == ii) li++;
						if(min({ii, jj, kk}) == jj) lj++;
						if(min({ii, jj, kk}) == kk) lk++;
						
						// Case3: GetMedian
						if(min({ii, jj, kk}) != ii && max({ii, jj, kk}) != ii) mi++;
						if(min({ii, jj, kk}) != jj && max({ii, jj, kk}) != jj) mj++;
						if(min({ii, jj, kk}) != kk && max({ii, jj, kk}) != kk) mk++;
					}
					if(condition(hi, hj, hk, ask[6], ask[7], ask[8], 1, ask[1], i, j, k, ask[2], ask[3], ask[4]))
						ask = {max({hi, hj, hk}), 1, i, j, k, 0, hi, hj, hk};
					
					if(condition(li, lj, lk, ask[6], ask[7], ask[8], 2, ask[1], i, j, k, ask[2], ask[3], ask[4]))
						ask = {max({li, lj, lk}), 2, i, j, k, 0, li, lj, lk};
					
					if(condition(mi, mj, mk, ask[6], ask[7], ask[8], 3, ask[1], i, j, k, ask[2], ask[3], ask[4]))
						ask = {max({mi, mj, mk}), 3, i, j, k, 0, mi, mj, mk};
					
					// Case4: GetNextLightest
					for(int l = 1; l < 6; l++){
						if(l == i || l == j || l == k) continue;
						int si = 0, sj = 0, sk = 0;
						for(auto x : cases){
							int l2, upb = 10;
							int ii, jj, kk;
							for(int p = 0; p < 6; p++){
								if(x[p] == l) ii = p;
								if(x[p] == j) jj = p;
								if(x[p] == k) kk = p;
								if(x[p] == i) l2 = p;
							}
							vector<int> tmp = {ii, jj, kk};
							for(auto y : tmp){
								if(y > l2) upb = min(upb, y);
							}
							if(upb == 10) upb = min({ii, jj, kk});
							
							if(ii == upb) si++;
							if(jj == upb) sj++;
							if(kk == upb) sk++;
						}
						if(condition(si, sj, sk, ask[6], ask[7], ask[8], 4, ask[1], i, j, k, ask[2], ask[3], ask[4]))
							ask = {max({si, sj, sk}), 4, l, j, k, i, si, sj, sk};
					}
				}
			}
		}

		int res;
		vector<vector<int>> tmp = cases; cases.clear();
		if(ask[1] == 1){
			res = getHeaviest(ask[2], ask[3], ask[4]);
			for(auto x : tmp){
				int ii, jj, kk, rr;
				for(int p = 0; p < 6; p++){
					if(x[p] == ask[4]) ii = p;
					if(x[p] == ask[2]) jj = p;
					if(x[p] == ask[3]) kk = p;
					if(x[p] == res) rr = p;
				}
				if(max({ii, jj, kk}) == rr) cases.push_back(x);
			}
		}
		else if(ask[1] == 2){
			res = getLightest(ask[4], ask[2], ask[3]);
			for(auto x : tmp){
				int ii, jj, kk, rr;
				for(int p = 0; p < 6; p++){
					if(x[p] == ask[4]) ii = p;
					if(x[p] == ask[2]) jj = p;
					if(x[p] == ask[3]) kk = p;
					if(x[p] == res) rr = p;
				}
				if(min({ii, jj, kk}) == rr) cases.push_back(x);
			}
		}
		else if(ask[1] == 3){
			res = getMedian(ask[4], ask[2], ask[3]);
			for(auto x : tmp){
				int ii, jj, kk, rr;
				for(int p = 0; p < 6; p++){
					if(x[p] == ask[4]) ii = p;
					if(x[p] == ask[2]) jj = p;
					if(x[p] == ask[3]) kk = p;
					if(x[p] == res) rr = p;
				}
				if(min({ii, jj, kk}) != rr && max({ii, jj, kk}) != rr) cases.push_back(x);
			}
		}
		else{
			res = getNextLightest(ask[2], ask[3], ask[4], ask[5]);
			for(auto x : tmp){
				int l2, upb = 10;
				int ii, jj, kk, rr;
				for(int p = 0; p < 6; p++){
					if(x[p] == ask[2]) ii = p;
					if(x[p] == ask[3]) jj = p;
					if(x[p] == ask[4]) kk = p;
					if(x[p] == ask[5]) l2 = p;
					if(x[p] == res) rr = p;
				}
				vector<int> tmp = {ii, jj, kk};
				for(auto y : tmp){
					if(y > l2) upb = min(upb, y);
				}
				if(upb == 10) upb = min({ii, jj, kk});
				if(upb == rr) cases.push_back(x);
			}
		}
	}
	int ans[] = {cases[0][0], cases[0][1], cases[0][2], cases[0][3], cases[0][4], cases[0][5]};
	answer(ans);
}

Compilation message

scales.cpp: In function 'void init(int)':
scales.cpp:12:15: warning: unused parameter 'T' [-Wunused-parameter]
   12 | void init(int T){
      |           ~~~~^
scales.cpp: In function 'bool condition(int, int, int, int, int, int, int, int, int, int, int, int, int, int)':
scales.cpp:22:6: warning: unused variable 'mn1' [-Wunused-variable]
   22 |  int mn1 = min({i1, j1, k1}), mn2 = min({i2, j2, k2});
      |      ^~~
scales.cpp:22:31: warning: unused variable 'mn2' [-Wunused-variable]
   22 |  int mn1 = min({i1, j1, k1}), mn2 = min({i2, j2, k2});
      |                               ^~~
scales.cpp:23:6: warning: unused variable 'sm1' [-Wunused-variable]
   23 |  int sm1 = i1 + j1 + k1, sm2 = i2 + j2 + k2;
      |      ^~~
scales.cpp:23:26: warning: unused variable 'sm2' [-Wunused-variable]
   23 |  int sm1 = i1 + j1 + k1, sm2 = i2 + j2 + k2;
      |                          ^~~
scales.cpp:25:6: warning: unused variable 'r' [-Wunused-variable]
   25 |  int r = randInt();
      |      ^
scales.cpp:19:98: warning: unused parameter 'y1' [-Wunused-parameter]
   19 | bool condition(int i1, int j1, int k1, int i2, int j2, int k2, int type1, int type2, int x1, int y1, int z1, int x2, int y2, int z2){
      |                                                                                              ~~~~^~
scales.cpp:19:106: warning: unused parameter 'z1' [-Wunused-parameter]
   19 | bool condition(int i1, int j1, int k1, int i2, int j2, int k2, int type1, int type2, int x1, int y1, int z1, int x2, int y2, int z2){
      |                                                                                                      ~~~~^~
scales.cpp:19:122: warning: unused parameter 'y2' [-Wunused-parameter]
   19 | bool condition(int i1, int j1, int k1, int i2, int j2, int k2, int type1, int type2, int x1, int y1, int z1, int x2, int y2, int z2){
      |                                                                                                                      ~~~~^~
scales.cpp:19:130: warning: unused parameter 'z2' [-Wunused-parameter]
   19 | bool condition(int i1, int j1, int k1, int i2, int j2, int k2, int type1, int type2, int x1, int y1, int z1, int x2, int y2, int z2){
      |                                                                                                                              ~~~~^~
scales.cpp: In function 'void orderCoins()':
scales.cpp:153:17: warning: declaration of 'tmp' shadows a previous local [-Wshadow]
  153 |     vector<int> tmp = {ii, jj, kk};
      |                 ^~~
scales.cpp:101:23: note: shadowed declaration is here
  101 |   vector<vector<int>> tmp = cases; cases.clear();
      |                       ^~~
scales.cpp:158:5: warning: 'rr' may be used uninitialized in this function [-Wmaybe-uninitialized]
  158 |     if(upb == rr) cases.push_back(x);
      |     ^~
scales.cpp:145:17: warning: 'kk' may be used uninitialized in this function [-Wmaybe-uninitialized]
  145 |     int ii, jj, kk, rr;
      |                 ^~
scales.cpp:145:13: warning: 'jj' may be used uninitialized in this function [-Wmaybe-uninitialized]
  145 |     int ii, jj, kk, rr;
      |             ^~
scales.cpp:145:9: warning: 'ii' may be used uninitialized in this function [-Wmaybe-uninitialized]
  145 |     int ii, jj, kk, rr;
      |         ^~
scales.cpp:155:6: warning: 'l2' may be used uninitialized in this function [-Wmaybe-uninitialized]
  155 |      if(y > l2) upb = min(upb, y);
      |      ^~
scales.cpp:138:32: warning: 'rr' may be used uninitialized in this function [-Wmaybe-uninitialized]
  138 |     if(min({ii, jj, kk}) != rr && max({ii, jj, kk}) != rr) cases.push_back(x);
      |        ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
scales.cpp:131:17: warning: 'kk' may be used uninitialized in this function [-Wmaybe-uninitialized]
  131 |     int ii, jj, kk, rr;
      |                 ^~
scales.cpp:131:13: warning: 'jj' may be used uninitialized in this function [-Wmaybe-uninitialized]
  131 |     int ii, jj, kk, rr;
      |             ^~
scales.cpp:131:9: warning: 'ii' may be used uninitialized in this function [-Wmaybe-uninitialized]
  131 |     int ii, jj, kk, rr;
      |         ^~
scales.cpp:125:5: warning: 'rr' may be used uninitialized in this function [-Wmaybe-uninitialized]
  125 |     if(min({ii, jj, kk}) == rr) cases.push_back(x);
      |     ^~
scales.cpp:118:17: warning: 'kk' may be used uninitialized in this function [-Wmaybe-uninitialized]
  118 |     int ii, jj, kk, rr;
      |                 ^~
scales.cpp:118:13: warning: 'jj' may be used uninitialized in this function [-Wmaybe-uninitialized]
  118 |     int ii, jj, kk, rr;
      |             ^~
scales.cpp:118:9: warning: 'ii' may be used uninitialized in this function [-Wmaybe-uninitialized]
  118 |     int ii, jj, kk, rr;
      |         ^~
scales.cpp:112:5: warning: 'rr' may be used uninitialized in this function [-Wmaybe-uninitialized]
  112 |     if(max({ii, jj, kk}) == rr) cases.push_back(x);
      |     ^~
scales.cpp:105:17: warning: 'kk' may be used uninitialized in this function [-Wmaybe-uninitialized]
  105 |     int ii, jj, kk, rr;
      |                 ^~
scales.cpp:105:13: warning: 'jj' may be used uninitialized in this function [-Wmaybe-uninitialized]
  105 |     int ii, jj, kk, rr;
      |             ^~
scales.cpp:105:9: warning: 'ii' may be used uninitialized in this function [-Wmaybe-uninitialized]
  105 |     int ii, jj, kk, rr;
      |         ^~
scales.cpp:76:20: warning: 'kk' may be used uninitialized in this function [-Wmaybe-uninitialized]
   76 |        int ii, jj, kk;
      |                    ^~
scales.cpp:76:16: warning: 'jj' may be used uninitialized in this function [-Wmaybe-uninitialized]
   76 |        int ii, jj, kk;
      |                ^~
scales.cpp:76:12: warning: 'ii' may be used uninitialized in this function [-Wmaybe-uninitialized]
   76 |        int ii, jj, kk;
      |            ^~
scales.cpp:85:9: warning: 'l2' may be used uninitialized in this function [-Wmaybe-uninitialized]
   85 |         if(y > l2) upb = min(upb, y);
      |         ^~
scales.cpp:59:34: warning: 'kk' may be used uninitialized in this function [-Wmaybe-uninitialized]
   59 |       if(min({ii, jj, kk}) != kk && max({ii, jj, kk}) != kk) mk++;
      |          ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
scales.cpp:58:34: warning: 'jj' may be used uninitialized in this function [-Wmaybe-uninitialized]
   58 |       if(min({ii, jj, kk}) != jj && max({ii, jj, kk}) != jj) mj++;
      |          ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
scales.cpp:57:34: warning: 'ii' may be used uninitialized in this function [-Wmaybe-uninitialized]
   57 |       if(min({ii, jj, kk}) != ii && max({ii, jj, kk}) != ii) mi++;
      |          ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Partially correct 94 ms 408 KB Output is partially correct
2 Correct 89 ms 408 KB Output is correct
3 Partially correct 86 ms 416 KB Output is partially correct
4 Correct 85 ms 408 KB Output is correct
5 Correct 78 ms 412 KB Output is correct
6 Correct 89 ms 420 KB Output is correct
7 Partially correct 88 ms 416 KB Output is partially correct
8 Partially correct 99 ms 416 KB Output is partially correct
9 Partially correct 83 ms 412 KB Output is partially correct
10 Correct 94 ms 404 KB Output is correct
11 Partially correct 93 ms 440 KB Output is partially correct
12 Partially correct 79 ms 412 KB Output is partially correct
13 Partially correct 109 ms 408 KB Output is partially correct
14 Partially correct 89 ms 340 KB Output is partially correct
15 Partially correct 97 ms 412 KB Output is partially correct
16 Partially correct 107 ms 408 KB Output is partially correct
17 Correct 78 ms 408 KB Output is correct
18 Partially correct 92 ms 340 KB Output is partially correct
19 Partially correct 100 ms 412 KB Output is partially correct
20 Partially correct 97 ms 412 KB Output is partially correct
21 Partially correct 78 ms 404 KB Output is partially correct
22 Partially correct 86 ms 300 KB Output is partially correct
23 Partially correct 86 ms 340 KB Output is partially correct
24 Partially correct 103 ms 404 KB Output is partially correct
25 Partially correct 81 ms 412 KB Output is partially correct
26 Partially correct 85 ms 424 KB Output is partially correct
27 Partially correct 77 ms 340 KB Output is partially correct
28 Partially correct 89 ms 408 KB Output is partially correct
29 Partially correct 80 ms 412 KB Output is partially correct
30 Partially correct 77 ms 412 KB Output is partially correct
31 Partially correct 82 ms 404 KB Output is partially correct
32 Partially correct 86 ms 404 KB Output is partially correct
33 Partially correct 118 ms 416 KB Output is partially correct
34 Correct 87 ms 412 KB Output is correct
35 Partially correct 80 ms 300 KB Output is partially correct
36 Correct 75 ms 408 KB Output is correct
37 Correct 82 ms 408 KB Output is correct
38 Partially correct 95 ms 412 KB Output is partially correct
39 Partially correct 85 ms 340 KB Output is partially correct
40 Partially correct 80 ms 428 KB Output is partially correct