求调
查看原帖
求调
750746
Lmh1128楼主2024/5/26 13:08
#include <iostream>
#include <algorithm>
using namespace std;
int n,k,head[100005],vis[100005],t,len,mt;
long long ans;
struct node
{
	int t,d,nex;
	int f=0;
}edge[100005],a[100005],dui[200005];
void add(node xxx)
{
	edge[++len].d=xxx.d;
	edge[len].nex=head[xxx.t];
	edge[len].t=xxx.t;
	head[xxx.t]=len;
	mt=max(xxx.t,mt);
}
void du(int cur,int val){
	if(cur>n)return;
	//cout<<dui[1].f<<endl;
	du(cur*2,val);
	if(dui[cur].d+dui[cur].f*val<dui[cur*2].d+dui[cur*2].f*val)
	{
		swap(dui[cur],dui[cur*2]);
	}
	du(cur*2+1,val);
	//cout<<dui[1].f<<endl;
	if(dui[cur].d+dui[cur].f*val<dui[cur*2+1].d+dui[cur*2+1].f*val)
	{
		swap(dui[cur],dui[cur*2+1]);
	}
}
bool cmp(node a,node b)
{
	return a.d<b.d;
}
int main()
{
	cin>>n>>k;
	for(int i=1;i<=n;i++)cin>>a[i].t>>a[i].d;
	sort(a+1,a+n+1,cmp);
	for(int i=1;i<=n;i++)add(a[i]);
	for(int i=1;i<=mt;i++){dui[i]=edge[head[i]];dui[i].f=1;}
	du(1,0);
	for(int i=1;i<=k;i++)
	{
		if(dui[1].f!=0){t++;}
		ans+=dui[1].d+dui[1].f*(t+t+1);
		dui[1].f=0;
		cout<<edge[head[dui[i].t]].t<<" "<<edge[head[dui[i].t]].d<<endl;
		head[dui[i].t]=edge[head[dui[i].t]].nex;
		dui[1].d=edge[head[dui[i].t]].d;
		//cout<<dui[1].f<<" "; 
		du(1,t+t+1);
		//cout<<dui[1].f<<endl;
	}
	cout<<ans;
}
/*
7 4
1 1
2 1
3 1
4 6
4 5
4 5
4 5
*/

思路:sort排->链星->堆

2024/5/26 13:08
加载中...