Untitled
unknown
plain_text
22 days ago
4.2 kB
2
Indexable
Never
#include <iostream> #include <vector> #include <unordered_map> #include <set> using namespace std; set<int> rowMap[3001]; set<int> colMap[3001]; set<int> leftDiag[6001]; set<int> rightDiag[6001]; struct Hole { int row, col, cnt; bool check; }; Hole holes[30001]; struct Diagonal { int sr, sc, er, ec; }; Diagonal leftDiagonal[6001]; Diagonal rightDiagonal[6001]; int n; int step = 0; void init(int N) { n =N; for(int i=0; i< 3001; i++) { rowMap[i].clear(); colMap[i].clear(); } for(int i=0; i<6001; i++) { leftDiag[i].clear(); rightDiag[i].clear(); } for(int i=0; i<30001; i++) { holes[i].row = -1; holes[i].col = -1; holes[i].check = false; holes[i].cnt = 0; } for(int i=0; i<6001; i++) { leftDiagonal[i].sc = -1; leftDiagonal[i].sr = -1; leftDiagonal[i].ec = -1; leftDiagonal[i].er = -1; rightDiagonal[i].sc = -1; rightDiagonal[i].sr = -1; rightDiagonal[i].ec = -1; rightDiagonal[i].er = -1; } } void addDiagonal(int mARow, int mACol, int mBRow, int mBCol) { if(mACol + mARow == mBCol + mBRow) { //Left diagonal if(mARow < mBRow) { leftDiagonal[mARow + mACol].sr = mARow; leftDiagonal[mARow + mACol].sc = mACol; leftDiagonal[mARow + mACol].er = mBRow; leftDiagonal[mARow + mACol].ec = mBRow; } else { leftDiagonal[mARow + mACol].sr = mBRow; leftDiagonal[mARow + mACol].sc = mBCol; leftDiagonal[mARow + mACol].er = mARow; leftDiagonal[mARow + mACol].ec = mARow; } } else { if(mARow < mBRow) { rightDiagonal[mARow - mACol + n].sr = mARow; rightDiagonal[mARow - mACol + n].sc = mACol; rightDiagonal[mARow - mACol + n].er = mBRow; rightDiagonal[mARow - mACol + n].ec = mBCol; } else { rightDiagonal[mARow - mACol + n].sr = mBRow; rightDiagonal[mARow - mACol + n].sc = mBCol; rightDiagonal[mARow - mACol + n].er = mARow; rightDiagonal[mARow - mACol + n].ec = mACol; } } } void addHole(int mRow, int mCol, int mID) { holes[mID].row = mRow; holes[mID].col = mCol; holes[mID].check = true; rowMap[mRow].insert(mID); colMap[mCol].insert(mID); leftDiag[mRow + mCol].insert(mID); rightDiag[mRow - mCol + n].insert(mID); } void eraseHole(int mRow, int mCol) { for(auto it:rowMap[mRow]) { if(holes[it].col == mCol) { holes[it].check = false; break; } } } int hitMarble(int mRow, int mCol, int mK) { step++; int resHole = 0; while(mK--) { int dist = 9999999; for(auto it:rowMap[mRow]) { if(abs(holes[it].col - mCol) * 10 <= dist && holes[it].check == true && holes[it].col < holes[resHole].col && holes[it].cnt < step) { dist = abs(holes[it].col - mCol) * 10; resHole = it; } } for(auto it:colMap[mCol]) { if(abs(holes[it].row - mRow) * 10 <= dist && holes[it].check == true && holes[it].row < holes[resHole].row && holes[it].cnt < step) { dist = abs(holes[it].row - mRow) * 10; resHole = it; } } if(mRow >= leftDiagonal[mRow + mCol].sr && mRow <= leftDiagonal[mRow + mCol].er) { for(auto it : leftDiag[mRow + mCol]) { if(holes[it].row >=leftDiagonal[mRow + mCol].sr && holes[it].row <= leftDiagonal[mRow + mCol].er) { if(abs(holes[it].row - mRow) * 14 <dist && holes[it].check == true && holes[it].cnt < step && (holes[it].row < holes[resHole].row || holes[it].col < holes[resHole].col)) { dist = abs(holes[it].row - mRow) * 14; resHole = it; } } } } if(mRow >= rightDiagonal[mRow - mCol + n].sr && mRow <= rightDiagonal[mRow - mCol + n].er) { for(auto it:rightDiag[mRow - mCol + n]) { if(holes[it].row >= rightDiagonal[mRow - mCol + n].sr && holes[it].row <= rightDiagonal[mRow - mCol + n].er) { if(abs(holes[it].row - mRow) * 14 < dist && holes[it].check == true && holes[it].cnt < step && (holes[it].row < holes[resHole].row || holes[it].col < holes[resHole].col)) { dist = abs(holes[it].row - mRow) * 14; resHole = it; } } } } mRow = holes[resHole].row; mCol = holes[resHole].col; holes[resHole].cnt = step; } return resHole; }
Leave a Comment