题面

逆序对

有一个长度为

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. [react] 什么是虚拟dom?虚拟dom比操作原生dom要快吗?虚拟dom是如何转变成真实dom并渲染到页面的?

    壹 ❀ 引 虚拟DOM(Virtual DOM)在前端领域也算是老生常谈的话题了,若你了解过vue或者react一定避不开这个话题,因此虚拟DOM也算是面试中常问的一个点,那么通过本文,你将了解到如下 ...

  2. C#实现[移除文件名中的非中文字符]

    更新记录: 2022年5月28日 从程序中抽出方法复用. 处理财务文件时写的一个小函数.用于移除文件名中的非中文字符. /// <summary> /// 移除文件名中的非中文字符 /// ...

  3. 部署ASP.NET Core最简单的办法,使用IIS部署ASP.NET Core应用

    本文迁移自Panda666原博客,原发布时间:2021年3月28日.写原文的时候.NET的最新版本是5.0,现在7的preview出来了,时间真快啊.抽空再写个在Windows Server Core ...

  4. 想学嵌入式?要不一起玩 Arduino 吧

    作者:HelloGitHub-Anthony 这里是 HelloGitHub 推出的<讲解开源项目>系列,本期介绍的是如何用开源硬件开发平台 Arduino,自己动手做一个温湿度显示器. ...

  5. CSRF跨站请求伪造与XSS跨域脚本攻击讨论

    今天和朋友讨论网站安全问题,聊到了csrf和xss,刚开始对两者不是神明白,经过查阅与讨论,整理了如下资料,与大家分享. CSRF(Cross-site request forgery):跨站请求伪造 ...

  6. babeljs源码

    babel.min.js!function(e,t){"object"==typeof exports&&"object"==typeof mo ...

  7. AI 绘画极简教程

    昨天在朋友圈发了几张我用AI绘画工具Disco Diffusion画的画 既然有同学问,就写个极简教程吧,画个图是足够了,想要深入了解还是自行百度吧,可以找到更详细的教程. 第 0 步:学会上网,注册 ...

  8. mobaxterm会话同步

    前言 之前用过MobaXterm,想不起来为啥不用了.后面主要还是用xshell,最近又在用WindTerm,WindTerm还不错,奈何有不少的Bug,所以又来研究一下MobaXterm 下午摸索了 ...

  9. pip安装报错Could not install packages due to an EnvironmentError: Missing dependencies for SOCK

    unset all_proxy && unset ALL_PROXY

  10. EfficientFormer:轻量化ViT Backbone

    论文:<EfficientFormer: Vision Transformers at MobileNet Speed > Vision Transformers (ViT) 在计算机视觉 ...