堆【洛谷P1801 && 洛谷P1631 && 洛谷P2085】
阿新 • • 發佈:2019-01-03
扔下程式碼就逃~
第一題:
#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; }