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\)的一个排列,按照某种顺序依 ...
随机推荐
- 数据建模软件Chiner,颜值与实用性并存
目录 一.chiner介绍 二.值得关注的功能点 2.1. 兼容各种格式的数据建模文件 2.2. 支持多数据库.代码生成 2.3. 支持逻辑视图与物理视图设计 2.4. 自动生成数据库文档 三.总结 ...
- 小程序开发之获取客户来源 scene 场景值 手机设备信息
为什么要获取客户来源 用作数据分析,根据客户来源,做精准转化! 判断客户来源入口方式 1.通过官方的scene场景值 常见场景值 场景值ID 说明 1001 发现栏小程序主入口,「最近使用」列表 10 ...
- 【虚拟机】VMware-open-vm-tools安装
open-vm-tools(VMware-tools的进化版) VMware Tool 和 open-vm-tools任选一样安装即可 在终端进入超级用户 换源下载,依次输入下面命令 sudo cp ...
- 从0开始用webpack开发antd,react组件库npm包并发布
一.初始化一个npm包 1.新建一个文件夹(名称随意,建议和报名一致),输入命令 :npm init -y 会自动生成一个包的说明文件 package.json如下(本文以scroll-antd-ta ...
- CSS 字体超出 省略 ... 展示
效果 /* 标题 */ .title_t{ color: #000000; font-size: 130%; display: inline-block; line-height: 30px; wid ...
- XCTF练习题---CRYPTO---safer-than-rot13
XCTF练习题---CRYPTO---safer-than-rot13 flag:no_this_is_not_crypto_my_dear 解题步骤: 1.观察题目,下载附件 2.打开后发现是个文件 ...
- shell脚本实现MySQL全量备份+异地备份
一.知识储备工作: Mysql导出数据库语法: mysqldump -u用户名 -p密码 数据库名 > 数据库名.sql shell脚本for循环及if条件判断基本语法 gzip压缩文件用法 r ...
- 『现学现忘』Git基础 — 20、Git中忽略文件补充
目录 1.忽略文件常遇到的问题 2.忽略文件配置优先级 3.忽略已跟踪文件的改动(本机使用) 4.autocrlf和safecrlf参数说明 (1)提出问题 (2)autocrlf说明 (3)safe ...
- 【python疫情可视化】用pyecharts开发全国疫情动态地图,效果酷炫!
一.效果演示 我用python开发了一个动态疫情地图,首先看下效果: 如图所示,地图根据实时数据通过时间线轮播的方式,动态展示数据的变化.随着时间的推移,疫情确诊数量的增多,地图各个省份颜色逐渐加深, ...
- Java异常处理最佳实践
总结一些Java异常的处理原则 Java异常处理最佳实践 不要忘记关闭资源 在finally里关闭资源 public void readFile() { FileInputStream fileInp ...