CSES – Collecting Numbers II

貪心

#include<bits/stdc++.h>
#define int long long
#define pii pair<int,int>
#define f first
#define s second
#define fastio ios_base::sync_with_stdio(0);cin.tie(0)
using namespace std;
//declare
const int maxn = 2e5+5;
int n,m,v[maxn],idx[maxn];
bool dir[maxn];
//
signed main(){
    fastio;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>v[i];
        idx[v[i]] = i;
    }
    v[n+1] = n+1; dir[n] = 0; idx[n+1] = n+1;
    for(int i=1;i<n;i++) dir[i] = (idx[i] > idx[i+1]);
    int turn = 0;
    for(int i=1;i<n;i++) turn += dir[i];
    while(m--){
        int i,j; cin>>i>>j;
        idx[v[i]] = j, idx[v[j]] = i;
        swap(v[i], v[j]);
        int a = v[i], b = v[j];
        if(idx[a] > idx[a+1] != dir[a]){
            if(dir[a]) turn--;
            else turn++;
            dir[a] = 1 - dir[a];
        }
        if(idx[a-1] > idx[a] != dir[a-1]){
            if(dir[a-1]) turn--;
            else turn++;
            dir[a-1] = 1 - dir[a-1];
        }
        if(idx[b] > idx[b+1] != dir[b]){
            if(dir[b]) turn--;
            else turn++;
            dir[b] = 1 - dir[b];
        }
        if(idx[b-1] > idx[b] != dir[b-1]){
            if(dir[b-1]) turn--;
            else turn++;
            dir[b-1] = 1 - dir[b-1];
        }
        cout<<turn+1<<"\n";
    }
    return 0;
}

相關文章

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *