Welcome, Guest! Sign Up RSS

Clever Space

Friday, 11.22.2024
Main » 2013 » September » 25 » [NOIP2012模拟赛No.9]序列二
4:27 PM
[NOIP2012模拟赛No.9]序列二

用堆来解(套个set)

复杂度为O(mnlgn)

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<set>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
#include<iostream>
#include<string>
#define N 100010
#define FOR(i,a,b) for(i=(a);i<=(b);i++)
#define ROF(i,a,b) for(i=(a);i>=(b);i--)
typedef long long LL;
using namespace std;
struct node
{
  int x,y;
  long long d;
  bool operator<(const node A)const
  {
    if (d<A.d) return 1;
    if (d>A.d) return 0;
    if (d==A.d)
    {
      if (x<A.x) return 1;
      return 0;
    }
  }
};
multiset<node> S;
long long a[N],ans[N],anst[N];
int main()
{
  int n,m,i,j;
  scanf("%d %d",&m,&n);
  FOR(i,1,m)
  {
    S.clear();
    FOR(j,1,n) scanf("%lld",&a[j]);
    sort(a+1,a+1+n);
    if (i==1)
    {FOR(j,1,n) ans[j]=a[j];continue;}
    node t;
    t.x=1;t.y=1;t.d=a[1]+ans[1];
    S.insert(t);
    FOR(j,1,n)
    {
      set<node>::iterator it=S.begin();
      node tt=*it;
      anst[j]=tt.d;
      S.erase(tt);
      node tt1=tt,tt2=tt;
      tt1.x++;tt2.y++;
      tt1.d=a[tt1.x]+ans[tt1.y];
      tt2.d=a[tt2.x]+ans[tt2.y];
      S.insert(tt1);
      S.insert(tt2);
    }
    memcpy(ans,anst,sizeof(ans));
  }
  FOR(i,1,n-1) printf("%lld ",ans[i]);
  printf("%lld\n",ans[n]);
}


Views: 463 | Added by: dhy0077 | Rating: 5.0/1
Total comments: 0
Only registered users can add comments.
[ Sign Up | Login ]