首页 > 其他分享 >P1552 [APIO2012] 派遣 题解

P1552 [APIO2012] 派遣 题解

时间:2023-06-28 17:12:00浏览次数:69  
标签:rt le val APIO2012 题解 sum times int P1552

一、题目描述:

  给你一个 $n$ 个点的有根树,每个点有两个参数 $w$ 和 $v$ 。再给出一个数 $m$ 。

  对于每一个点 $u$ ,设它的子树内最多可以选择 $k_u$ 个点 $a_1,a_2,...,a_{k_u}$,使得 $\sum _{i=1}^k w_{a_i} \le m$ 。

  那么点 $u$ 的价值为 $v_u \times k_u$,求 $max(\sum_{i=1}^{n} v_i \times k_i)$ 。

  数据范围:$1 \le n \le 1 \times 10^5,1 \le w_i \le m \le 1 \times 10^9,1 \le v_i \le 1 \times 10^9 $ 。


 二、解题思路:

  思路很明显,直接从儿子向父亲合并信息即可。

  然后不停的 $pop$ ,直到 $sum \le m$ 。

  用的是左偏树,时间复杂度 $O(nlog_2^n)$,注意开 $long long$ 。


 三、完整代码:

 1 #include<iostream>
 2 #define N 100010
 3 #define d(p) t[p].d
 4 #define ls(p) t[p].ls
 5 #define rs(p) t[p].rs
 6 #define val(p) t[p].val
 7 using namespace std;
 8 int n,m,fa;
 9 long long ans,sum[N];
10 int a[N],rt[N],size[N];
11 struct EDGE{
12     int v,nxt;
13 }edge[N];
14 int head[N],cnt;
15 void add(int u,int v)
16 {
17     edge[++cnt].v=v;
18     edge[cnt].nxt=head[u];
19     head[u]=cnt;
20 }
21 struct Node{
22     int d,ls,rs,val;
23 }t[N];
24 int merge(int p,int q)
25 {
26     if(!p||!q)    return p|q;
27     if(val(p)<val(q)) swap(p,q);
28     rs(p)=merge(rs(p),q);
29     if(d(ls(p))<d(rs(p))) swap(ls(p),rs(p));
30     d(p)=d(rs(p))+1; return p;
31 }
32 int pop(int u)
33 {
34     size[u]--;sum[u]-=val(rt[u]);
35     return merge(ls(rt[u]),rs(rt[u]));
36 }
37 void dfs(int u)
38 {
39     for(int i=head[u];i!=-1;i=edge[i].nxt)
40     {
41         int to=edge[i].v;dfs(to);
42         rt[u]=merge(rt[u],rt[to]);
43         sum[u]+=sum[to],size[u]+=size[to];
44         while(sum[u]>m) rt[u]=pop(u);
45     }
46     while(sum[u]>m) rt[u]=pop(u);
47     ans=max(ans,1ll*size[u]*a[u]);
48 }
49 int main()
50 {
51     ios::sync_with_stdio(false);
52     cin.tie(0);cout.tie(0);
53     cin>>n>>m;t[0].d=-1;
54     for(int i=1;i<=n;i++)
55         head[i]=-1;
56     for(int i=1;i<=n;i++)
57     {
58         cin>>fa>>val(i)>>a[i];rt[i]=i;
59         add(fa,i),sum[i]=val(i),size[i]=1;
60     }
61     dfs(1);cout<<ans<<'\n';
62     return 0;
63 }

四、写题心得:

  算是左偏树模板,没什么思维难度,收获经验如下:

  $1、merge\ 函数是重点,但并不难写。=> Exp++!$

  $2、pop\ 的时候记得是访问\ rt_u\ ,在这里卡了好久。=> Exp++! $

标签:rt,le,val,APIO2012,题解,sum,times,int,P1552
From: https://www.cnblogs.com/yhy-trh/p/P1552.html

相关文章

  • 前端打包部署后接口BASE_URL不对问题解决办法
    在前端打包部署时,为了免去不同环境打包的麻烦,项目用的流水线触发方式。在这里不细说,重点说说下面情况。当项目提交打包部署后,访问压测环境或者生产环境的地址来使用项目时,发现接口报错404。 在NETWORK里发现接口的BASEURL和当前环境需要调用的后端baseurl不同。主要问题在于......
  • 解密2.0题解
    解密题目首先查看题目的\(\LaTeX\)源代码,发现在答案后面有一个。可以点击。点击这个句号,来到线索\(1\)。线索\(1\):在源代码里发现有base64这个字眼,于是就把后面一长串的字符aW46MiAzCm91dDpKYXNvbmN3eCBjYW4ndCBBSyBDU1BK扔到base64解密。解密得出:in:23out:Jasoncwx......
  • CF1834 题解
    CF1834题解A考虑答案与元素位置无关,只与\(1\)和\(-1\)的个数有关。要求\(1\)必须多于或等于\(-1\),并且\(-1\)个数为偶数。分讨:序列中\(num(1)\geqnum(-1)\),只需要看\(num(-1)\)正负性,奇数1步,偶数0步序列中\(num(1)<num(-1)\),先通过\(-1\)变\(1\)将数目补到第一种情况,再做......
  • mac打开ddms卡住的问题解决
    https://blog.csdn.net/qq_35244415/article/details/110656444?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-1-110656444-blog-88994745.235^v38^pc_relevant_default_base&depth_1-utm_source=distribute.......
  • P4630 [APIO2018] 铁人两项 题解
    一、题目描述:给你一个$n$个点,$m$条边的无向图。图不一定联通求出点对$(u,c,v)$的数量,使得点$u$存在一条经过点$c$到达点$v$的无向图。数据范围:$1\len\le1\times10^5,1\lem\le2\times10^5$ 二、解题思路:算是圆方树比较模板的题了......
  • B0626 模拟赛题解
    原题链接前言重庆一位金牌大佬出的。感受:除了最后一题,感觉难度不如C组,甚至没之前D组题难?T1浪费2.5h,最后还是打表秒了。T2想出正解,但发现是数据结构题,最后40min怒打100行,差点打出正解。T3花20min打出20分部分分,赛后发现XD秒了(tql)。T4看题浪费5min......
  • vue3引入bootstrap5的折叠菜单无效问题解决
    问题:通过npm后者yarn安装bootstrap5后,在入口文件全局引入bootstrap5的js、scc,在vue组件引入折叠功能,点击可以正常展开,在点击无法收回解决办法:可参考网上博主的建议,大概意思就是之前引入的js文件不对,导致收回方法没有执行import'bootstrap/dist/js/bootstrap.bundle'main入口......
  • CodeForces 605E Intergalaxy Trips 题解
    题意有一张\(n\)个点的有向完全图,边\(i\toj\)有\(p_{i,j}\)的概率出现(\(p_{i,i}=1\))。你要从\(1\)开始,每天可以走一条出边或留在原地,求最优策略下走到\(n\)的期望天数。输出小数(不取模)。\(n\le10^3\)思路设\(f(i)\)表示从\(i\)走到\(n\)的期望天数,那么......
  • P3387 【模板】缩点 题解
    一、题目描述:给你一个$n$个点,$m$条边的有向图。点带权。求一条路径经过的所有点的权值和最大是多少。点可以重复经过。数据范围:$1\len\le1\times10^4,1\lem\le1\times10^5$。 二、解题思路:缩点板子题,不需要思路。时间复杂度$O(n+m)$。......
  • 复旦大学2022--2023学年第二学期(22级)高等代数II期末考试第八大题解答
    八、(10分) 设$n$阶实方阵$A$满足$A^3=A$,证明: 若对任意的实列向量$x$,均有$x'A'Ax\leqx'x$,则$A$是实对称阵.证法一(几何证法) 将题目转换成几何语言:设$\varphi$是$n$维欧氏空间$V$上的线性算子,满足$\varphi^3=\varphi$,若对$V$中任一向量$v......