BZOJ3728: PA2014Final Zarowki

来源:互联网 发布:网上教育软件 编辑:程序博客网 时间:2024/05/22 04:56

贪贪贪

将一开始的灯泡和房间从小到大排个序
房间倒着处理,每个房间找>=他的功率的还未匹配的最小的灯泡,将他们匹配上
找不到匹配的灯泡一定要花费一次替换,打个标记在上面,先不管他
匹配完房间如果已经不够替换就gg
否则将每个房间匹配的灯泡-他的要求塞进一个大根堆
去掉堆顶的剩余替换次数个

code:

#include<set>#include<map>#include<deque>#include<queue>#include<stack>#include<cmath>#include<ctime>#include<bitset>#include<string>#include<vector>#include<cstdio>#include<cstdlib>#include<cstring>#include<climits>#include<complex>#include<iostream>#include<algorithm>#define ll long longusing namespace std;inline void read(int &x){    char c; while(!((c=getchar())>='0'&&c<='9'));    x=c-'0';    while((c=getchar())>='0'&&c<='9') (x*=10)+=c-'0';}const int maxn = 510000;int n,K;int a[maxn],b[maxn];int fa[maxn];int findfa(const int x){return fa[x]==x?x:fa[x]=findfa(fa[x]);}int match[maxn];priority_queue<int>q;int main(){    read(n); read(K);    for(int i=1;i<=n;i++) read(a[i]); sort(a+1,a+n+1);    for(int i=1;i<=n;i++) read(b[i]); sort(b+1,b+n+1);    for(int i=1;i<=n+1;i++) fa[i]=i;    int p=n;    for(int i=n;i>=1;i--)    {        while(p&&a[p-1]>=b[i]) p--;        if(a[p]>=b[i])         {             fa[match[i]=p]=p+1;            p--;            continue;        }        int j=findfa(p+1);        if(j==n+1) K--,match[i]=-1;        else fa[match[i]=j]=j+1;    }    if(K<0) return puts("NIE"),0;    ll re=0; for(int i=1;i<=n;i++) re+=(ll)b[i];    for(int i=1;i<=n;i++) if(match[i]!=-1)        q.push(a[match[i]]-b[i]),re+=(ll)a[match[i]]-b[i];    while(K--&&!q.empty())    {        re-=(ll)q.top(); q.pop();    }    printf("%lld\n",re);    return 0;}
原创粉丝点击