【洛谷P1966】火柴排队

本文详细解析了火柴排队问题的算法实现,通过数学推导得出最优解的条件,并使用归并排序法求解逆序对,以实现最小化目标函数。代码中包含了完整的C++实现,展示了如何通过归并排序计算逆序对个数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

火柴排队

题目链接

(aibi)^2=∑ai^2-2*∑ai*bi+∑bi^2

显然∑ai^2+∑bi^2是不变的,我们要让

2*∑ai*bi最大,才能使原式最小

然后我们一眼就可以看出来,

当第i大的ai与第i大的bi一一对应时,∑ai*bi最大

反正我不会证

知道了对应关系后,于是就成了求逆序对的个数了

可以用归并排序或树状数组

 1 #include<algorithm>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cstdio>
 5 using namespace std;
 6 #define N 1000010
 7 #define mod 99999997
 8 int n,a[N],ans;
 9 struct HC{
10     int pos,val;
11 } A[N],B[N];
12 inline int read(){
13     int x=0; char c=getchar();
14     while(c<'0'||c>'9') c=getchar();
15     while('0'<=c&&c<='9') { x=(x<<3)+(x<<1)+c-'0'; c=getchar(); }
16     return x;
17 }
18 inline bool cmp(HC a,HC b){
19     return a.val<b.val;
20 }
21 int f[N];
22 void msort(int l,int r){
23     if(l>=r) return;
24     int mid=(l+r)>>1;
25     msort(l,mid); msort(mid+1,r);
26     int i=l,j=mid+1,k=1;
27     while(i<=mid&&j<=r){
28         if(a[i]<=a[j]){
29             f[k]=a[i];
30             i++; k++;
31         }
32         else{
33             f[k]=a[j];
34             ans+=mid-i+1;
35             if(ans>mod) ans-=mod;
36             j++; k++;
37         }
38     }
39     while(i<=mid){ f[k]=a[i]; i++; k++; }
40     while(j<=r) { f[k]=a[j]; j++; k++; }
41     for(int i=1;i<=r-l+1;i++)
42      a[l+i-1]=f[i];
43 }
44 int main()
45 {
46     scanf("%d",&n);
47     for(int i=1;i<=n;i++){
48         A[i].val=read();
49         A[i].pos=i;
50     }
51     for(int i=1;i<=n;i++){
52         B[i].val=read();
53         B[i].pos=i;
54     }
55     sort(A+1,A+1+n,cmp);
56     sort(B+1,B+1+n,cmp);
57     for(int i=1;i<=n;i++)
58      a[B[i].pos]=A[i].pos;
59     msort(1,n);
60     printf("%d\n",ans%mod);
61     return 0;
62 }

 

转载于:https://www.cnblogs.com/yjkhhh/p/9359595.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值