Codeforces 645B Mischievous Mess Makers【逆序数】
题目链接:
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;
}
Codeforces 645B Mischievous Mess Makers【逆序数】的更多相关文章
- CodeForces 645B Mischievous Mess Makers
		简单题. 第一次交换$1$和$n$,第二次交换$2$和$n-1$,第三次交换$3$和$n-2$.....计算一下就可以了. #pragma comment(linker, "/STACK:1 ... 
- Code Forces 645B Mischievous Mess Makers
		It is a balmy spring afternoon, and Farmer John's n cows are ruminating about link-cut cacti in thei ... 
- codeforces 655B B. Mischievous Mess Makers(贪心)
		题目链接: B. Mischievous Mess Makers time limit per test 1 second memory limit per test 256 megabytes in ... 
- 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 ... 
- Codeforces Gym 100463A Crossings 逆序数
		Crossings Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100463 Description ... 
- Codeforces Round #261 (Div. 2)459D. Pashmak and Parmida's problem(求逆序数对)
		题目链接:http://codeforces.com/contest/459/problem/D D. Pashmak and Parmida's problem time limit per tes ... 
- Codeforces Round #261 (Div. 2)  D. Pashmak and Parmida's problem (树状数组求逆序数  变形)
		题目链接 题意:给出数组A,定义f(l,r,x)为A[]的下标l到r之间,等于x的元素数.i和j符合f(1,i,a[i])>f(j,n,a[j]),求i和j的种类数. 我们可以用map预处理出 ... 
- Codeforces Round #301 (Div. 2) E . Infinite Inversions 树状数组求逆序数
		E. Infinite Inversions ... 
- CF 61E  树状数组+离散化 求逆序数加强版 三个数逆序
		http://codeforces.com/problemset/problem/61/E 题意是求 i<j<k && a[i]>a[j]>a[k] 的对数 会 ... 
随机推荐
- Oracle分区表例子
			分区表 Oracle提供的分区方法有以下几种. 1.范围分区(range) 范围分区是应用范围比较广的表分区方式,它是以列的值的范围来作为分区的划分条 件,将记录存放到列值所在的 range分区中. ... 
- VS Code  设置取消打开文件目录的自动定位跟踪功能。
			文件-->首选项-->设置-->在搜索栏中搜索:explorer.autoReveal; 去掉勾选即可. 
- Android学习笔记(十五) Http
			1.Http协议概要 应用程序和服务间的请求/响应是无状态的,即响应完即断开连接. HttpClient库是Android自带的,故无需引入该库 2.Http请求和获取数据 生成代表客户端的HttpC ... 
- idea 调试工具的使用
			原文:https://blog.csdn.net/hao_hl1314/article/details/53120918 Intellij IDEA Debug调试区工具的使用方法 快捷键F9 ... 
- Objective-C 里面的类对象复用小结
			OC 提供了单继承 (Inheritance), Category, Extension, Protocol 这几种基本的类与对象层面的复用机制,作一小结. 在这几个机制中,继承提供了纵向的复用,可以 ... 
- 如何用 CSS 绘制各种形状
			自适应的椭圆 1.自适应的椭圆 实现方式是通过border-radius这个属性:border-radius它可以单独指定水平和垂直半径.用 / 分隔这两个值.并且该属性的值不仅可以接受长度值,还能接 ... 
- 5.4QBXT 模拟赛 (Rank1 机械键盘 蛤蛤)
			NOIP2016提高组模拟赛 ——By wangyurzee7 中文题目名称 纸牌 杯具 辣鸡 英文题目与子目录名 cards cups spicychicken 可执行文件名 cards cups ... 
- CSS中常用属性之字体属性
			1,以下是CSS中常用字体属性: font-family 字体样式 font-size 字体大小 font-size-adjust 为元素规定 ... 
- nodejs的学习
			nodejs 就是使用js来编写服务端的程序.它的特性是(单线程 速度快 耗内存多 异步 事件驱动) ( 一些技术的解决方案:默认情况下是 1.不支持多核,可以使用cluster 进行解 ... 
- fedora配置ip
			fedora20配置静态ip 原创 2015年08月08日 14:36:01 标签: fedora / linux / 网络配置 / ip配置 / 网络设置 2403 在linux的世界里,给主机设置 ... 
