結果
問題 | No.594 壊れた宝物発見機 |
ユーザー |
|
提出日時 | 2017-11-11 15:47:24 |
言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 108 ms / 2,000 ms |
コード長 | 8,434 bytes |
コンパイル時間 | 702 ms |
コンパイル使用メモリ | 88,756 KB |
実行使用メモリ | 25,616 KB |
平均クエリ数 | 32.70 |
最終ジャッジ日時 | 2024-07-16 14:42:46 |
合計ジャッジ時間 | 3,912 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 20 |
ソースコード
//#define debug //*******************************************************************************************************************************************////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// [Tips]// XCodeでのEOF入力はCtrl+D// ¥はAlt+\// ansは結構INTの範囲2,147,483,647を超えることがあるのでlong long使っておいたほうが良い// 2進数表示 = dout << static_cast<bitset<8> >(x)//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////#ifdef debug#include <chrono>#endif#include <iostream>#include <algorithm> // next_permutation#include <iomanip>#include <cmath>#include <vector>#include <sstream>#include <string>#include <cstring> //memcpy#include <cstdio>#include <stack>#include <queue>#include <list>#include <numeric> //accumulate#include <map>//#include <unordered_map> //hash func.#include <fstream> //ifstream, ofstream#include <iterator> //insert_iterator::inserter#include <set>//#define NDEBUG //If NDEBUG is defined before #include <cassert>, assert will be ignored. You had better define NDEBUG when u submit the code.#include <cassert> //assertusing namespace std;#define dout cout//If u wanna output to a text file instead of standard output, plz define OUTPUTFILE.//#define OUTPUTFILE "output.txt" //************************************************************#ifdef OUTPUTFILE#define dout outputfileofstream outputfile(OUTPUTFILE);#define OutputFilePath "/Users/Nag/Documents/Prgm/Test/DerivedData/Test/Build/Products/Debug/output.txt"#endif#define din cin//If u wanna input from a text file instead of standard input, plz define INPUTFROMTEXTFILEを.//#define INPUTFILE "input.txt" //**************************************************************#ifdef INPUTFILE#define din inputfileifstream inputfile(INPUTFILE);#endif#define scand(A) scanf("%d", &(A))#define scans(A) scanf("%s", (A))#define printd(A) dout << "%d\n", (A))#define prints(A) dout << "%s\n", (A))#define disp(A) dout << #A << " = " << setw(3) << (A) << endl#define disP(A) dout << setw(3) << (A) << " "#define rep(i,a,n) for(int (i)=(a); (i)<(n); (i)++)#define show(A,s,g) dout << #A << " = "; rep(__w, (s), (g)) {disP(A[__w]);} dout << endl#define showi(A,s,g) dout << #A << " = "; rep(__w, (s), (g)) {disP(__w);} dout << endl#define line dout << "----------------\n"#define line2 dout << "================\n"#define sign(x) ((x)>0)-((x)<0) //x<0: -1, x=0: 0, x>0: +1#define p(i) ((i)/2)#define l(i) ((i)*2)#define r(i) ((i)*2+1)#define sibling(i) (i^1) //the other sibling of i (ex. 16^1 = 17, 17^1 = 16)#define isRightChild(i) (i&1) // ex. 16&1 = 0, 17&1 = 1#define isLeftChild(i) (!(i&1)) // ex. 16&1 = 1, 17&1 = 0typedef pair<int, int> ii;typedef pair<ii, int> iii;typedef vector<int> vi;typedef long long ll;typedef unsigned long long ull;const int INF = (1LL<<31)-1;//const int NONE = -1;//const ll INF_LL = (ll)9e18-1LL; //Be careful for overflow.//const ull INF_ULL = (ull)1e19-1ULL;//#define MOD 1000000007 //大きい素数の代表といえばこの人、10億7さん#define N_MAX 100010 //num of vertex or element//#define M_MAX 124760 //num of edge//#define DATA_MAX 1010int mp[201][201][201];int goal[3] = {9, -5, 85};int a[3] = {0, 0, 0};void init() {mp[goal[0]][goal[1]][goal[2]] = 0;int x = goal[0];int y = goal[1];int z = goal[2];//GOALを突き刺すz軸方向に更新for(z=goal[2]+1; z<=100; z++) {mp[x+100][y+100][z+100] = mp[x+100][y+100][z-1+100] + 1;}for(z=goal[2]-1; z>=-100; z--) {mp[x+100][y+100][z+100] = mp[x+100][y+100][z+1+100] + 1;}for(z=-100; z<=100; z++) {x = goal[0];y = goal[1];//y軸方向に更新for(y=goal[1]+1; y<=100; y++) {mp[x+100][y+100][z+100] = mp[x+100][y-1+100][z+100] + 1;}for(y=goal[1]-1; y>=-100; y--) {mp[x+100][y+100][z+100] = mp[x+100][y+1+100][z+100] + 1;}for(y=-100; y<=100; y++) {//x軸方向に更新for(x=goal[0]+1; x<=100; x++) {mp[x+100][y+100][z+100] = mp[x-1+100][y+100][z+100] + 1;}for(x=goal[0]-1; x>=-100; x--) {mp[x+100][y+100][z+100] = mp[x+1+100][y+100][z+100] + 1;}}}}void display() {#ifdef debugdout << "------------------------- display() ---------------------\n";// dout << " "; showi(j,0,N+1);// dout << "C[][] = \n";// rep(i,0,N+1) {// disP(i); dout << " : ";// rep(j,0,N+1) {// disP(C[i][j]);// }// dout << endl;// }// dout << endl;dout << " "; showi(y,-10,11);dout << "z=" << goal[2] << "の、mp[x][y] = \n";rep(x,9,10) {disP(x); dout << " : ";rep(y,-10,11) {disP(mp[x+100][y+100][goal[2]+100]);}dout << endl;}dout << endl;dout << "------------------------- end of display() ---------------------\n";#endif}// 質問クエリint ask(int x, int y, int z) {int d;cout << "?" << " " << x << " " << y << " " << z << endl;cin >> d;return d;// return mp[x+100][y+100][z+100];}// 回答クエリvoid answer(int x, int y, int z) {cout << "!" << " " << x << " " << y << " " << z << endl;}int binarySearch(int idx) {int l, m, r;int d_l, d_m, d_r;int tmp[3];rep(i,0,3) tmp[i] = a[i];l = -100;tmp[idx] = l;d_l = ask(tmp[0], tmp[1], tmp[2]);r = 100;tmp[idx] = r;d_r = ask(tmp[0], tmp[1], tmp[2]);for(m=(l+r)/2; l<r; m=(l+r)/2) {#ifdef debugline;disp(l);disp(d_l);disp(r);disp(d_r);dout << endl;disp(m);#endiftmp[idx] = m;d_m = ask(tmp[0], tmp[1], tmp[2]);if(d_l<d_r) {if(l+1==r) {r = l;}else {r = m;d_r = d_m;}} else {if(l+1==r) {l = r;}else {l = m;d_l = d_m;}}}return m;}int main() {//cin, coutの高速化 *注意:cinを使うなら全部cinで、scanfを使うなら全部scanfで統一するように!cin.tie(0); //cinとcoutの同期を切るios::sync_with_stdio(false); //iostreamとstdioの同期を切る//read input data// init();// display();//------------------------------------------------------------------------------------------#ifdef debug//start timerauto startTime = chrono::system_clock::now();#endif//------------------------------------------------------------------------------------------rep(i,0,3) {a[i] = binarySearch(i);}answer(a[0], a[1], a[2]);#ifdef debugdout << "=== OUTPUT ===\n";dout << "right answer = ";disP(goal[0]);disP(goal[1]);disP(goal[2]);dout << endl;#endif//------------------------------------------------------------------------------------------#ifdef debug//stop timerauto endTime = chrono::system_clock::now();auto dur = endTime - startTime;auto msec = chrono::duration_cast<chrono::milliseconds>(dur).count();dout << fixed << setprecision(4) << (double)msec/1000 << " sec \n";#ifdef OUTPUTFILEcout << fixed << setprecision(4) << (double)msec/1000 << " sec \n";#endif#endif//------------------------------------------------------------------------------------------#ifdef INPUTFILEinputfile.close();#endif#ifdef OUTPUTFILEoutputfile.close();cout << "\"" << OutputFilePath << "\"" << endl;#endifreturn 0;}