NC20861 兔子的逆序对(数学基础)

题目链接

解题思路

  由于题目中的数都是互不相同的,所以每交换一对数字,序列的逆序数的奇偶性就会改变一次(可以证明序列的奇偶性变化只与交换的这对数的大小关系有关)。

代码

int arr[maxn], tmp[maxn], n, m; ll cnt;
void merge(int l, int r) {
    if (l>=r) return;
    int mid = (l+r)>>1;
    merge(l, mid);
    merge(mid+1, r);
    int l1 = l, l2 = mid+1, tot = l;
    while(l1<=mid || l2<=r) {
        if (l2>r || (l1<=mid && arr[l1]<=arr[l2])) tmp[tot++] = arr[l1++];
        else {
            cnt += mid-l1+1;
            tmp[tot++] = arr[l2++];
        }
    }
    for (int i = l; i<=r; ++i) arr[i] = tmp[i];
}
int main() {
    cin >> n;
    for (int i = 1; i<=n; ++i) scanf("%d", &arr[i]);
    merge(1, n);
    int m; cin >> m;
    cnt = cnt&1;
    while(m--) {
        int l, r; scanf("%d%d", &l, &r);
        if (((r-l+1)/2)&1) cnt ^= 1;
        printf("%s\n", cnt&1 ? "dislike":"like");
    }
    return 0;
}
posted @ 2020-12-23 09:02  shuitiangong  阅读(132)  评论(0)    收藏  举报