Untitled

 avatar
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