1. 程式人生 > >堆【洛谷P1801 && 洛谷P1631 && 洛谷P2085】

堆【洛谷P1801 && 洛谷P1631 && 洛谷P2085】

扔下程式碼就逃~

第一題:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5+7;
int a[maxn];
int main()
{
	priority_queue<int> qmax;
	priority_queue<int,vector<int>,greater<int> > qmin;
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	int r = 1;
	int q;
	for(int i=1;i<=m;i++)
	{
		cin>>q;
		for(int j=r;j<=q;j++)
		{
			qmax.push(a[j]);
			if(qmax.size()==i)
			{
				qmin.push(qmax.top());
				qmax.pop();
			}
		}
		r = q+1;
		cout<<qmin.top()<<endl;
		qmax.push(qmin.top());
		qmin.pop();
	}
	return 0;
}

第二題:

#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> P;
const int maxn = 1e5+7;
int a[maxn],b[maxn];
int nxt[maxn];
int main()
{
	int n;
	cin>>n;
	priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > q;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	for(int i=1;i<=n;i++)
	{
		cin>>b[i];
		nxt[i] = 1;
		q.push(P(a[1]+b[i],i));
	}
	int p = 0;
	for(int i=0;i<n;i++)
	{
		cout<<q.top().first<<" ";
		p = q.top().second;
		q.pop();
		q.push(P(a[++nxt[p]]+b[p],p));
	}
	return 0;
}

第三題:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> P;
const int maxn = 1e5+7;
int a[maxn],b[maxn],c[maxn],x[maxn];
ll f(int i)
{
	return a[i]*x[i]*x[i]+b[i]*x[i]+c[i];
}
int main()
{
	int n,m;
	cin>>n>>m;
	priority_queue<P,vector<P>,greater<P> > q;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i]>>b[i]>>c[i];
		x[i] = 1;
		q.push(P(f(i),i));
	}
	int tmp = 0;
	for(int i=0;i<m;i++)
	{
		cout<<q.top().first<<" ";
		tmp = q.top().second;
		q.pop();
		x[tmp]++;
		q.push(P(f(tmp),tmp));
	}
	return 0;
}