火柴排队(NOIP2013)(附树状数组专题讲解(其实只是粗略。。。))
首先,这道题目是一道神奇的题。
看到这道题,第一眼就觉得2个数组排个序,然后一一对应的时候一定差值最小。
由于我们可以将这2个数列同时进行调换。
所以我们先把2个数列排个序。
第二个序列中的数组的下标都指向第一个数组中的数的原来位置(其实就是离散化(真是啰嗦。。))
离散化之后,我们就变成了一个混乱的数列变成升序数列的操作次数是多少。
然后自然就会想到逆序对。每次变换之后逆序对的个数最多只能-1;
所以答案就是数列中逆序对的个数。
然后就是求逆序对啦。
逆序对有很多种做法:
TOP1:暴力O(N^2)时间TLE BOOM。。。!
TOP2:归并排序
TOP3:线段树
TOP4:树状数组(就是我写的)(又短又好写233~(PS:其实是其他的不会。。))
好吧。
其实我树状数组写的时候也不会,现学的。。
顺便讲讲树状数组的几个基本操作;
NUM1: update
代码如下:
void update(int x)
{
while(x<=n)
{
d[x]++;
x+=lowbit(x);
}
}
这就相当于给树状数组赋值/(+/-一个值)
在此lowbit就是x在二进制下的第一个1的位置。
实在看不懂可以找规律: 比如x=1时,n=8时,我们要赋值的数组为d[1],d[2],d[4],d[8];
当x=3时,我们要赋值的数组为d[3],d[4],d[8];
x=5:d[5],d[6],d[8];
恩,就是这样。
NUM2:getsum(相当于查询)
下面贴代码
int getsum(int x)
{
int ans=;
while(x>)
{
ans+=d[x];
x-=lowbit(x);
}
return ans;
}
相当于上一个查询顺序反过来(好像语序有问题。。。)
然后呢,这题就用这2个函数来求逆序对的个数。
在本代码中getsum(x)求的是x之前<=x的数的数量。
这样i-getsum(x)就是x之前>x的数的数量
即对于x的逆序对个数
最后累加一下,就是答案啦!
注意!在本代码中,c数组用于离散化,防止爆栈,同时也加快效率。
d[i]表示在c[i-lowbit(i)]到c[i]中<=c[i]的数出现的总次数!(重点!这个点我理解了很久,要多多消化。也许是因为我蒟蒻。。。)
好吧,下面贴代码
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int c[];
struct lisan{
int value,opt;
}a[],b[];
int cmp(lisan a,lisan b){return a.value<b.value;}
int d[];
int n;
int lowbit(int x){return x&(-x);}
void update(int x)
{
while(x<=n)
{
d[x]++;
x+=lowbit(x);
}
}
int getsum(int x)
{
int ans=;
while(x>)
{
ans+=d[x];
x-=lowbit(x);
}
return ans;
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d",&a[i].value);
a[i].opt=i;
}
for(int i=;i<=n;i++)
{
scanf("%d",&b[i].value);
b[i].opt=i;
}
sort(a+,a+n+,cmp);
sort(b+,b+n+,cmp);
for(int i=;i<=n;i++)
c[b[i].opt]=a[i].opt;
int ans=;
for(int i=;i<=n;i++)
{
update(c[i]);
ans+=i-getsum(c[i]);
ans=ans%;
}
printf("%d\n",ans);
}
祝大家编程愉快啦233~(反正我理解了1个多小时。。)
然后狠狠的被CLZ,QRC等一群学弟和zxyerD了一顿。。
火柴排队(NOIP2013)(附树状数组专题讲解(其实只是粗略。。。))的更多相关文章
- [NOIP2013提高&洛谷P1966]火柴排队 题解(树状数组求逆序对)
[NOIP2013提高&洛谷P1966]火柴排队 Description 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相 ...
- 【BZOJ】1699: [Usaco2007 Jan]Balanced Lineup排队(rmq/树状数组)
http://www.lydsy.com/JudgeOnline/problem.php?id=1699 我是用树状数组做的..rmq的st的话我就不敲了.. #include <cstdio& ...
- bzoj2141: 排队(分块+树状数组)
块套树为什么会这么快.. 先跑出原序列逆序对. 显然交换两个位置$l,r$,对$[1,l),(r,n]$里的数没有影响,所以只需要考虑$[l,r]$内的数. 设$(l,r)$内的数$a_i$,则按以下 ...
- Luogu P4901 排队 fib数列+树状数组+倍增
这题让我升华..还好只重构了一遍 首先我们发现:$n$较小时,整个队伍的形态 跟 $n$ 比较大时的局部是一样的 所以我们预处理出这个队伍的形态,和每一行每个位置的质因子个数的前缀和,$O(nlogn ...
- BZOJ 2141 排队(分块+树状数组)
题意 第一行为一个正整数n,表示小朋友的数量:第二行包含n个由空格分隔的正整数h1,h2,…,hn,依次表示初始队列中小朋友的身高:第三行为一个正整数m,表示交换操作的次数:以下m行每行包含两个正整数 ...
- Tido c++树状数组知识讲解(转载)
树状数组可以用来动态计算前缀和,可以随时进行更新 而普通的前缀和只是静态的
- 【 SPOJ - GRASSPLA】 Grass Planting (树链剖分+树状数组)
54 种草约翰有 N 个牧场,编号为 1 到 N.它们之间有 N − 1 条道路,每条道路连接两个牧场.通过这些道路,所有牧场都是连通的.刚开始的时候,所有道路都是光秃秃的,没有青草.约翰会在一些道 ...
- [树状数组+逆序对][NOIP2013]火柴排队
火柴排队 题目描述 涵涵有两盒火柴,每盒装有n根火柴,每根火柴都有一个高度.现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为:∑ (ai-bi)2,i=1,2,3,. ...
- Codevs 3286 火柴排队 2013年NOIP全国联赛提高组 树状数组,逆序对
题目:http://codevs.cn/problem/3286/ 3286 火柴排队 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : ...
随机推荐
- B-树 动机与结构
Ps.我们遵循从感性到理性的认知顺序来逐步探索B-树的奥秘,之前经常说的value这里用key(关键码)指代,因为可能存的是字符串,说是value就不合适了. (多图预警!!!建议在WI-FI下观看) ...
- PHP.TP框架下商品项目的优化1-时间插件、鼠标所在行高亮、布局规划页面
1.优化搜索表单中按时间搜索的功能 添加一个时间插件datetimepicker,在lst.html中,注意要导入jquery.min.js,此处从前文的在线编辑器中导入 <!-- 导入 --& ...
- CNN:
(1)卷积:对图像元素的矩阵变换,是提取图像特征的方法,多种卷积核可以提取多种特征.一个卷积核覆盖的原始图像的范围叫做感受野(权值共享).一次卷积运算提取的特征往往是局部的,难以提取出比较全局的特征, ...
- sourceInsight *** more bytes are required
现象:用sourceinsight修改的文件无法保存,提示 No enough space to save "XXX", xxx more bytes are required. ...
- CentOS 更换yum源为aliyun yum源
CentOS自带的yum源为官方的源,由于墙的原因,经常无法访问,国内也有不错的源,这里讲一下使用aliyun的源替换原yam源. 第一种方法 1.安装base reop源 cd /etc/yum.r ...
- 启动zookeeper报错:JAVA_HOME is not set
启动zookeeper时报错JAVA_HOME is not set 看了环境变量,确实配置好了,但是zookeeper竟然没找到 修改bin目录下的zkEnv.cmd关于jdk的一部分 set JA ...
- 《Cracking the Coding Interview》——第13章:C和C++——题目9
2014-04-25 20:37 题目:请设计一个字节对齐的malloc函数,配套上对应的free函数.要求这个函数分配出的内存块儿的首地址是某个值n的整数倍,n是2的整次幂,比如128.1024之类 ...
- 《Cracking the Coding Interview》——第8章:面向对象设计——题目2
2014-04-23 17:45 题目:假设有个呼叫中心,有接线员.经理.主管三种角色.如果接线员无法处理呼叫,就上传给经理:如果仍无法处理,则上传给主管.请用代码描述这一过程. 解法:第一眼觉得这题 ...
- python 学习分享-paramiko模块
paramiko模块学习分享 paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接.paramiko支持Linux, Solaris, BS ...
- 一个画ROC曲线的封装包
Draw_ROC_Curves This is a python file which is used for drawing ROC curves -f : assign file name -t ...