首页 > 其他分享 >CF1009F 题解

CF1009F 题解

时间:2023-03-29 16:23:20浏览次数:35  
标签:rt CF1009F rs int 题解 edge ls now

一、题目描述:

  给定一棵以 1 为根,n 个节点的树。设 d(u,x) 为 u 的子树中到 u 距离为 x 的节点数。对于每个点,求一个最小的 k,使得 d(u,k) 最大。


 二、做题思路:

  很明显是一个线段树合并的题,但是线段树里面放什么呢?设当前节点为 u,如果放的是距 u 距离为 x 的点的数量,那么在合并给父亲的时候就会出现 +1 的问题。但是如果存的是深度就没问题了,减去当前节点的深度即为答案。注意要动态开点,否则会炸空间。


三、完整代码:

 1 #include<iostream>
 2 #include<cstring>
 3 #define N 1000010
 4 #define ls(p) t[p].ls
 5 #define rs(p) t[p].rs
 6 using namespace std;
 7 int n,u1,v1,tot;
 8 int du[N],fa[N],ans[N],ro[N];
 9 struct Seg_tree{
10     int ls,rs;
11     int mx,sum;
12 }t[N*25];
13 struct EDGE{
14     int v,nxt;
15 }edge[N*2];
16 int head[N],cnt;
17 void add(int u,int v)
18 {
19     edge[++cnt].v=v;
20     edge[cnt].nxt=head[u];
21     head[u]=cnt;
22 }
23 void dfs1(int now,int d,int ff)
24 {
25     du[now]=d;fa[now]=ff;
26     for(int i=head[now];i!=-1;i=edge[i].nxt)
27         if(!du[edge[i].v])    dfs1(edge[i].v,d+1,now);
28 }
29 void push_up(int rt)
30 {
31     if(t[ls(rt)].sum>=t[rs(rt)].sum)
32         t[rt].sum=t[ls(rt)].sum,t[rt].mx=t[ls(rt)].mx;
33     if(t[ls(rt)].sum<t[rs(rt)].sum)
34         t[rt].sum=t[rs(rt)].sum,t[rt].mx=t[rs(rt)].mx;
35 }
36 void update(int &rt,int l,int r,int x)
37 {
38     if(!rt)    rt=++tot;
39     if(l==r)
40     {
41         t[rt].mx=l;
42         t[rt].sum++;
43         return ;
44     }
45     int mid=(l+r)>>1;
46     if(x<=mid)    update(ls(rt),l,mid,x);
47     if(x>mid)    update(rs(rt),mid+1,r,x);
48     push_up(rt);
49 }
50 int merge(int p,int q,int l,int r)
51 {
52     if(!q)    return p;
53     if(!p)    return q;
54     if(l==r)
55     {
56         t[p].sum+=t[q].sum;
57         return p;
58     }
59     int mid=(l+r)>>1;
60     ls(p)=merge(ls(p),ls(q),l,mid);
61     rs(p)=merge(rs(p),rs(q),mid+1,r);
62     push_up(p);
63     return p;
64 }
65 void dfs2(int now)
66 {
67     for(int i=head[now];i!=-1;i=edge[i].nxt)
68         if(edge[i].v!=fa[now])
69         {
70             dfs2(edge[i].v);
71             ro[now]=merge(ro[now],ro[edge[i].v],1,n);
72         }
73     ans[now]=t[ro[now]].mx-du[now];
74 }
75 int main()
76 {
77     ios::sync_with_stdio(false);
78     cin.tie(0);cout.tie(0);
79     cin>>n;
80     memset(head,-1,sizeof(head));
81     for(int i=1;i<n;i++)
82     {
83         cin>>u1>>v1;
84         add(u1,v1);
85         add(v1,u1);
86     }
87     dfs1(1,1,0);
88     for(int i=1;i<=n;i++)
89         update(ro[i],1,n,du[i]);
90     dfs2(1);
91     for(int i=1;i<=n;i++)
92         cout<<ans[i]<<'\n';
93     return 0;
94 }

四、写题心得:

  拜托,这是紫题诶!!!真的很高兴的好吧!!!加油!

标签:rt,CF1009F,rs,int,题解,edge,ls,now
From: https://www.cnblogs.com/yhy-trh/p/17269378.html

相关文章

  • CentOS7中远程连接数据库连不上的问题解决方法
      当远程连接数据库连接不起来时:可能原因:1.检查网络防火墙或其他安全设置是否阻止了连接  2.mysql服务是否启动,查看systemctlstatusmysql3.是否提前授权:......
  • ABC291题解(D-G)
    ABC291D-FlipCardsSolution:考虑DP,定义状态\(F_{i,0}\)为第\(i\)张卡片正面朝上的方案数,\(F_{i,1}\)为第\(i\)张卡片背面朝上的方案数,每次check是否相同然后转移即可......
  • 使用SQLALCHEMY 出现warning的问题解决
    运行程序时出现错误:UserWarning:NeitherSQLALCHEMY_DATABASE_URInorSQLALCHEMY_BINDSisset.DefaultingSQLALCHEMY_DATABASE_URIto"sqlite:///:memory:".'Neithe......
  • CF429D Tricky Function 题解 分治/平面最近点对
    题目链接:http://codeforces.com/problemset/problem/429/D题目大意:给定一个长度为\(n\)的数列\(a_1,a_2,\ldots,a_n\)。用\(s\)表示\(a\)的前缀和数组,即\(s_......
  • buu [CISCN] BadProgrammer题解
    [CISCN]BadProgrammer页面很长,有很多的按钮,但是点了之后都没反应查看源码、扫描打开到具体目录一个个目录点开看,在static/下找到了一个flag.ejs文件下载,打开......
  • [ARC131D] AtArcher 题解
    题意数轴上有一个箭靶以\(0\)为轴心左右对称,给定每个得分区域的范围和分值,要求射\(N\)支箭在靶上,且任意两支箭的距离不少于\(D\),求最大得分。保证从中心向两侧分数不......
  • android:state_pressed标签失效或android:state_enabled标签失效问题解决
    问题描述:android:state_pressed标签失效或android:state_enabled标签失效,点击不会变色,可用/不可用时不会变色。 <?xmlversion="1.0"encoding="utf-8"?><selector......
  • 省选武汉联测 13 题解
    省选模拟赛俩构造一交互挺nm逆天。赛后题解区就一句Surprise!!!没题解也挺nm逆天。那建议组题人的马先消失一下。这时候就体现学长博客的重要性了。搜关键词搜到三......
  • Conda in Windows under MSYS2 and Zsh 的问题解决
    CondainWindowsunderMSYS2andZsh的问题解决在Window11上使用gitbash安装zsh,并配置p10k主题,主要问题就是prompt中无法显示condaenv;condaactivate/deactivate......
  • 【题解】[SDOI/SXOI2022] 小 N 的独立集(dp of dp)
    题目分析:就借助这个题稍微说一下\(dp\)套\(dp\)。对于\(dp\)套\(dp\)其解决的问题是:若给定某一具体情况则答案十分好求,现要求对于所有的情况的答案进行统计。这......