冒泡排序中 如果一个数的后面的某个数和这个数不符合排序规则 那么这个数就会在未来的某次冒泡中与那个数进行交换

这里用到了 树状数组求逆序数的办法来做 需要注意的是2028并不可以改完数组大小后直接套1526代码 因为会超出int的范围

树状数组求逆序对的耗时要比归并排序长一些 不过简单..

之所以要记录下来这道题是因为在其中并没有说 每一个数都是独一无二的 那么当我们离散化的时候就需要做出一些小的调整

1526

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<math.h>
#include<iostream>
#include<stack>
#include<vector>
using namespace std;
int c[5050];
int n;
struct node
{
int id;
int val;
};
node a[5050];
int cmp1(node a,node b)
{
return a.val<b.val;
}
int cmp2(node a,node b)
{
return a.id<b.id;
}
void lsh(){
sort(a+1,a+1+n,cmp1);
a[0].val=0;
for(int i=1;i<=n;i++)
{
int j=i;
while(a[j].val==a[i].val&&j<=n)
{
j++;
}
for(int k=i;k<j;k++)
{
a[k].val=i;
}
i=j-1;
}
sort(a+1,a+1+n,cmp2);
}
int lowbit(int i)
{
return i&(-i);
}
void add(int x)
{
for(int i=x;i<=n;i+=lowbit(i))
{
c[i]+=1;
}
}
int sum(int x)
{
int s=0;
for(int i=x;i>=1;i-=lowbit(i))
{
s+=c[i];
}
return s;
}
int main(){
while(cin>>n)
{
for(int i=1;i<=n;i++)
{
a[i].id=i;
cin>>a[i].val;
}
lsh();
memset(c,0,sizeof(c));
int ans=0;
for(int i=n;i>=1;i--)
{
int z=sum(a[i].val-1);
ans+=z;
add(a[i].val);
}
if(ans>1000000)
printf("xiaohouTLE!\n");
else
{
printf("xiaohouV5!\n");
}
}
}

2028

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<math.h>
#include<iostream>
#include<stack>
#include<vector>
using namespace std;
long long c[500050];
long long n;
struct node
{
long long id;
long long val;
};
node a[500050];
long long cmp1(node a,node b)
{
return a.val<b.val;
}
long long cmp2(node a,node b)
{
return a.id<b.id;
}
void lsh(){
sort(a+1,a+1+n,cmp1);
a[0].val=0;
for(long long i=1;i<=n;i++)
{
long long j=i;
while(a[j].val==a[i].val&&j<=n)
{
j++;
}
for(long long k=i;k<j;k++)
{
a[k].val=i;
}
i=j-1;
}
sort(a+1,a+1+n,cmp2);
}
long long lowbit(long long i)
{
return i&(-i);
}
void add(long long x)
{
for(long long i=x;i<=n;i+=lowbit(i))
{
c[i]+=1;
}
}
long long sum(long long x)
{
long long s=0;
for(long long i=x;i>=1;i-=lowbit(i))
{
s+=c[i];
}
return s;
}
int main(){
while(cin>>n)
{
if(!n)
break;
for(long long i=1;i<=n;i++)
{
a[i].id=i;
cin>>a[i].val;
}
lsh();
memset(c,0,sizeof(c));
long long ans=0;
for(long long i=n;i>=1;i--)
{
long long z=sum(a[i].val-1);
ans+=z;
add(a[i].val);
}
cout<<ans<<endl;
}
}

  

hrbust oj 1526+2028 树状数组的更多相关文章

  1. FZU oj 2277 Change 树状数组+dfs序

    Problem 2277 Change Time Limit: 2000 mSec    Memory Limit : 262144 KB  Problem Description There is ...

  2. uestc oj 1217 The Battle of Chibi (dp + 离散化 + 树状数组)

    题目链接:http://acm.uestc.edu.cn/#/problem/show/1217 给你一个长为n的数组,问你有多少个长度严格为m的上升子序列. dp[i][j]表示以a[i]结尾长为j ...

  3. Libre OJ 130、131、132 (树状数组 单点修改、区间查询 -> 区间修改,单点查询 -> 区间修改,区间查询)

    这三题均可以用树状数组.分块或线段树来做 #130. 树状数组 1 :单点修改,区间查询 题目链接:https://loj.ac/problem/130 题目描述 这是一道模板题. 给定数列 a[1] ...

  4. hrbust 1840 (树状数组第k大) 删点使用

    小橙子 Time Limit: 2000 MS Memory Limit: 32768 K Total Submit: 2(2 users) Total Accepted: 1(1 users) Ra ...

  5. 玲珑学院OJ 1023 - Magic boy Bi Luo with his excited math problem 树状数组暴力

    分析:a^b+2(a&b)=a+b  so->a^(-b)+2(a&(-b))=a-b 然后树状数组分类讨论即可 链接:http://www.ifrog.cc/acm/probl ...

  6. Comet OJ - Contest #14 转转的数据结构题 珂朵莉树+树状数组

    题目链接: 题意:有两个操作 操作1:给出n个操作,将区间为l到r的数字改为x 操作2:给出q个操作,输出进行了操作1中的第x到x+y-1操作后的结果 解法: 把询问离线,按照r从小到大排序 每次询问 ...

  7. XJTUOJ wmq的队伍(树状数组求 K 元逆序对)

    题目链接:http://oj.xjtuacm.com/problem/14/[分析]二元的逆序对应该都会求,可以用树状数组.这个题要求K元,我们可以看成二元的.我们先从后往前求二元逆序对数, 然后对于 ...

  8. ACM学习历程—SNNUOJ 1239 Counting Star Time(树状数组 && 动态规划 && 数论)

    http://219.244.176.199/JudgeOnline/problem.php?id=1239 这是这次陕西省赛的G题,题目大意是一个n*n的点阵,点坐标从(1, 1)到(n, n),每 ...

  9. 【Hihocoder1034】毁灭者问题(splay,树状数组)

    题意: 假设你拥有 n 个魔法单位,他们从左到有站在一行,编号从 1 到 n. 每个单位拥有三项属性: si: 初始法力. mi: 最大法力上限. ri: 每秒中法力回复速度. 现在你操纵一个毁灭者, ...

随机推荐

  1. [Android Memory] Android Lint简介(转载)

    英文原文:http://tools.android.com/tips/lint  参照文章:http://blog.csdn.net/thl789/article/details/8037473 转载 ...

  2. ActionBarSherlock的使用——(一)配置

    小弟照着上面的去做,后来样式不一致,发现是用了虚拟机的缘故(虚拟机版本,API-8 2.2);就行了. 还有下面的第二步: 2.打开Eclipse,选择:FIle——New——Project——And ...

  3. 一、HTML和CSS基础--开发工具--Sublime前端开发工具技巧介绍

    下载:官网下载(根据系统下载) 安装:按步骤安装即可 注意:当前稳定版本为2,但3的功能有提升:Mac和Windows下的快捷键不同 优点:启动速度快,界面简洁,可以直接打开图片. 1 菜单栏主要功能 ...

  4. JUC回顾之-volatile的原理和使用

    1.计算机内存模型的相关概念 计算机在执行程序时,每条指令都是在CPU中执行的,在指令的执行过程中,涉及到数据的读取和写入.由于程序在运行的过程中数据是放在"主存"中的, 由于数据 ...

  5. 设计模式学习之建造者模式(Builder,创建型模式)(6)

    假如我们需要建造一个房子,并且我们也不知道如何去建造房子,所以就去找别人帮我们造房子 第一步: 新建一个房子类House,里面有房子该有的属性,我们去找房子建造者接口HouseBuilder,我们要建 ...

  6. sdut 2165:Crack Mathmen(第二届山东省省赛原题,数论)

    Crack Mathmen Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述  Since mathmen take securit ...

  7. Java Hour 46 SLF4J

    SLF4J(Simple Logging Facade for Jave). 上个章节在配置启动项目后,会报一个奇怪的错误,一开始以为是Maven 依赖有冲突,其实是和slf4j 密切相关的. 本文原 ...

  8. n个元素进栈,共有多少种出栈顺序?

    1.基于栈的问题分析 我们把n个元素的出栈个数的记为f(n), 那么对于1,2,3, 我们很容易得出:                                   f(1) = 1     / ...

  9. Ajax 学习之动态获取,返回服务器的值

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  10. 简单几何(判断矩形的位置) UVALive 7070 The E-pang Palace(14广州B)

    题目传送门 题意:给了一些点,问组成两个不相交的矩形的面积和最大 分析:暴力枚举,先找出可以组成矩形的两点并保存起来(vis数组很好),然后写个函数判断四个点是否在另一个矩形内部.当时没有保存矩形,用 ...