经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
[luogu1552][派遣]
来源:cnblogs  作者:wxyww  时间:2018/11/28 9:54:22  对本文有异议

题目链接

思路

首先肯定要树形dp,一直没想到怎么用左偏树。如果不断弹出又不断地合并复杂度不就太高了。瞄了眼题解才知道可以直接用大根树。然后记录出当前这棵左偏树的大小(树里面所有点的薪水之和)以及点的个数。然后不断的删点。直到薪水满足条件为止。

代码

  1. #include<iostream>
  2. #include<cstdlib>
  3. #include<cmath>
  4. #include<ctime>
  5. #include<vector>
  6. #include<bitset>
  7. using namespace std;
  8. typedef long long ll;
  9. const int N = 100000 + 100;
  10. vector<int> son[N];
  11. ll read() {
  12. ll x=0,f=1;char c=getchar();
  13. while(c<'0'||c>'9') {
  14. if(c=='-') f=-1;
  15. c=getchar();
  16. }
  17. while(c>='0'&&c<='9') {
  18. x=x*10+c-'0';
  19. c=getchar();
  20. }
  21. return x*f;
  22. }
  23. ll m,a[N],w[N],siz[N];
  24. int ch[N][2],fa[N],n,dist[N];
  25. ll ans,num[N];
  26. int merge(int x,int y) {
  27. if(x == 0 || y == 0) return x == 0 ? y : x;
  28. if(a[x] > a[y] || (x > y && a[x] == a[y])) swap(x,y);
  29. ch[y][1] = merge(x,ch[y][1]);
  30. fa[x] = y;
  31. if(dist[ch[y][1]] > dist[ch[y][0]]) swap(ch[y][1],ch[y][0]);
  32. dist[y] = dist[ch[y][1]] + 1;
  33. return y;
  34. }
  35. ll pop(int x) {
  36. int k = merge(ch[x][0],ch[x][1]);
  37. ch[x][1] = ch[x][0] = 0;
  38. siz[k] = siz[x] - a[x];
  39. num[k] = num[x] - 1;
  40. return k;
  41. }
  42. int dfs(int u) {
  43. int nn = son[u].size();
  44. int now = u;
  45. siz[now] = a[now];
  46. num[now] = 1;
  47. for(int i = 0;i < nn;++i) {
  48. int v = son[u][i];
  49. int k = dfs(v);
  50. int ls = merge(k,now);
  51. siz[ls] = siz[k] + siz[now];
  52. num[ls] = num[k] + num[now];
  53. now = ls;
  54. }
  55. while(siz[now] > m) now = pop(now);
  56. ans = max(ans,w[u] * num[now]);
  57. return now;
  58. }
  59. int main() {
  60. n = read(), m = read();
  61. dist[0] = -1;
  62. int rt = 0;
  63. for(int i = 1;i <= n;++i) {
  64. int fat = read();
  65. a[i] = read(),w[i] = read();
  66. son[fat].push_back(i);
  67. if(fat == 0) rt = i;
  68. }
  69. dfs(rt);
  70. cout<<ans;
  71. return 0;
  72. }

一言

我们是如此的担心着未来会发生的事情,因此忘记了慢下来享受现在。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号