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\)的一个排列,按照某种顺序依 ...
随机推荐
- -2.输入加速(cin,cout)
+ ios::sync_with_stdio(false);//加速几百毫秒 cin.tie(0); // 接近scanf cout.tie(0);
- linux常用理论(一)
第一周 1.按系列罗列Linux的发行版,并描述不同发行版之间的联系与区别. Debian Redhat issue 2.安装Centos7.9和ubuntu操作系统,创建一个自己名字的用户名,并可以 ...
- properties、yml配置文件映射对象
1.properties文件内容映射到类对象(属性),如Resource目录下的1.properties文件已配置前缀为com.imooc.people相关的信息,然后: pom添加依赖:spring ...
- [AcWing 777] 字符串乘方
点击查看代码 #include<iostream> using namespace std; string str; int main() { while (cin >> st ...
- 阿里新零售中的智能补货(I)— 库存模型
文章作者:阿里零售通算法团队 出品社区:DataFun 导读: 零售通作为阿里巴巴新零售的八路大军之一,肩负着"共建智能分销平台"和"让百万小店拥抱DT时代"的 ...
- 前端HTML-01
HTML是什么? 超文本标记语言,是一种用于创建网页的标记语言 文件的扩展名:.html或者.htm HTML不是什么? HTML是一种标记语言,不是变成语言. HTML文档结构 <!DOCTY ...
- 用js给闺女做了一个加减乘除的html
下班回家用二十分钟给闺女做了一个加减乘除的页面,顺便记录下代码,时间仓促,后期再来修改吧 目录结构 -yq --menu.html --yq.html --yq50.html --yq70.html ...
- maven install resources failed: newPosition < 0: (-1 < 0)
添加以下代码在 pom.xml 中,具体参阅这里 <build> <plugins> <plugin> <groupId>org.apache.mave ...
- leetcode 643. Maximum Average Subarray I 子数组最大平均数 I
一.题目大意 https://leetcode.cn/problems/maximum-average-subarray-i/ 给你一个由 n 个元素组成的整数数组 nums 和一个整数 k . 请你 ...
- 一个 "开箱即用" 个人博客全栈系统项目!vue+node+express+mysql+sequlize+uniapp
" MG'Blog " 一个 "开箱即用" 个人博客全栈系统项目! 探索本项目的源码 » 前台预览 · 管理端预览 v1.0.2 小程序预览 v1.0.2 介绍 ...