1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
| #include<bits/stdc++.h> using namespace std; #ifdef LOCALd #define debug(...) fprintf(stdout, ##__VA_ARGS__) #define debag(...) fprintf(stderr, ##__VA_ARGS__) #else #define debug(...) void(0) #define debag(...) void(0) #endif
inline int read(){int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+ (x<<3)+(ch^48);ch=getchar();}return x*f;} #define Z(x) (x)*(x) #define pb push_back #define fi first #define se second
#define N 200010 int n, m, i, j, k, T; int shu[N], Go[N], a[N], vis[N], u, v, w, ans; vector<int>G[N]; map<pair<int, int>, int>mp; queue<int> q; stack<int>z, Z;
struct Un_set { int i, f[N]; void reset() { for(i = 1; i <= n; ++i) f[i] = i; } void set(int x) { f[x] = x - 1; } int find(int x) { if(f[x] == x) return x; return f[x] = find(f[x]); } }St;
signed main() { #ifdef LOCALd freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout); #endif
n = read(); m = read(); for(i = 1; i <= n; ++i) a[i] = i, G[i].pb(i), G[i].pb(0); for(i = 1; i <= m; ++i) { k = read(); swap(a[k], a[k + 1]); if(mp[{a[k], a[k + 1]}] || mp[{a[k + 1], a[k]}]) continue; mp[{a[k], a[k + 1]}] = mp[{a[k + 1], a[k]}] = 1; debug("%d %d\n", min(a[k], a[k + 1]), max(a[k], a[k + 1])); G[min(a[k], a[k + 1])].pb(max(a[k], a[k + 1])); } for(i = 1; i <= n; ++i) sort(G[i].begin(), G[i].end()); St.reset(); for(i = n; i >= 1; --i) { j = n; j = St.find(j); k = G[i].size() - 1; while(j > i) { while(G[i][k] > j) --k; if(G[i][k] != j) break; j = St.find(j - 1); } if(j > i) Go[i] = j, shu[j] = i, St.set(j); debug("Go[%d] = %d\n", i, Go[i]); }
for(i = 1; i <= n; ++i) if(!Go[i]) { for(j = 1; j <= n; ++j) z.push(j), vis[j] = 0; while(!q.empty()) q.pop(); q.push(i); vis[i] = 1; while(!q.empty()) { u = q.front(); q.pop(); k = G[u].size() - 1; v = 0; while(!z.empty() && z.top() > u) { v = z.top(); z.pop(); while(G[u][k] > v) --k; if(G[u][k] != v) { debug("%d %d\n", G[u][k], v); if(shu[v]) { if(!vis[shu[v]]) q.push(shu[v]); v = 0; } else break; continue; } Z.push(v); v = 0; } while(!Z.empty()) z.push(Z.top()), Z.pop(); if(v) break; } while(u && v) { debug("[%d]Change(%d %d)\n", i, u, v); shu[v] = v; w = Go[u]; Go[u] = v; v = w; u = shu[v]; } if(v) { Go[i] = v, shu[v] = i; debug("Let %d to %d\n", i, v); } } for(i = 1, ans = n; i <= n; ++i) if(Go[i]) --ans; printf("%d", ans); return 0; }
|