2 条题解
-
0

#include <bits/stdc++.h> #define sgn(i, j) ((a[i] > a[j]) - (a[i] < a[j])) // sgn(c[i] - c[j]) #define N 20034 using namespace std; int n, q, i; int l, r, ans = 0; int a[N], buf[N], tmp[N]; int MergeSort(int L, int R){ // mergesort[L, R) if(L + 1 == R) return L; int M = L + R >> 1; MergeSort(L, M); MergeSort(M, R); int i, j, k = L; memcpy(tmp + L, buf + L, M - L << 2); for(i = L, j = M; i < M || j < R; ) if(j >= R || (i < M && tmp[i] <= buf[j])) buf[k++] = tmp[i++]; else{ buf[k++] = buf[j++]; ans += M - i; } return L; } int main(){ scanf("%d", &n); for(i = 1; i <= n; i++) scanf("%d", a + i); memcpy(buf + 1, a + 1, n << 2); MergeSort(1, n + 1); printf("%d\n", ans); for(scanf("%d", &q); q; q--){ scanf("%d%d", &l, &r); if(l > r) swap(l, r); if(a[l] == a[r]){ printf("%d\n", ans); continue; } for(i = l; i < r; i++) ans += sgn(i, l) + sgn(r, i); swap(a[l], a[r]); printf("%d\n", ans); } return 0; } -
0
#include <bits/stdc++.h> using namespace std; const int N = 2e4 + 10; int a[N], n, q, root[N]; struct trnode { int lc, rc, v; } tr[N << 8]; int trlen; template <typename T> void qr(T &x) { x = 0; int f = 1; char ch = getchar(); for (; !isdigit(ch); ch = getchar()) if (ch == '-') f = -1; for (; isdigit(ch); ch = getchar()) x = x * 10 + ch - '0'; x = x * f; } void update(int &p, int l, int r, int x, int z) // 修改操作 { if (!p) { p = ++trlen; tr[trlen] = trnode{0, 0, 0}; } if (l == r) { tr[p].v += z; return; } int mid = (l + r) >> 1; if (x <= mid) update(tr[p].lc, l, mid, x, z); else update(tr[p].rc, mid + 1, r, x, z); tr[p].v = tr[tr[p].lc].v + tr[tr[p].rc].v; } int query(int p, int l, int r, int x, int y) // 查询操作 { if (!p) return 0; if (l > y || r < x) return 0; if (x <= l && r <= y) return tr[p].v; int mid = (l + r) >> 1; return query(tr[p].lc, l, mid, x, y) + query(tr[p].rc, mid + 1, r, x, y); } inline void insert(int x, int y, int z) // 用树状数组的方法插入 { for (; x <= n; x += x & -x) update(root[x], 1, n, y, z); } inline int sum(int x, int y, int l, int r) // 树状数组方式查询 { int res = 0; for (; y; y -= y & -y) res += query(root[y], 1, n, l, r); for (x--; x; x -= x & -x) res -= query(root[x], 1, n, l, r); return res; } int b[N]; int main() { qr(n); for (int i = 1; i <= n; i++) qr(a[i]), b[i] = a[i]; /*-------------------------离散化-------------------------*/ sort(b + 1, b + n + 1); int m = unique(b + 1, b + m + 1) - b - 1; for (int i = 1; i <= n; i++) a[i] = lower_bound(b + 1, b + m + 1, a[i]) - b; /*-------------------------将该序列按树状数组方式插入线段树-------------------------*/ for (int i = 1; i <= n; i++) insert(i, a[i], 1); int ans = 0; for (int i = 2; i <= n; i++) ans += sum(1, i - 1, a[i] + 1, m); qr(q); printf("%d\n", ans); while (q--) { int l, r; qr(l); qr(r); if (l > r) swap(l, r); /*-------------------------计算变化后的逆序对个数-------------------------*/ ans -= sum(l + 1, r - 1, 1, a[l] - 1); ans += sum(l + 1, r - 1, a[l] + 1, m); ans -= sum(l + 1, r - 1, a[r] + 1, m); ans += sum(l + 1, r - 1, 1, a[r] - 1); if (a[l] < a[r]) ans++; if (a[l] > a[r]) ans--; /*-------------------------修改-------------------------*/ insert(l, a[l], -1); insert(l, a[r], 1); insert(r, a[l], 1); insert(r, a[r], -1); swap(a[l], a[r]); printf("%d\n", ans); } return 0; }
- 1
信息
- ID
- 3806
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者