Luogu T103180 しろは的军训列队 前缀和

Posted wangsheng5

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Luogu T103180 しろは的军训列队 前缀和相关的知识,希望对你有一定的参考价值。

题目背景

しろは上了大一,第一件事情就是军训。

题目描述

在军训里,最让しろは讨厌的事情就是列队。因为教官总是不停的喊着:“补齐排面,补齐排面!”

有一天,しろは突然在站军姿的时候开始思考这么一个问题:

假设队列中有 nn 名同学,第 ii 个同学有一个初始的位置值 a_iai?.教官一声令下之后,他们就都要向某一个位置补齐(即让他们所有人的位置值都变成同一个值)

但是每个同学由于高矮胖瘦等等原因,移动的时候付出的代价是不一样的。量化来说,第 ii 个同学让自己的位置值变化1需要付出 b_ibi? 点代价。

现在しろは想知道,怎么才能够让大家付出的代价最小呢?

しろは向你保证,这个代价值不会超过 C++ 语言中 long long 的表示范围。

输入格式

第一行一个整数 nn 表示同学个数。

第二行 nn 个整数,为 aa

第三行nn 个整数,为 bb

输出格式

一行一个整数,表示最小的代价。

输入输出样例

输入 #1
5
1 2 3 4 5
1 2 3 4 5
输出 #1
15

说明/提示

对于 10\%10% 的数据,保证所有的 a_iai? 相等。

对于 40\%40% 的数据,保证 n leq 100n100

对于 100\%100% 的数据,保证 nleq 10^6n106,同时保证 1 leq a_i,b_i leq 10^91ai?,bi?109

做法如题。

技术图片
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 using namespace std;
 5 typedef long long ll;
 6 
 7 const int Maxn = 1e6+10;
 8 ll s[Maxn],qian,hou,n,ans = 9223372036854775807;
 9 
10 ll read(){
11     ll a = 0;char l =  ,c = getchar();
12     while(c < 0||c > 9)l = c,c = getchar();
13     while(0 <= c&&c <= 9)a = a*10+c-0,c = getchar();
14     if(l == -)return -a; return a;
15 }
16 
17 struct node{
18     int pl,w;
19     bool operator <(const node& x)const{
20         return pl < x.pl;
21     }
22 }a[Maxn];
23 
24 int main(){
25     n = read();
26     for(int i = 1;i <= n;i++)a[i].pl = read();
27     for(int i = 1;i <= n;i++)a[i].w = read();
28     sort(a+1,a+n+1);
29     for(int i = 1;i <= n;i++)s[i] = s[i-1]+a[i].w;
30     for(int i = n;i >= 1;i--)hou += (s[n]-s[i-1])*(a[i].pl-a[i-1].pl);
31     for(int i = 1;i <= n;i++){
32         qian += s[i-1]*(a[i].pl-a[i-1].pl);
33         hou -= (s[n]-s[i-1])*(a[i].pl-a[i-1].pl);
34         ans = min(ans,qian+hou);
35     }
36     printf("%lld",ans);
37 return 0;
38 }
AC代码

 

以上是关于Luogu T103180 しろは的军训列队 前缀和的主要内容,如果未能解决你的问题,请参考以下文章

しろは的军训列队

Luogu P3960 列队(动态开点线段树)

luoguP3960 [noip2017]列队(树状数组)

[NOIp 2017]列队

P4559 [JSOI2018]列队

[jzoj]5478.NOIP2017提高组正式赛列队