1. 程式人生 > 其它 >20211004巴蜀中學多校聯訓

20211004巴蜀中學多校聯訓

這場打自閉了,開個坑寫個題解。

A openhook

最終的答案序列 \(\{a'_i\}\) 是可以確定的,先把他弄出來,那麼這題就是讓你把 \(\{a_i\}\)\(\{a_i'\}\) 兩兩配對,使得 \(a_i'\ge a_i\) 並且代價最小。考慮兩對 \((a_i,a_i'),(a_j,a_j')\)\(a_j'-a_j\ge a_i'-a_i\),那麼一定是讓儘量小的 \(b_i\) 去選 \(a_j'-a_j\),換句話說就是要讓儘量小的 \(b_i\) 分配到儘量大的活,把 \(a_i'\) 求出來放到 set 之後 \(a_i\) 一個一個在 set 中 lower_bound

匹配即可。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<vector>
#include<ctime>
#include<bitset>
#include<cstdlib>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
typedef pair<int,int> pii;
typedef long long ll;
typedef unsigned long long ull;
inline int read()
{
	int x=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
	return x*f;
}
const int N=1e7+10; 
int a[N],b[N],c[N],cost[N],p=0;
set<int> s;
int main()
{
	int n=read();
	for(int i=1;i<=n;i++)a[i]=read();
	sort(a+1,a+n+1);
	for(int i=1;i<=n;i++)c[i]=read();//cost
	sort(c+1,c+n+1);
	for(int i=1,mx=0;i<=n;i++,mx++)
	{
		if(mx<a[i])mx=a[i];
		b[i]=mx;
		s.insert(b[i]);
	}
	for(int i=n;i>=1;i--)
	{
		auto it1=s.lower_bound(a[i]); 
		cost[i]=*it1-a[i];
		s.erase(it1);
	}
	sort(cost+1,cost+1+n);
	ull ans=0;
	for(int i=1;i<=n;i++)ans+=1ull*cost[i]*c[n-i+1];
	printf("%llu",ans);	 
	return 0; 
}

B clods

大詐騙題!!!!