P1966 火柴排队——逆序对(归并,树状数组)
P1966 火柴排队
很好的逆序对板子题;
求的是(x1-x2)*(x1-x2)的最小值;
x1*x1+x2*x2-2*x1*x2
让x1*x2最大即可;
可以证明将b,c数组排序后,一一对应的状态是最大的;
ac+bd<ad+bc
ac-ad<bc-bd
a*(c-d)<b*(c-d)//c-d<0
a>b(???)
逆序对合并时一定要加等号!!要判断q1是否超出mid!!!(爆零体验);
归并写法
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e5+;
const int mo=;
struct node
{
int x,id;
}b[maxn];
node c[maxn];
int n;
bool cmp(node qw,node we)
{
return qw.x<we.x;
}
int a[maxn];
int tmp[maxn];
int ans;
void work_sort(int l,int r)
{
if(l==r) return ;
int mid=(l+r)>>;
work_sort(l,mid);
work_sort(mid+,r);
int q1=l,q2=mid+;
for(int i=l;i<=r;i++)
{
if((a[q1]<=a[q2]&&q1<=mid)||q2>r)
{
tmp[i]=a[q1++];
}
else
{
ans+=mid-q1+;
ans%=mo;
tmp[i]=a[q2++];
}
}
for(int i=l;i<=r;i++) a[i]=tmp[i];
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++) {scanf("%d",&b[i].x);b[i].id=i;}
for(int i=;i<=n;i++) {scanf("%d",&c[i].x);c[i].id=i;}
sort(b+,b+n+,cmp);
sort(c+,c+n+,cmp);
for(int i=;i<=n;i++)
{
a[b[i].id]=c[i].id;
}
work_sort(,n);
printf("%d\n",ans);
return ;
}
树状数组写法
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e5+;
const int mo=;
struct node
{
int x,id;
}a[maxn];
node c[maxn];
int n;
int d[maxn];
bool cmp(node qw,node we)
{
return qw.x<we.x;
}
int b[maxn];
void add(int x,int y)
{
for(;x<=n;x+=x&(-x)) b[x]=(b[x]+y)%mo;
} int query(int x)
{
int sum=;
for(;x;x-=x&(-x)) sum=(sum+b[x])%mo;
return sum;
}
int ans;
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++) {scanf("%d",&a[i].x);a[i].id=i;}
for(int i=;i<=n;i++) {scanf("%d",&c[i].x);c[i].id=i;}
sort(a+,a+n+,cmp);
sort(c+,c+n+,cmp);
for(int i=;i<=n;i++) d[a[i].id]=c[i].id;
for(int i=;i<=n;i++)
{
add(d[i],);
ans+=i-query(d[i]);
ans%=mo;
}
printf("%d",ans);
return ;
}
P1966 火柴排队——逆序对(归并,树状数组)的更多相关文章
- AcWing 107. 超快速排序(归并排序 + 逆序对 or 树状数组)
在这个问题中,您必须分析特定的排序算法----超快速排序. 该算法通过交换两个相邻的序列元素来处理n个不同整数的序列,直到序列按升序排序. 对于输入序列9 1 0 5 4,超快速排序生成输出0 1 4 ...
- luogu P1966 火柴排队 (逆序对)
luogu P1966 火柴排队 题目链接:https://www.luogu.org/problemnew/show/P1966 显然贪心的想,排名一样的数相减是最优的. 证明也很简单. 此处就不证 ...
- 洛谷P1966 火柴排队(逆序对)
题意 题目链接 Sol 不算很难的一道题 首先要保证权值最小,不难想到一种贪心策略,即把两个序列中rank相同的数放到同一个位置 证明也比较trivial.假设\(A\)中有两个元素\(a, b\), ...
- P1966 火柴排队(逆序对)
P1966 火柴排队 题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: ∑(ai-bi) ...
- P3157 [CQOI2011]动态逆序对(树状数组套线段树)
P3157 [CQOI2011]动态逆序对 树状数组套线段树 静态逆序对咋做?树状数组(别管归并QWQ) 然鹅动态的咋做? 我们考虑每次删除一个元素. 减去的就是与这个元素有关的逆序对数,介个可以预处 ...
- hdu 4911 求逆序对数+树状数组
http://acm.hdu.edu.cn/showproblem.php?pid=4911 给定一个序列,有k次机会交换相邻两个位置的数,问说最后序列的逆序对数最少为多少. 实际上每交换一次能且只能 ...
- 【BZOJ 3295】动态逆序对 - 分块+树状数组
题目描述 给定一个1~n的序列,然后m次删除元素,每次删除之前询问逆序对的个数. 分析:分块+树状数组 (PS:本题的CDQ分治解法见下一篇) 首先将序列分成T块,每一块开一个树状数组,并且先把最初的 ...
- Bzoj 3295: [Cqoi2011]动态逆序对 分块,树状数组,逆序对
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2886 Solved: 924[Submit][Stat ...
- Day2:T4求逆序对(树状数组+归并排序)
T4: 求逆序对 A[I]为前缀和 推导 (A[J]-A[I])/(J-I)>=M A[j]-A[I]>=M(J-I) A[J]-M*J>=A[I]-M*I 设B[]=A[]-M*( ...
随机推荐
- JNI创建共享内存导致JVM terminated的问题解决(segfault,shared memory,内存越界,内存泄漏,共享内存)
此问题研究了将近一个月,最终发现由于JNI不支持C中创建共享内存而导致虚拟机无法识别这块共享内存,造成内存冲突,最终虚拟机崩溃. 注意:JNI的C部分所使用的内存也是由JVM创建并管理的,所以C创建了 ...
- python 内置函数和匿名函数
内置函数 截止到python版本3.6.2,现在python一共为我们提供了68个内置函数. Built-in Functions abs() dict() help() min() ...
- python之统计字符串中字母出现次数
dic=dict() d={} s=set() s='helloworld' (1)d=dict() for x in s: if x not in d.keys(): d[x]=1 else: d[ ...
- iOS - OC 使用运行时来获取并修改类
前言: Objective C的runtime技术功能非常强大,能够在运行时获取并修改类的各种信息,包括获取方法列表.属性列表.变量列表,修改方法.属性,增加方法,属性等等,本文对相 ...
- iOS - Scenekit3D引擎初探之 - 给材质贴图
今天简单说一下 SceneKit 给材质贴图. 1,最简单的一种方法,直接打开dae 或者 scn 文件直接设置 如上图,这个dae 文件中只有一个几何体,几何体中只有一个材质球,然后设置材质球的d ...
- JS做动态表格
在后台将数据发送过来后,你需要将这些数据做成表格,实现一般表格管理功能 例如这种数据格式, 首先要创建table 在table中添加thead 在thead中添加tr 循环数组,且创建开头的inpu ...
- oracle trunc函数用法
转自:https://www.e-learn.cn/content/qita/699481 /**************日期********************/ select trunc(sy ...
- AetherUpload大文件传输
AetherUpload-Laravel是laravel框架下的一个大文件传输组件 github:https://github.com/peinhu/AetherUpload-Laravel 文件传输 ...
- 解决 React-Native: Android project not found. Maybe run react-native android first?
在终端运行命令react-native run-android时报错Android project not found. Maybe run react-native android first? 解 ...
- Oracle加密解密
Oracle内部有专门的加密包,可以很方便的对内部数据进行加密(encrypt)和解密(decrypt). 介绍加密包之前,先简单说一下Oracle基本数据类型——RAW类型. RAW,用于保存位串的 ...