Untitled
unknown
c_cpp
10 months ago
3.3 kB
8
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