代码:
#include<iostream>
#include<queue>
using namespace std;
int n,k,t,cnt,fa[300005];
int find_fa(int i)
{
if(fa[i]==i)return i;
fa[i]=find_fa(fa[i]);
return fa[i];
}
struct farmer
{
int id;
long long times;
}fuben[300005];
priority_queue<farmer,vector<farmer>,greater<farmer> >pq;
bool operator>(farmer f1,farmer f2)
{
if(f1.times!=f2.times)return f1.times>f2.times;
return f1.id>f2.id;
}
int main()
{
// freopen("P10277_10.in","r",stdin);
// freopen("test.out","w",stdout);
scanf("%d%d",&n,&k);
for(int i=1;i<=k;i++)
{
scanf("%d",&t);
pq.push({i,t});
fa[i]=i;
}
for(int i=k+1;i<=n;i++)
{
scanf("%d",&t);
farmer x=pq.top();
pq.pop();
if(pq.top().times!=x.times)pq.push({x.id,x.times+t});
else
{
cnt=1;
fuben[1].id=x.id;
fuben[1].times=x.times;
while(!pq.empty()&&pq.top().times==x.times)
{
x=pq.top();
pq.pop();
cnt++;
fuben[cnt].id=x.id;
fuben[cnt].times=x.times;
}
for(int i=2;i<=cnt;i++)fa[find_fa(fuben[i].id)]=find_fa(fuben[1].id);
pq.push({fuben[1].id,fuben[1].times+t});
for(int i=2;i<=cnt;i++)pq.push(fuben[i]);
}
}
farmer x=pq.top();
printf("%lld\n",x.times);
cnt=1;
fuben[1].id=x.id;
fuben[1].times=x.times;
while(!pq.empty()&&pq.top().times==x.times)
{
x=pq.top();
pq.pop();
cnt++;
fuben[cnt].id=x.id;
fuben[cnt].times=x.times;
}
for(int i=2;i<=cnt;i++)fa[find_fa(fuben[i].id)]=find_fa(fuben[1].id);
for(int i=1;i<=k;i++)
{
if(find_fa(i)==find_fa(x.id))printf("1");
else printf("0");
}
return 0;
}
/*
6 3
3 1 4159 2 6 5
8 4
1 1 2 3 2 1 100 100
*/
我认为时间复杂度是 O(nlog2k) 的,然而 n=300000 k=50000 的数据跑十几秒都没跑出来,求助。