NC20861 兔子的逆序对
NC20861 兔子的逆序对
题目
题目描述
兔子最近喜欢上了逆序对。一个逆序对 \((i,j)\) 需要满足 \(i < j\) 且 \(a_i > a_j\) 。兔子觉得只是求一个序列的逆序对个数太没有意思了。于是兔子想到了一个更有趣的问题!
兔子可以把区间 \([L,R]\) 反转,例如序列 \(\{1,2,3,4\}\) 反转区间 \([1,3]\) 后是 \(\{3,2,1,4\}\) 。兔子有 \(m\) 次反转操作,现在兔子想知道每次反转后逆序对个数是奇数还是偶数,兔子喜欢偶数,而讨厌奇数。
请注意,每一次反转操作都会对原序列进行改变。例如序列 \(\{1,2,3,4\}\) 第一次操作区间 \([1,2]\) 后变成 \(\{2,1,3,4\}\) 第二次反转区间 \([3,4]\) 后变成 \(\{2,1,4,3\}\) 。
输入描述
第一行一个整数 \(n\) ,表示序列的大小。
第二行 \(n\) 个整数 \(a_i\) 表示序列的各个元素。
第三行一个整数 \(m\) ,表示操作个数。
接下来 \(m\) 行,每行两个整数 \(l\),\(r\),表示反转的区间。
输出描述
输出共 \(m\) 行每行一个字符串,表示反转后序列逆序对个数的奇偶性,如果是逆序对个数奇数,输出"dislike"(不含引号),如果是偶数,输出"like"。
示例1
输入
4
1 2 3 4
4
1 2
3 4
1 4
2 3
输出
dislike
like
like
dislike
说明
注意:以下的 \((i,j)\) 指的是位置 \(i\) 和位置 \(j\)
\(a=\{2,1,3,4\}\) 的逆序对是 \((1,2)\) 共 \(1\) 个,\(1\) 是奇数,所以是dislike
\(a=\{ 2,1,4,3 \}\) 的逆序对是 \((1,2)\) \((3,4)\) 共 \(2\) 个, \(2\) 是偶数,所以是like
\(a=\{3,4,1,2\}\) 的逆序对是 \((1,3)\) \((1,4)\) \((2,3)\) \((2,4)\)共 \(4\) 个, \(4\) 是偶数,所以是like
\(a=\{3,1,4,2\}\) 的逆序对是 \((1,2)\) \((1,4)\) \((3,4)\) 共 \(3\) 个, \(3\) 是奇数,所以是dislike
备注:
对于 \(20\%\) 的数据
\(1 \leq n \leq 100\)
\(1 \leq m \leq 10\)
对于 \(40\%\) 的数据
\(1 \leq n \leq 2000\)
\(1 \leq m \leq 50\)
对于 \(60\%\) 的数据
\(1 \leq n \leq 2000\)
\(1 \leq m \leq 10^4\)
对于 \(100\%\) 的数据
\(1 \leq n \leq 10^5\)
\(1 \leq m \leq 2 \cdot 10^6\)
对于所有数据 \(l \leq r\) 且 \(a_i\) 是 \(n\) 的一个排列,即 \(a_i\) 互不相同且 \(a_i \leq n\)
由于读入数据较大,建议使用快速读入。
题解
思路
知识点:思维,排序,递归。
假设一段长为 \(n\) 的序列的逆序数是 \(x\) ,则反转以后的逆序数是 \(\frac{n(n-1)}{2} - x\) ,因为所有不成逆序的对会变为逆序,而原本逆序的对会变成不逆序的。随后我们发现,反转一段序列会导致逆序数变化量为 \(\frac{n(n-1)}{2} -2x\) ,即决定变化量奇偶性的是 \(\frac{n(n-1)}{2}\) ,如果为偶,则原奇偶性不变;如果为奇,则原奇偶性变化。
时间复杂度 \(O(n\log n + m)\)
空间复杂度 \(O(n)\)
代码
#include <bits/stdc++.h>
using namespace std;
int a[100007], b[100007], cnt;
inline int read() {
    int x = 0, f = 1;
    char c = getchar();
    while (c < '0' || c>'9') {
        if (c == '-') f = -1;
        c = getchar();
    }///整数符号
    while (c >= '0' && c <= '9') {
        x = (x << 3) + (x << 1) + (c ^ 48);
        c = getchar();
    }///挪位加数
    return x * f;
}
void merge_sort(int l, int r) {
    if (l == r) return;
    int mid = l + r >> 1;
    merge_sort(l, mid);
    merge_sort(mid + 1, r);
    int i = l, j = mid + 1, k = l;
    while (i <= mid && j <= r) {
        if (a[i] <= a[j]) b[k++] = a[i++];
        else b[k++] = a[j++], cnt += mid - i + 1;
    }
    while (i <= mid) b[k++] = a[i++];
    while (j <= r) b[k++] = a[j++];
    for (int i = l;i <= r;i++) a[i] = b[i];
}
int main() {
    std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int n = read();
    for (int i = 0;i < n;i++) a[i] = read();
    merge_sort(0, n - 1);
    bool flag = cnt & 1;
    int m = read();
    while (m--) {
        int l = read(), r = read();
        long long feat = 1LL * (r - l + 1) * (r - l) / 2;
        if (feat & 1)  flag ^= 1;
        if (flag) cout << "dislike" << '\n';
        else cout << "like" << '\n';
    }
    return 0;
}
NC20861 兔子的逆序对的更多相关文章
- 【CQOI2011】动态逆序对 BZOJ3295
		Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计 ... 
- CH Round #72 奇数码问题[逆序对 观察]
		描述 你一定玩过八数码游戏,它实际上是在一个3*3的网格中进行的,1个空格和1~8这8个数字恰好不重不漏地分布在这3*3的网格中. 例如:5 2 81 3 _4 6 7 在游戏过程中,可以把空格与其上 ... 
- POJ3928Ping pong[树状数组 仿逆序对]
		Ping pong Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3109 Accepted: 1148 Descrip ... 
- NOIP2013火柴排队[逆序对]
		题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: ∑(ai-bi)^2 其中 ai 表示 ... 
- bzoj 3295 动态逆序对 CDQ分支
		容易看出ans[i]=ans[i-1]-q[i],q[i]为删去第i个数减少的逆序对. 先用树状数组算出最开始的逆序对,预处理出每个数前边比它大的和后边比它小的,就求出了q[i]的初始值. 设b[i] ... 
- 诸城模拟赛 dvd的逆序对
		[题目描述] dvd是一个爱序列的孩子. 他对序列的热爱以至于他每天都在和序列度过 但是有一个问题他却一直没能解决 给你n,k求1~n有多少排列有恰好k个逆序对 [输入格式] 一行两个整数n,k [输 ... 
- 归并求逆序数(逆序对数) &&  线段树求逆序数
		Brainman Time Limit: 1000 MS Memory Limit: 30000 KB 64-bit integer IO format: %I64d , %I64u Java c ... 
- BZOJ 3295: [Cqoi2011]动态逆序对
		3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3865 Solved: 1298[Submit][Sta ... 
- BZOJ 3295 【Cqoi2011】 动态逆序对
		Description 对于序列\(A\),它的逆序对数定义为满足\(i<j\),且\(A_i>A_j\)的数对\((i,j)\)的个数.给\(1\)到\(n\)的一个排列,按照某种顺序依 ... 
随机推荐
- git-config配置多用户环境以及 includeIf用法
			git-config配置多用户环境以及 includeIf用法 git-config配置多用户环境以及 includeIf用法 背景 介绍 配置 栗子 背景 开发人员经常遇到这样的问题,公司仓库和个人 ... 
- Spring的3级缓存和循环引用的理解
			此处是我自己的一个理解,防止以后忘记,如若那个地方理解不对,欢迎指出. 一.背景 在我们写代码的过程中一般会使用 @Autowired 来注入另外的一个对象,但有些时候发生了 循环依赖,但是我们的代码 ... 
- Vue.js 3.x 中跨层级组件如何传递数据?
			provide/inject 基本用法 在 Vue.js 中,跨层级组件如果想要传递数据,我们可以直接使用 props 来将祖先组件的数据传递给子孙组件: 注:上图来自 Vue.js 官网:Prop ... 
- 【Pandas vs SQL】数据分析代码逐行比对,孰优孰劣?
			在数据分析领域,pandas是python数据分析基础工具,SQL是数据库最常用分析语言.二者有相通的地方,也有很大的语法不同,做起数据分析来,谁将更胜一筹呢? 做过业务开发.跟数据库打交道比较多的小 ... 
- Golang 函数 方法 接口的简单介绍
			函数 函数是基本的代码块,通常我们会将一个功能封装成一个函数,方便我们调用,同时避免代码臃肿复杂. 函数的基本格式 func TestFunc(a int, b string) (int, strin ... 
- 国产开源优秀新一代MPP数据库StarRocks入门之旅-数仓新利器(上)
			概述 背景 Apache Doris官方地址 https://doris.apache.org/ Apache Doris GitHub源码地址 https://github.com/apache/i ... 
- ID为XXXX的进程当前未运行
			项目文件夹下,有个.vs的文件夹,删除掉,然后重新打开项目就ok了. 或者: 在启动项目根目录下用文本编辑器打开Web项目下的{X}.csproj文件,然后查找 <WebProjectPrope ... 
- 846. Hand of Straights - LeetCode
			Question 846. Hand of Straights Solution 题目大意:打牌,判断牌是否能全部按顺子出 思路:构造一个list,存储1,2,3,4,5,6,7,8并排序,构造一个m ... 
- PKUSC2022 游记
			PKUSC2022 游记 Day1 上午随便看了点题,感觉没看什么题就开考了. 开考之后先看 T1,发现 T1 好像不是那么简单. T1 : 九条可怜有两个账号,她每次都会打 \(\rm rating ... 
- js算法-计算素数暴力算法
