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 表示 ...
随机推荐
- MyBatis基础:MyBatis数据基本操作(2)
1. MyBatis映射器 2. MyBatis数据基本操作 示例项目结构: <project xmlns="http://maven.apache.org/POM/4.0.0&quo ...
- 【转】console.log 用法
标签: 转自http://www.cnblogs.com/ctriphire/p/4116207.html 大家都有用过各种类型的浏览器,每种浏览器都有自己的特色,本人拙见,在我用过的浏览器当中,我是 ...
- 1064 - You have an error in your SQL syntax;
mysql 1064 错误: SQL语法错误,check the manual that corresponds to your MySQL server version for the right ...
- sql行转列实例
select gh ,xm , max(A.bz) as bz , max(A.jcz) as jcz , max(A.dl) as dl , max(A.czzx) as czzx , max(A. ...
- mesh函数
[t,W]=meshgrid([2:0.2:7],[0:pi/6:3*pi]); %设置时-频相平面网格点 Gs1=(1/(sqrt(2*pi)*a))*exp(-0.5*abs((t1-t)/a). ...
- css 媒体查询 注意点
1, 媒体查询表达式之间还可以用逗号,@media (max-width:800px), print 它表示或的意思 @media (max-width: 800px) OR print; 2, n ...
- fiddler软件测试——Fiddler抓取https设置详解(图文)
强烈推荐(原创亲测)!!!Fiddler抓取https设置详解(图文)转 本文主要说明了自己在设置fiddler抓取https过程中所遇到的问题及解决步骤,特别是fiddler在设置证书的环节遇到的各 ...
- windoows ftp的自动上传bat
@echo off set P=%cd% #获取脚本当前文件路径 del /f /s /q %P%\tmp.txt set Y=%DATE:~0,4% #获取年 set M=%DATE:~5,2% # ...
- BZOJ2521[Shoi2010]最小生成树——最小割
题目描述 Secsa最近对最小生成树问题特别感兴趣.他已经知道如果要去求出一个n个点.m条边的无向图的最小生成树有一个Krustal算法和另一个Prim的算法.另外,他还知道,某一个图可能有多种不同的 ...
- Codeforces Round #441 Div. 1
A:显然答案与原数的差不会很大. #include<iostream> #include<cstdio> #include<cmath> #include<c ...