题面

逆序对

有一个长度为

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. 【zigbee无线通信模块步步详解】ZigBee3.0模块建立远程网络控制方法

    本文以路灯控制应用为例,简述ZigBee3.0模块使用流程. 一.建立网络 1.通过USB转串口模块将出厂的ZigBee自组网模块连接,打开上位机软件"E180-ZG120A-Setting ...

  2. 皓远的第二次博客作业(最新pta集,链表练习及期中考试总结)

    前言: 知识点运用:正则表达式,有关图形设计计算的表达式和算法,链表的相关知识,Java类的基础运用,继承.容器与多态. 题量:相较于上次作业,这几周在java方面的练习花了更多的精力和时间,所要完成 ...

  3. 当JAVA注解、AOP、SpEL相遇,更多可能变为了现实

    常规情况下,我们可以通过业务定制化的注解,借助AOP机制来实现某些通用的处理策略.比如定义个@Permission注解,可以用于标识在具体的方法上,然后用来指定某个方法必须要指定角色的人才能够访问调用 ...

  4. Leetcode 1051. 高度检查器

    这题的目的是找出排序后和排序前位置不同的元素的个数 正常通过复制出一个新的数组,然后对比排序后的数组就能做出,但是时间是1ms 然后发现一种基于桶排序来计数的做法 public int heightC ...

  5. rhel挂载本地光盘为yum源

    挂载光盘 mount /dev/sr0 /mnt/cdrom mkdir /mnt/cdrom 临时挂载 mount /dev/sr0 /mnt/cdrom 永久挂载光盘 mount -a 执行挂载 ...

  6. 【时序数据库InfluxDB】Windows环境下配置InfluxDB+数据可视化,以及使用 C#进行简单操作的代码实例

    前言:如题.直接上手撸,附带各种截图,就不做介绍了. 1.influxDB的官网下载地址  https://portal.influxdata.com/downloads/ 打开以后,如下图所示,可以 ...

  7. Tomcat日志乱码解决方法

    将配置文件logging.properties所有含有UTF-8的删除

  8. 图扑 Web 可视化引擎在仿真分析领域的应用

    ​ 前言 在数字孪生和仿真研究过程中,会产生大量和三维空间相关的数值信息,比如设备外观的扫描数据.地形扫描数据.生产设备温度场/压力场.流体的速度场.流体扩散,以及各种仿真数据:速度,压力,应力,温度 ...

  9. 对 API 平台的再思考【eolink翻译】

    API 是推动现代企业数字化转型的基础.它不但连接了内部应用程序.合作伙伴和客户,同时也快速持续地向市场提供了各种新产品.版本和功能. 但当下还是以集中式的 API 交付为主.一个企业的对外 API ...

  10. 【Unity基础知识】基础游戏单位GameObject中常用的属性和API

    一.GameObject中的成员变量 主要思想:得到该脚本依附的GameObject的相关信息 现有: Lesson4的代码: using System.Collections; using Syst ...