2 条题解
-
0
#include <bits/stdc++.h> #define ll long long using namespace std; const int N = 1e5 + 10; struct node1 { ll t, res; int id; } ask[N]; inline bool cmp1(node1 x, node1 y) { return x.t < y.t; } inline bool cmp2(node1 x, node1 y) { return x.id < y.id; } struct node2 { ll t; int x; inline bool operator <(const node2& b)const { return t > b.t; } }; priority_queue<node2> q; int fa[N]; int findfa(int x) { return fa[x] == x ? x : fa[x] = findfa(fa[x]); } int up[N]; ll cow[N], M[N], pass[N]; int main() { int n, m; scanf("%d%d", &n, &m); for (int i = 1; i <= n; ++i) fa[i] = i; for (int i = 2; i <= n; ++i) { scanf("%d%lld%lld", &up[i], &cow[i], &M[i]), pass[up[i]] -= M[i], pass[i] += M[i]; } for (int i = 1; i <= m; ++i) scanf("%lld", &ask[i].t), ask[i].id = i; sort(ask + 1, ask + 1 + m, cmp1); for (int i = 2; i <= n; ++i) if (pass[i] > 0) q.push({ cow[i] / pass[i], i }); int l = 1, x, tp; while (!q.empty() && l <= m) { for (; l <= m && ask[l].t <= q.top().t; ++l) ask[l].res = cow[1] - pass[1] * ask[l].t; if (fa[q.top().x] != q.top().x) { q.pop(); continue; } x = q.top().x, tp = findfa(up[x]); cow[tp] += cow[x], pass[tp] += pass[x], fa[x] = tp; if (pass[tp] > 0) q.push({ cow[tp] / pass[tp], tp }); q.pop(); } sort(ask + 1, ask + 1 + m, cmp2); for (int i = 1; i <= m; ++i) printf("%lld\n", ask[i].res); return 0; }
-
0
#include<bits/stdc++.h> #define ll long long using namespace std; const int N=1e5+10; struct node1{ll t,res;int id;}ask[N]; inline bool cmp1(node1 x,node1 y){return x.t<y.t;} inline bool cmp2(node1 x,node1 y){return x.id<y.id;} struct node2 { ll t;int x; inline bool operator <(const node2 &b)const {return t>b.t;} }; priority_queue<node2> q; int fa[N]; int findfa(int x){return fa[x]==x?x:fa[x]=findfa(fa[x]);} int up[N];ll cow[N],M[N],pass[N]; int main(){ int n,m;scanf("%d%d",&n,&m); for(int i=1;i<=n;++i) fa[i]=i; for(int i=2;i<=n;++i) { scanf("%d%lld%lld",&up[i],&cow[i],&M[i]), pass[up[i]]-=M[i],pass[i]+=M[i]; } for(int i=1;i<=m;++i) scanf("%lld",&ask[i].t),ask[i].id=i; sort(ask+1,ask+1+m,cmp1); for(int i=2;i<=n;++i) if(pass[i]>0) q.push({cow[i]/pass[i],i}); int l=1,x,tp; while(!q.empty()&&l<=m) { for(;l<=m&&ask[l].t<=q.top().t;++l) ask[l].res=cow[1]-pass[1]*ask[l].t; if(fa[q.top().x]!=q.top().x){ q.pop(); continue; } x=q.top().x , tp=findfa(up[x]); cow[tp]+=cow[x], pass[tp]+=pass[x] , fa[x]=tp; if(pass[tp]>0) q.push({cow[tp]/pass[tp],tp}); q.pop(); } sort(ask+1,ask+1+m,cmp2); for(int i=1;i<=m;++i) printf("%lld\n",ask[i].res); return 0; }
- 1
信息
- ID
- 1568
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者