P1966 火柴排队
这道题需要小小的思考一波
(然而我思考了两节课)
好,我们先得出一个结论:a中第k大的与b中第k大的一定要排在一起,才能保证最小。
然后发现:挪a,b其实没有区别,故我们固定a,挪b。
然后我们就思考:只能挪相邻的,那么就是求逆序对数啊!
那么我们把这两个固定到结构体里,按a排序,求b的逆序对。
交上去,自信WA,10分。。。
让我们看一组样例:
4
4 1 2 3
3 1 2 4
显然要5下,但我的程序无情的输出了一个1
那么我们再思考:
逆序对的目的是把这些东西挪成1,2,3,4,5,6,7......
那么我们给这些东西的目标位置顺序标号1,2,3,4,5,6,7......,记为aim,分别扔到现在位置上。
这些东西现在的位置记为1,2,3,4,5,6,7......,记为num
那么我们把这些东西从num挪到aim,等效于从aim挪到num
由于num是有序的,我们求aim的逆序对就OK了!
本题并不用离散化(李三花)
#include <cstdio>
#include <cstring>
#include <algorithm>
#define lowbit(a) (a&(-a))
using namespace std;
const int N = ;
const int mo= ;
int n,/*x[N],*/tree[N];
struct March
{
int sum,num,aim;
}a[N],b[N];
void add(int x,int v)
{
for(int i=x;i<=n;i+=lowbit(i)) tree[i]+=v;
return;
}
int getsum(int x)
{
int ans=;
for(int i=x;i>;i-=lowbit(i)) ans+=tree[i];
return ans;
}
bool cmp1(March f,March d)
{
return f.sum<d.sum;
}
bool cmp2(March f,March d)
{
return f.num<d.num;
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d",&a[i].sum);
a[i].num=i;
}
for(int i=;i<=n;i++)
{
scanf("%d",&b[i].sum);
b[i].num=i;
//x[i]=b[i].sum;
}
/*
sort(x+1,x+n+1);
int k=0;
for(int i=1;i<=n;i++) if(x[i]!=x[i-1]) x[++k]=x[i];
*/
sort(a+,a+n+,cmp1);
sort(b+,b+n+,cmp1);
for(int i=;i<=n;i++) b[i].aim=a[i].num;
sort(b+,b+n+,cmp2);
int ans=;
for(int i=;i<=n;i++)
{
ans+=(i--getsum(b[i].aim));
ans%=mo;
add(b[i].aim,);
} printf("%d",ans); return ;
}
那么,AC代码在此
P1966 火柴排队的更多相关文章
- 【刷题】洛谷 P1966 火柴排队
题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: ∑(ai-bi)^2 其中 ai 表示 ...
- [NOIP2013提高&洛谷P1966]火柴排队 题解(树状数组求逆序对)
[NOIP2013提高&洛谷P1966]火柴排队 Description 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相 ...
- 洛谷 P1966 火柴排队 解题报告
P1966 火柴排队 题目描述 涵涵有两盒火柴,每盒装有 \(n\) 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: \(\s ...
- luogu P1966 火柴排队 (逆序对)
luogu P1966 火柴排队 题目链接:https://www.luogu.org/problemnew/show/P1966 显然贪心的想,排名一样的数相减是最优的. 证明也很简单. 此处就不证 ...
- 洛谷——P1966 火柴排队&&P1774 最接近神的人_NOI导刊2010提高(02)
P1966 火柴排队 这题贪心显然,即将两序列中第k大的数的位置保持一致,证明略: 树状数组求逆序对啦 浅谈树状数组求逆序对及离散化的几种方式及应用 方法:从前向后每次将数插入到bit(树状数组)中, ...
- P1966 火柴排队(逆序对)
P1966 火柴排队 题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: ∑(ai-bi) ...
- P1966 火柴排队——逆序对(归并,树状数组)
P1966 火柴排队 很好的逆序对板子题: 求的是(x1-x2)*(x1-x2)的最小值: x1*x1+x2*x2-2*x1*x2 让x1*x2最大即可: 可以证明将b,c数组排序后,一一对应的状态是 ...
- [洛谷P1966] 火柴排队
题目链接: 火柴排队 题目分析: 感觉比较顺理成章地就能推出来?似乎是个一眼题 交换的话多半会往逆序对上面想,然后题目给那个式子就是拿来吓人的根本没有卵用 唯一的用处大概是告诉你考虑贪心一波,很显然有 ...
- Luogu P1966 火柴排队
这还是一道比较简单的题目,稍微想一下就可以解决.终于有NOIP难度的题目了 首先我们看那个∑(ai-bi)^2的式子,发现这个的最小值就是排序不等式 所以我们只需要改变第一组火柴的顺序,使它和第二组火 ...
- 洛谷 P1966 火柴排队
题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为:∑(ai−bi)2 其中ai 表示 ...
随机推荐
- Oracle的数据类型详述
数据类型 (1)字符型 CHAR: 定长最多(2000字节)特定情况下用 VARCHAR2:可变长度的字符串最多(4000字节) LONG:大文本类型最多(2个G) (2)数值型 NUMBER:可以是 ...
- Python模拟wc命令(软件测试第二次作业)
Python实现字符,单词,行,代码行,空行及可视化 Gitee项目地址:https://gitee.com/biubiubiuLYQ/word_and_character_statistics 一. ...
- Java线程的5种状态及切换(透彻讲解)-京东面试
一.Thread的几个重要方法: 我们先了解一下Thread的几个重要方法. a.start()方法,开始执行该线程:b.stop()方法,强制结束该线程执行:c.join方法,等待该线程结束.d.s ...
- docker 列出每个容器的IP
抄来的...找不到出处了. 常用方法有两种 docker inspect 容器ID | grep IPAddress 方法二 查看docker name: sudo docker inspect ...
- Promise是什么?
一. Promise是什么? Promise是一种异步操作的解决方案,将写法复杂的传统的回调函数和监听事件的异步操作,用同步代码的形式表达出来. 避免了多级异步操作的回调函数嵌套. Promise最早 ...
- 四、docker compose
docker compose可以方便我们快捷高效地管理容器的启动.停止以及重启等操作,和批量管理容器,它类似于linux下的shell脚本,基于yaml语法,在该文件里我们可以描述应用的架构,比如用什 ...
- java JSP自定义标签
来至: http://blog.csdn.net/jiangwei0910410003/article/details/23915373 http://blog.csdn.net/jiangwei09 ...
- windows下ping端口
上图的操作完成以后 进入dos控制台 输入telnet ip地址 端口号 回车 标识已ping通 ping不通是这种提示
- Xtoken
“我希望有一种模式,利用群体的智慧让最好的想法总能够脱颖而出”. 博弈模型 背景 本文为NEO社区理事会秘书长陶荣祺在全球创业周区块链创新与发展论坛上的主题演讲<Xtoken代观社区驱动群体智慧 ...
- JAVA js WEB 疑难点总结
1.获取combox的Value 和 Text $('#id').combobox('getValue').$('#id').combobox('getText'): 2.ajax 直接访问ht ...