题目链接:

http://codeforces.com/problemset/problem/645/B

题意:

给定步数和排列,每步可以交换两个数,问最后逆序数最多是多少对?

分析:

看例子就能看出来肯定是不断往中间逼近,然后交换头尾两个,给定交换的对数,直接算就好了,复杂度O(1)

代码:

#include<iostream>
using namespace std;
typedef long long ll;
int main (void)
{ll n, m;cin>>n>>m;ll res = 0;ll ans = min(n/2, m);res = (n  - 1+ (n - ans + 1))/ 2 * ans + (n - 2 * ans + n - ans - 1)/2 * ans;cout<<res<<endl;return 0;
}

智商压制
直接用所有对数减去为改变的对数就好了嘛

#include<iostream>
using namespace std;
int main (void)
{long long n, m;cin>>n>>m;long long res = max(n - 2 * m, 0ll);long long ans = n * (n - 1)/2 - res * (res - 1) / 2;cout<<ans<<endl;return 0;
}

然后求逆序数的经典方法就是树状数组了,这里写下,时间复杂度O(nlogn)

#include<iostream>
using namespace std;
typedef long long ll;
const int maxn = 400020;
int bit[maxn], a[maxn];
int n, m;
int sum(int i)
{int s = 0;while(i){s += bit[i];i -= i & -i;}return s;
}
void add(int i, int x)
{while(i <= n){bit[i] += x;i += i & -i;}
}
int main (void)
{cin>>n>>m;if(m >= n / 2){cout<<(ll) n * (n - 1)/2<<endl;return 0;}for(int i = 1; i <= n; i++) a[i] = i;for(int i = 1; i <= m; i++) swap(a[i], a[n - i + 1]);ll res = 0;for(int i = 1; i <= n; i++){add(a[i], 1);res +=i - sum(a[i]);}cout<<res<<endl;
}

转载于:https://www.cnblogs.com/Tuesdayzz/p/5758724.html

Codeforces 645B Mischievous Mess Makers【逆序数】相关推荐

  1. CodeForces 645B Mischievous Mess Makers

    简单题. 第一次交换$1$和$n$,第二次交换$2$和$n-1$,第三次交换$3$和$n-2$.....计算一下就可以了. #pragma comment(linker, "/STACK:1 ...

  2. CROC 2016 - Elimination Round (Rated Unofficial Edition) B. Mischievous Mess Makers 贪心

    B. Mischievous Mess Makers 题目连接: http://www.codeforces.com/contest/655/problem/B Description It is a ...

  3. Codeforces Gym 100463A Crossings 逆序数

    Crossings Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100463 Description ...

  4. 剑指 offer set 22 数组中的逆序数

    总结 1. 题目为归并排序的变形, 不过我完全没想到 2. 在归并排序进行字符组 merge 时, 统计逆序数. merge 后, 两个子数组是有序的了, 下次再 merge 的时候就能以 o(n) ...

  5. 二叉树:二叉搜索树实现 逆序数问题

    关于逆序数的问题描述如下: 已知数组nums,求新数组count,count[i]代表了在nums[i]右侧且比 nums[i]小的元素个数. 例如: nums = [5, 2, 6, 1], cou ...

  6. 递归/归并:count of smaller numbers求逆序数

    已知数组nums,求新数组count,count[i]代表了在nums[i]右侧且比 nums[i]小的元素个数. 例如: nums = [5, 2, 6, 1], count = [2, 1, 1, ...

  7. 求排列的逆序数(分治)

    考虑1,2,-,n (n <= 100000)的排列i1,i2,-,in,如果其中存在j,k,满足 j < k 且 ij > ik, 那么就称(ij,ik)是这个排列的一个逆序. 一 ...

  8. 算法笔记-归并算法面试题、逆序数问题

    1. 题目 逆序对问题:在一个数组中,左边的数如果比右边大,则这两个数构成一个逆序对,请打印所有逆序对 比如说: 数组: 5, 1, 3,4,2 第一个元素是5,其右边有小于5的数,即1,3,4,2, ...

  9. 树状数组 _ 求逆序数

    注: 本文只是记录  ,您将从上面学习不到任何知识,除了 代码 (废话)第一次接触到树状数组,感觉接触到了新世界,理解这个思想用了好长时间,终于弄明白了(似懂非懂). 还有接触到了  离散化的思想, ...

最新文章

  1. [vSphere培训实录]利用模板部署虚拟机时的一个小错误
  2. Beta 冲刺(1/7)
  3. 全局变量名为 param1 var param1Value = webBrowser1.Document.InvokeScript(eval,new String[]{ param1}).To...
  4. memcached 和 redis 的区别与选择
  5. Linux学习(六):命令与文件的查阅,Root用户和个人用户使用which命令的差别...
  6. 中芯国际人事变动:蒋尚义回归 传梁孟松要走
  7. 马化腾王健林一起逛街 买了一杯茉莉茶却忘了拿走
  8. C#.Net工作笔记012---c# 文件操作_文件路径操作_随时更新
  9. Linux 网络配置 修改DNS配置文件/etc/resolv.conf后,重启网络,DNS配置丢失
  10. DMSP/OLS夜间灯光数据
  11. html小写罗马字符怎么写,如何在 LATEX 中插入大小写的罗马字符
  12. 软件开发方法的过程、特点、优缺点
  13. 基于51单片机的火灾报警系统仿真
  14. 基于Android的个人时间管理设计与开发
  15. 【牛刀小试4】斐波那契数
  16. 微信表情的字符编号完整版【图文并茂哦!】
  17. ION to SMMU
  18. acm中的一些博弈论知识
  19. Unity之Shader Pass 通道显示贴图的几种方法- 六
  20. c语言for循环如何打印菱形

热门文章

  1. Java单元测试实践-06.Mock后Stub静态方法
  2. 波浪下划线怎么设置_波浪线符号(word小技巧)
  3. 有ip可以建网站服务器,云服务器有独立ip吗?
  4. VC中用代码移动CDockPane的位置
  5. 如何在iPhone手机上安装ipa(应用安装包)
  6. 猿圈 题库_猿圈帮企业“测评”程序员
  7. Google Earth Engine(GEE)——Python干旱严重程度案例分析
  8. Android8.0未知来源应用安装权限
  9. 能用网络但是个个计算机不能连上,为什么无线网络连接上却不能上网,小编教你电脑连上无线网却不能上网怎么办...
  10. linux ps命令 详细介绍