Untitled
unknown
c_cpp
16 days ago
3.3 kB
5
Indexable
#include<iostream> #include<map> #include <set> #include <vector> #include <cmath> using namespace std; struct PairWithSign { pair<int,int> pairNum; int sign; }; map<int,int> updatedNumToIndex(map<int,int> numToIndex, int pos1, int pos2, map<int,int> indexToNum) { int numAtIndex1 = indexToNum[pos1]; int numAtIndex2 = indexToNum[pos2]; numToIndex[numAtIndex1] = pos2; numToIndex[numAtIndex2] = pos1; return numToIndex; } map<int,int> updatedIndexToNum(map<int,int> indexToNum, int pos1, int pos2) { int numAtIndex1 = indexToNum[pos1]; int numAtIndex2 = indexToNum[pos2]; indexToNum[pos1] = numAtIndex2; indexToNum[pos2] = numAtIndex1; return indexToNum; } vector<PairWithSign> createPairSet(int pos1, int pos2, int N, map<int,int> numToIndex, map<int,int> indexToNum) { int numAtPos1 = indexToNum[pos1]; int numAtPos2 = indexToNum[pos2]; set<pair<int,int>> pairSet; int firstNum = min(numAtPos2, numAtPos1); if (firstNum == 1) { pairSet.insert(make_pair(1,2)); } else { pairSet.insert(make_pair(firstNum, firstNum+1)); pairSet.insert(make_pair(firstNum-1,firstNum)); } int secondNum = max(numAtPos2, numAtPos1); if (secondNum == N) { pairSet.insert(make_pair(secondNum-1,secondNum)); } else { pairSet.insert(make_pair(secondNum, secondNum+1)); pairSet.insert(make_pair(secondNum-1,secondNum)); } set<pair<int,int>>::iterator itr; vector<PairWithSign> pairVec; //create pairset with size for (itr = pairSet.begin(); itr != pairSet.end(); itr++) { pair<int, int> pair = *itr; int sign = (pair.first - pair.second) * (numToIndex[pair.first] - numToIndex[pair.second]); PairWithSign pairWithSign; pairWithSign.pairNum = pair; pairWithSign.sign = sign; pairVec.push_back(pairWithSign); } return pairVec; } int main() { int N; cin>>N; int M; cin>> M; map<int, int> numToIndex; map<int, int> indexToNum; for (int i = 1; i<=N;i++) { int k; cin>>k; numToIndex.insert(make_pair(k,i)); indexToNum.insert(make_pair(i,k)); } int currentNum = 1; int round = 1; while (currentNum < N) { int posNum = numToIndex[currentNum]; int nextNum = currentNum+1; int posNextNum = numToIndex[nextNum]; if (posNum>posNextNum) { round++; } currentNum++; } vector<pair<int,int>> pairStage; for (int m=0; m<M;m++){ int i,j; cin>>i>>j; auto pairSet = createPairSet(i,j,N, numToIndex,indexToNum); numToIndex = updatedNumToIndex(numToIndex,i,j,indexToNum); indexToNum = updatedIndexToNum(indexToNum, i, j); for (auto pairNum: pairSet) { auto newPair = pairNum.pairNum; int newSign = (newPair.first - newPair.second) * (numToIndex[newPair.first] - numToIndex[newPair.second]); int oldSign = pairNum.sign; if (oldSign>0 && newSign <0) { round+=1; }else if (oldSign<0&&newSign>0) { round-=1; } } cout<<round<<endl; } }
Editor is loading...
Leave a Comment