20211004巴蜀中學多校聯訓
阿新 • • 發佈:2021-10-05
這場打自閉了,開個坑寫個題解。
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
大詐騙題!!!!