题面

逆序对

有一个长度为

N

\tt N

N 的排列

a

a

a,进行

M

\tt M

M 次操作,操作有

4

\tt 4

4 种:

  • 1 l r :交换

    a

    l

    \tt a_l

    al​ 和

    a

    r

    \tt a_r

    ar​.

  • 2 l r :翻转区间

    [

    l

    ,

    r

    ]

    \tt [l,r]

    [l,r].

  • 3 l r k :将区间

    [

    l

    ,

    r

    ]

    \tt [l,r]

    [l,r] 中的数向左转

    k

    \tt k

    k 位.

  • 4 l r k :将区间

    [

    l

    ,

    r

    ]

    \tt [l,r]

    [l,r] 中的数向右转

    k

    \tt k

    k 位.

每次操作后,询问该排列是奇排列还是偶排列。

1

N

2

1

0

5

1

M

5

1

0

5

\tt 1\leq N\leq 2\cdot10^5,1\leq M\leq5\cdot10^5

1≤N≤2⋅105,1≤M≤5⋅105.

题解

一共三道题的比赛总是那么极端,第一题永远都是用来拉开时间差距以及淘汰过于弱小的选手的签到题。当然,情况并不绝对,有的人尽管这一道题没有做出来,但还是拿了

240

\tt240

240 的高分。

有这么一个显而易见的结论:交换排列中相邻的两个数,逆序对数一定变化

1

\tt1

1 。

那么所有的操作,都用交换相邻两个数的基本操作组成,就可以简化不少了。

对于第一种操作,逆序对数一定变化

1

\tt1

1 ,也就是奇偶性改变。动用行列式的知识我们也可以得到这个结论。可以这么想:

a

r

\tt a_r

ar​ 先移动到

a

l

+

1

\tt a_{l+1}

al+1​ 的位置,与

a

l

\tt a_l

al​ 交换,再移动回去。来回一趟交换次数是偶数,加上与

a

l

\tt a_l

al​ 交换那一次,一定是奇数。有选手在评论区说,

l

=

r

\tt l=r

l=r 时要特判……也有道理,毕竟题目条件给的是

l

r

\tt l\leq r

l≤r。

对于第二种操作,相当于把中心对称的点都进行一次操作一,不必过多赘述。

对于第三种操作和第四种操作,都是把一段的点移动到另一端,进行

k

\tt k

k 次。每移动一次,相邻交换的次数是

r

l

\tt r-l

r−l ,那么对逆序对数的改变量就

(

r

l

)

k

(
 ⁣ ⁣ ⁣ ⁣

m

o

d

  

2

)

\tt\equiv(r-l)*k~~(\!\!\!\!\mod2)

≡(r−l)∗k  (mod2) 。

CODE

为体现对数据的尊重,我把操作一

l

=

r

\tt l=r

l=r 的特判加上了。

#include<map>
#include<queue>
#include<cmath>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define MAXN 500005
#define ENDL putchar('\n')
#define LL long long
#define DB double
#define lowbit(x) ((-x) & (x))
LL read() {
LL f = 1,x = 0;char s = getchar();
while(s < '0' || s > '9') {if(s=='-')f = -f;s = getchar();}
while(s >= '0' && s <= '9') {x=x*10+(s-'0');s = getchar();}
return f * x;
}
const int MOD = 1000000007;
int n,m,i,j,s,o,k;
int a[MAXN];
int c[MAXN];
void addc(int x,int y) {while(x<=n)c[x]+=y,x+=lowbit(x);}
int Sum(int x) {int as=0;while(x>0)as+=c[x],x-=lowbit(x);return as;}
int main() {
n = read();m = read();
for(int i = 1;i <= n;i ++) {
a[i] = read();
}
int sum = 0;
for(int i = n;i > 0;i --) {
(sum += Sum(a[i]-1)) %= 2;
addc(a[i],1);
}
for(int i = 1;i <= m;i ++) {
k = read();
if(k == 1) {
s = read();o = read();
if(s != o) sum ^= 1;
}
else if(k == 2) {
s = read();o = read();
int le = (o-s+1)/2;
sum ^= (le&1);
}
else {
s = read();o = read();k = read();
int le = (k&1) * (o-s);
sum ^= (le&1);
}
printf("%d\n",sum&1);
}
return 0;
}

牛客IOI周赛26-提高组 A. 逆序对的更多相关文章

  1. 牛客IOI周赛17-提高组 卷积 生成函数 多项式求逆 数列通项公式

    LINK:卷积 思考的时候 非常的片面 导致这道题没有推出来. 虽然想到了设生成函数 G(x)表示最后的答案的普通型生成函数 不过忘了化简 GG. 容易推出 \(G(x)=\frac{F(x)}{1- ...

  2. 牛客OI周赛9-提高组题目记录

    牛客OI周赛9-提高组题目记录 昨天晚上做了这一套比赛,觉得题目质量挺高,而且有一些非常有趣而且非常清奇的脑回路在里边,于是记录在此. T1: 扫雷 题目链接 设 \(f_i\) 表示扫到第 \(i\ ...

  3. 牛客OI周赛8-提高组A-用水填坑

    牛客OI周赛8-提高组A-用水填坑 题目 链接: https://ac.nowcoder.com/acm/contest/403/A 来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制: ...

  4. 牛客OI周赛2-提高组

    A.游戏 链接:https://www.nowcoder.com/acm/contest/210/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语 ...

  5. 牛客OI周赛11-普及组 B Game with numbers (数学,预处理真因子)

    链接:https://ac.nowcoder.com/acm/contest/942/B 来源:牛客网 Game with numbers 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C+ ...

  6. 牛客OI周赛7-提高组 A 小睿睿的等式

    链接:https://ac.nowcoder.com/acm/contest/371/A来源:牛客网 小睿睿在游戏开始时有n根火柴棒,他想知道能摆成形如“A+B=n”的等式且使用的火柴棒数也恰好等于n ...

  7. 牛客OI周赛7-提高组 B小睿睿的询问(ST打表)

    链接:https://ac.nowcoder.com/acm/contest/371/B来源:牛客网 小睿睿的n个妹纸排成一排,每个妹纸有一个颜值val[i].有m个询问,对于每一个询问,小睿睿想知道 ...

  8. 牛客OI周赛7-普及组 解题报告

    出题人好评. 评测机差评. A 救救喵咪 二位偏序.如果数据范围大的话直接树状数组,不过才1000就\(O(n^2)\)暴力就ok了. #include <bits/stdc++.h> s ...

  9. 牛客OI周赛10-普及组-A眼花缭乱的街市-(加速+二分)

    https://ac.nowcoder.com/acm/contest/901/A 很简单的一道题,全场只有20+AC,卡时间.新学了cin加速语法和数组二分查找的函数调用. 知道有个读写挂,可以加速 ...

随机推荐

  1. python生产exe文件yi以及解释器配置等

    原文链接:https://blog.csdn.net/weixin_42691768/article/details/81044666 https://www.cnblogs.com/paulwhw/ ...

  2. 【FAQ】运动健康服务REST API接口使用过程中常见问题和解决方法总结

    华为运动健康服务(HUAWEI Health Kit)为三方生态应用提供了REST API接口,通过其接口可访问数据库,为用户提供运动健康类数据服务.在实际的集成过程中,开发者们可能会遇到各种问题,这 ...

  3. NB-IoT/LoRa/eMTC和蓝牙/WiFi的关系是互补还是替代?

    近年来,相继出现了许多物联网技术.WiFi.蓝牙.NB-IoT.LoRa.eMTC和其他技术为IoT实践提供了一流的技术支持通讯端口.拥有这么多技术,能够互相替代吗?还是能起到互补的作用?为低功耗广域 ...

  4. Camunda如何适配国产数据库达梦

    前言 camunda流程引擎官方支持的数据库有:MySQL .MariaDB .Oracle .DB2 .PostgreSQL .SQL Server.H2.对于其他类型的数据库如何支持,尤其是国产数 ...

  5. Ubuntu Linux处理Waiting for cache lock: Could not get lock /var/lib/dpkg/lock-frontend. It is held by process 3365 (unattended-upgr)问题

    问题 在Ubuntu中,执行apt install后,出现以下问题: Waiting for cache lock: Could not get lock /var/lib/dpkg/lock-fro ...

  6. Apache Poi 操作word,替换字符保留样式问题,runs段落混乱问题。

    关于这个问题也是刚好遇到,一通搜索也没有找到类似的或者是有效的方法.下面介绍一下. 首先apache poi的引入 <dependency> <groupId>org.apac ...

  7. 1.为什么要从古典概率入门概率学《zobol的考研概率论教程》

    在入门概率论与数理统计这门课中,刚开始我们都会从古典概率开始学习,为什么要选择它呢?这是因为古典概率作为一种将生活中的事情简化为有限种情况,并假设它们的发生可能差不多的手段,十分的好用且简洁. 这里我 ...

  8. cve-2021-42287和cve-2021-42278漏洞复现

    一.漏洞概述 cve-2021-42287 : 由于Active Directory没有对域中计算机与服务器账号进行验证,经过身份验证的攻击 者利用该漏洞绕过完全限制,可将域中普通用户权限提升为域管理 ...

  9. 原生实现.NET5.0+ 自定义日志

    一.定义一个静态类 声明一个 ReaderWriterLockSlim 对象 用于并发控制 1 /// <summary> 2 /// IO锁 3 /// </summary> ...

  10. python超级有用的实战项目,拿走不谢~

    写在前面的一点P话: Python是目前最好的编程语言之一.由于其可读性和对初学者的友好性,已被广泛使用. 那么要想学会并掌握Python,可以实战的练习项目是必不可少的. 直接上第一个项目~ 猜字游 ...