首页 > 其他分享 >高一上九月中旬日记

高一上九月中旬日记

时间:2024-09-12 08:51:49浏览次数:1  
标签:rt weight int luogu 九月 20010 高一上 judge 日记

9.11

闲话

做题纪要

9.12

闲话

做题纪要

luogu P3806 【模板】点分治 1

  • 若边权都为 \(1\) ,求出直径后判断即可。

  • 点分治板子。

    • 随意选择一个点作为根节点 \(rt\) ,则所以完全位于当前其子树内的路径以是否经过 \(rt\) 分为两种。而经过 \(rt\) 的路径 \(u \to v(u,v \ne rt)\) 又可以拆分成 \(u \to rt,rt \to v\) 两条路径。
    • 考虑分治,对于枚举的 \(rt\) ,先计算在其子树内且经过 \(rt\) 的路径对答案产生的贡献,然后递归其子树对不经过该节点的路径进行求解。
    • 点分治过程中,每一层的所有递归过程对每个点处理一次,时间复杂度为 \(O(hn)\) ,其中 \(h\) 为树高/递归层数。
    • 若每次选择子树的中心作为根节点,可以保证递归层数最少,时间复杂度为 \(O(n \log n)\) 。
      • 视询问情况决定是否让时间复杂度多乘上一个 \(O(m)\) 。
    • 在重新选择根节点后一定要重新计算子树的大小。
  • 对于经过根节点 \(rt\) 的路径,先计算出 \(x\) 子树内节点 \(x\) 到根节点的距离 \(dis_{x}\) , \(judge_{d}\) 表示之前处理的子树中是否存在长度为 \(d\) 的路径。若一个询问的 \(k\) 满足 \(judge_{k-dis_{x}}=1\) 则说明存在一条长度为 \(k\) 的路径。处理完一棵子树的询问后及时更新 \(judge\) 。

  • 清空 \(judge\) 数组时必须手动清空,否则使用 memset 清空会导致时间复杂度错误。

    • 具体地,将占用过的 \(judge\) 的位置加入一个队列里,然后进行清空。
  • 时间复杂度为 \(O(nm \log n)\) ,空间复杂度为 \(O(V)\) 。

    • 由于 \(k \le 10^{7}\) , \(judge\) 和队列中只保存 \(\le 10^{7}\) 的数,剩下的数一定不可能对答案产生贡献。
    点击查看代码
    struct node
    {
        int nxt,to,w;
    }e[20010];
    int head[20010],ask[20010],ans[20010],cnt=0;
    void add(int u,int v,int w)
    {
        cnt++;
        e[cnt].nxt=head[u];
        e[cnt].to=v;
        e[cnt].w=w;
        head[u]=cnt;
    }
    struct Divide_On_Tree
    {
        int siz[20010],weight[20010],vis[20010],dis[20010],tmp[20010],judge[10000010],center;
        queue<int>q;
        void init(int n,int m)
        {
            center=0;
            get_center(1,0,n);//求重心
            get_siz(center,0);//更新大小(单独写一个函数来减小常数)
            divide(center,0,m);
        }
        void get_center(int x,int fa,int n)
        {
            siz[x]=1;
            weight[x]=0;
            for(int i=head[x];i!=0;i=e[i].nxt)
            {
                if(e[i].to!=fa&&vis[e[i].to]==0)
                {
                    get_center(e[i].to,x,n);
                    siz[x]+=siz[e[i].to];
                    weight[x]=max(weight[x],siz[e[i].to]);
                }
            }
            weight[x]=max(weight[x],n-siz[x]);
            if(weight[x]<=n/2)
            {
                center=x;
            }
        }
        void get_siz(int x,int fa)
        {
            siz[x]=1;
            for(int i=head[x];i!=0;i=e[i].nxt)
            {
                if(e[i].to!=fa&&vis[e[i].to]==0)
                {
                    get_siz(e[i].to,x);
                    siz[x]+=siz[e[i].to];
                }
            }
        }
        void get_dis(int x,int fa)
        {	
            tmp[0]++;//方便便利整颗子树的所有节点的 dis
            tmp[tmp[0]]=dis[x];
            for(int i=head[x];i!=0;i=e[i].nxt)
            {
                if(e[i].to!=fa&&vis[e[i].to]==0)
                {
                    dis[e[i].to]=dis[x]+e[i].w;
                    get_dis(e[i].to,x);
                }
            }
        }
        void divide(int x,int fa,int m)
        {
            judge[0]=1;
            q.push(0);
            vis[x]=1;
            for(int i=head[x];i!=0;i=e[i].nxt)
            {
                if(e[i].to!=fa&&vis[e[i].to]==0)//因为有了重心的参与单纯判断父亲节点不再可做
                {
                    tmp[0]=0;
                    dis[e[i].to]=e[i].w;
                    get_dis(e[i].to,x);
                    for(int j=1;j<=tmp[0];j++)
                    {
                        for(int k=1;k<=m;k++)
                        {
                            if(ask[k]>=tmp[j])
                            {
                                ans[k]|=judge[ask[k]-tmp[j]];
                            }
                        }
                    }
                    for(int j=1;j<=tmp[0];j++)
                    {
                        if(tmp[j]<=10000000)
                        {
                            q.push(tmp[j]);
                            judge[tmp[j]]=1;
                        }
                    }
                }
            }
            while(q.empty()==0)
            {
                judge[q.front()]=0;
                q.pop();
            }
            for(int i=head[x];i!=0;i=e[i].nxt)
            {
                if(e[i].to!=fa&&vis[e[i].to]==0)
                {
                    center=0;
                    get_center(e[i].to,x,siz[e[i].to]);
                    get_siz(center,0);
                    divide(center,x,m);
                }
            }
        }
    }T;
    int main()
    {
        int n,m,u,v,w,i;
        cin>>n>>m;
        for(i=1;i<=n-1;i++)
        {
            cin>>u>>v>>w;
            add(u,v,w);
            add(v,u,w);
        }
        for(i=1;i<=m;i++)
        {
            cin>>ask[i];
        }
        T.init(n,m);
        for(i=1;i<=m;i++)
        {
            if(ans[i]==1)
            {
                cout<<"AYE"<<endl;
            }
            else
            {
                cout<<"NAY"<<endl;
            }
        }
        return 0;
    }
    

luogu P2634 [国家集训队] 聪聪可可

CF161D Distance in Tree

luogu P4149 [IOI2011] Race

luogu P4178 Tree

luogu P3714 [BJOI2017] 树的难题

luogu P6329 【模板】点分树 | 震波

luogu P4093 [HEOI2016/TJOI2016] 序列

luogu P3345 [ZJOI2015] 幻想乡战略游戏

luogu P3241 [HNOI2015] 开店

标签:rt,weight,int,luogu,九月,20010,高一上,judge,日记
From: https://www.cnblogs.com/The-Shadow-Dragon/p/18409479

相关文章

  • 开学日记2
    今天我写了一个简单的计算器程序,能够执行加法、减法、乘法和除法。程序代码如下:importjava.util.Scanner;publicclassCalculator{publicstaticvoidmain(String[]args){Scannerscanner=newScanner(System.in);System.out.print("Enterfirstnumber:");......
  • 九月做题记录
    都成老年选手了,能记点就记点吧。9.10BZOJ3786星际探索不知道为啥瞥见了这题题解,所以成了个玛丽题,跑出括号序后成区间问题,平衡树维护区间移动,加法。对于移动一段区间,平衡树需要维护节点内正的贡献数量,方便区间加法,然后区间移动的变化量要算清。点击查看代码#include<bits/s......
  • 九月十号人工智能
    一.搜索引擎1.引擎分为两种第一种:目录式分类搜索引擎。过程比较复杂,不容易找到想要的信息。第二种:全文检索搜索引擎(关键词搜索)。准确率比较高,信息易于提取2.搜索指令使用filetype指令可以查询特定格式的文件,比如doc\txt\ppt\pdf,搜索格式为:关健词:空格+filetype-+文件格式使用......
  • 九月九日
    今天在课堂上主要检查了hadoop和数据库的安装,而且我的都安装好了,没有出现问题,应该说都解决了。Hadoop、‌ZooKeeper和HBase的启动与关闭顺序如下:‌‌启动顺序‌:‌‌启动Hadoop‌:‌首先启动Hadoop集群,‌包括HDFS和YARN等组件。‌这通常涉及在master节点上运行start-dfs.sh和star......
  • 秋天希望的田野,九月最后的救园:终身会员计划
    在7月15日发出求救信后快2个月了,很多园友出手相救——买会员、买周边、献捐助、送赞助,让救园走在希望的田野上,非常感谢每一位出手相救的园友!在这救园期间,很多园友提出了很多很好的商业化与发展建议,我们会结合园子的实际情况与发展进展,参考大家的建议。在这救园期间,有投资人过来......
  • 2024年9月26日记录网站安全性配置优化
    1、修改apache配置httpd.conf文件 #关闭trace-methodTraceEnableoff#隐藏Apache版本信息ServerSignatureOffServerTokensProductOnly2、修改网站配置文件,不允许777目录执行任何可执行脚本<VirtualHost*:801>ServerNamewww.website.comServe......
  • 【日记】往哈尔滨西天取经、弱电工程师与软考证书(2113 字)
    正文我感觉去往珍在的哈尔滨,就是我的西天取经之路。这也太多灾多难了一些……临时通知参加信贷考试,第一难;申请缺考不成,第二难;机票无法改签只能退票,第三难;公休尾期撞上省分行培训,第四难;需要自带电脑增加行李,第五难;疑似感冒,第六难;今晚铁路......
  • 学习日记- 2024.9.3
    1.上课情况Analog没怎么听,今天半天没找到AE的教学楼,到教室的时候已经没有座位了。电磁学上得太快了,自己回来学吧。2.复习2.1.Wireless-lec1第一课的学习目标:• Understandthebasicsofa:wirelesslinkandwirelesscell,thespectrumusageandwirelesssignals......
  • 【日记】想见珍一面怎么就这么难(985 字)
    正文想见珍一面怎么就这么难……事故频发。昨天说考试时间跟机票时间冲突了,最后结果出来了,改签了,并且差价不补。我不干,他们也不干。因为上级行给我们行长施压,于是我们行长给我施压。最后要到了国庆之前拔智齿的一天假期。我随即改签机票,改签只能改同一个航空公司,而稍晚一些......
  • 毕设开发日记第一阶段
    第一阶段完成任务其实很简单,但是因为是第一次使用Unity,美术方面也可以说是零基础,我还是花费了好几天的时间在第一阶段的开发上面。首先我确定是做一个2D的人物移动自由世界的游戏,所以我这边采用Unity作为游戏开发引擎,aseprite作为美术开发工具。人物动画我刚开始尝试自己制作,也......