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\)的一个排列,按照某种顺序依 ...
随机推荐
- IP协议/地址(IPv4&IPv6)概要
IP协议/地址(IPv4&IPv6)概要 IP协议 什么是IP协议 IP是Internet Protocol(网际互连协议)的缩写,是TCP/IP体系中的网络层协议. [1] 协议的特征 无连 ...
- python基础练习题(题目 将一个整数分解质因数。例如:输入90,打印出90=2*3*3*5)
day9 --------------------------------------------------------------- 实例014:分解质因数 题目 将一个整数分解质因数.例如:输入 ...
- 苞米面 C++ 模板库 介绍
苞米面 C++ 模板库 简介 苞米面 C++ 模板库,无需编译,直接包含头文件就可以. 所有模板类和算法都包含在 bmm 名字空间里,例如: bmm::recent. 需要 C++ 编译器,支持 C+ ...
- 微信小程序绑定函数如何携带参数
一开始以为微信小程序的语法是和VUE的语法一样的,直接@click="click(field)",结果却不是这样的 在微信小程序中我们需要设置一个 data-set ,然后在绑定的 ...
- [题解] trip
题目大意 给定一颗大小为 \(N\) 的树, \(1\)的度数不小于 \(2\) .每个点有一个颜色,要么为黑色要么为白色. 从 \(1\) 号点开始游走,计数器初始为 \(0\). 如果当前为黑点计 ...
- APP应用前端开发
1.开发手机APP前端要重视meta标签的编写: 2.注意HTML5标签在前端开发中的使用: 3.前端制作要舍弃CSS float属性(可flex布局),用绝对定位不利于页面布局的扩展: 4.APP前 ...
- ThreadLocal夺命11连问
前言 前一段时间,有同事使用ThreadLocal踩坑了,正好引起了我的兴趣. 所以近期,我抽空把ThreadLocal的源码再研究了一下,越看越有意思,发现里面的东西还真不少. 我把精华浓缩了一下, ...
- 五、C++运算符重载,使面向对象编程更方便
复数类CComplex 编译器做对象运算的时候,会调用对象的运算符重载函数(优先调用成员方法):如果没有成员方法,就砸全局作用域找合适的运算符重载函数 ++和--运算符是单目运算符,在参数列表里放上一 ...
- 详解CVE-2022-0847 DirtyPipe漏洞
摘要:本文详细介绍了CVE-2022-0847漏洞形成根因,相应补丁修复方法,通过本文让读者对CVE-2022-0847漏洞有更清晰的了解. 本文分享自华为云社区<CVE-2022-0847 D ...
- 安装Suberversion[SVN]到CentOS(YUM)
运行环境 系统版本:CentOS Linux release 7.3.1611 (Core) 软件版本:Suberversion-1.7.14 硬件要求:无 安装过程 1.安装YUM-EPEL源 Su ...