题目:Problem - D - Codeforces

题解

此题是给数组排序的题,操作是选取任意三个数,然后交换他们,确保他们的位置会发生改变。

可以交换无限次,最终可以形成一个不下降序列就输出“YES”,否则“NO”。

只需要注意以下两点即可解出此题:

1.如果数组中存在两个相同的元素,那么就一定满足题意,输出“YES”

(因为这样就可以移动任意第三个数且保证另外两个相同的数位置不变)

2.因为不下降序列的逆序对数量为0,且每次进行交换操作一定会改变偶数个逆序对,因此当逆序对数量为偶数时,满足题意

方法:

我是用map容器检验是否有重复元素,用树状数组离散化来求逆序对。

注意树状数组每次要初始化,且初始化范围为每次的n,不要全部初始化,会超时。

(map也要初始化)

代码

#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
typedef long long ll;
const int N = 5e5 + 10;
int n;
int tree[N];
map<int, int> vis;
struct node
{
int val, id;
} a[N];
void add(int i, int v)
{
while (i <= n)
{
tree[i] += v;
i += i & -i;
}
}
ll getsum(int i)
{
ll res = 0;
while (i > 0)
{
res += tree[i];
i -= i & -i;
}
return res;
}
bool cmp(node aa, node bb)
{
return aa.val < bb.val;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int T;
cin >> T;
while (T--)
{
vis.clear();
cin >> n;
int f = 0;
for (int i = 1; i <= n; ++i)
{
cin >> a[i].val;
a[i].id = i;
if (vis[a[i].val])
f = 1;
vis[a[i].val] = 1;
}
if (f)
{
cout << "YES" << endl;
continue;
}
sort(a + 1, a + 1 + n, cmp);
ll ans = 0;
for (int i = 1; i <= n; ++i)
{
add(a[i].id, 1);
ans += i - 1 - getsum(a[i].id - 1);
}
if (ans % 2 == 0)
cout << "YES" << endl;
else
cout << "NO" << endl;
for (int i = 1; i <= n; ++i)
{
tree[i] = 0;
}
}
return 0;
}

【CF1591】【数组数组】【逆序对】#759(div2)D. Yet Another Sorting Problem的更多相关文章

  1. 2021.12.10 P5041 [HAOI2009]求回文串(树状数组求逆序对)

    2021.12.10 P5041 [HAOI2009]求回文串(树状数组求逆序对) https://www.luogu.com.cn/problem/P5041 题意: 给一个字符串 \(S\) ,每 ...

  2. POJ2299Ultra-QuickSort(归并排序 + 树状数组求逆序对)

    树状数组求逆序对   转载http://www.cnblogs.com/shenshuyang/archive/2012/07/14/2591859.html 转载: 树状数组,具体的说是 离散化+树 ...

  3. HDU 1394 树状数组求逆序对

    Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java ...

  4. HDU 1394 Minimum Inversion Number (树状数组求逆序对)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题目让你求一个数组,这个数组可以不断把最前面的元素移到最后,让你求其中某个数组中的逆序对最小是多 ...

  5. poj3067 Japan 树状数组求逆序对

    题目链接:http://poj.org/problem?id=3067 题目就是让我们求连线后交点的个数 很容易想到将左端点从小到大排序,如果左端点相同则右端点从小到大排序 那么答案即为逆序对的个数 ...

  6. SGU180(树状数组,逆序对,离散)

    Inversions time limit per test: 0.25 sec. memory limit per test: 4096 KB input: standard output: sta ...

  7. 牛客练习赛38 D 题 出题人的手环 (离散化+树状数组求逆序对+前缀和)

    链接:https://ac.nowcoder.com/acm/contest/358/D来源:牛客网 出题人的手环 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K,其他 ...

  8. [NOIP2013提高&洛谷P1966]火柴排队 题解(树状数组求逆序对)

    [NOIP2013提高&洛谷P1966]火柴排队 Description 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相 ...

  9. [NOI导刊2010提高&洛谷P1774]最接近神的人 题解(树状数组求逆序对)

    [NOI导刊2010提高&洛谷P1774]最接近神的人 Description 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某 ...

  10. codeforces 459D D. Pashmak and Parmida's problem(离散化+线段树或树状数组求逆序对)

    题目链接: D. Pashmak and Parmida's problem time limit per test 3 seconds memory limit per test 256 megab ...

随机推荐

  1. [luogu4548]歌唱王国

    (可以参考hdu4652,因此推导过程比较省略) 类似的定义$f_{i}$和$g_{i}$,同样去插入$len$个字符,但注意到并不是任意一个位置都可以作为结尾,$i+j$可以作为结尾当且仅当$s[0 ...

  2. maven项目打包不带版本号的操作

  3. springboot和mybatis集成

    springboot和mybatis集成 pom  <?xml version="1.0" encoding="UTF-8"?> <proje ...

  4. ppt的作用

    ppt不重要,使用ppt的场合很重要. 演讲分享,答辩总结,商业竞标,新年计划,年终总结.

  5. [LCT学习时的一些笔记]

    会找时间写一篇学习笔记的. \(Access\)的操作是把\(x\)和\(x\)所在原树的顶端点的路径变为一个\(splay\) 对于原树边我们有这样的操作,对每个\(splay\)的顶点维护一个父亲 ...

  6. Codeforces 986E - Prince's Problem(树上前缀和)

    题面传送门 题意: 有一棵 \(n\) 个节点的树,点上有点权 \(a_i\),\(q\) 组询问,每次询问给出 \(u,v,w\),要求: \(\prod\limits_{x\in P(u,v)}\ ...

  7. python项目——新闻管理系统

    DAO(Data Access Object) 数据访问对象是一个面向对象的数据库接口 控制台的输入输出都是再app.py里面完成的  mysql_db.py import mysql.connect ...

  8. git添加新账号

    1,在linux上添加账号 useradd test passwd test usermod -G gitgroup  test  将test账号的组改为和git一样的组gitgroup  git所在 ...

  9. C#页面缓存设置

    protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { Sessioninfo(); } Session.R ...

  10. Centos7服务器上RabbitMQ单机安装

    一.背景 最近项目中用到了RabbitMQ,但是发现自己本地没有安装,此文记录一下本地RabbitMQ的安装过程.注意不同的系统安装方式略有不同,此处我们记录的是Centos7的安装方式. 二.安装方 ...