首页 > 其他分享 >开学二周(日常补题训练)

开学二周(日常补题训练)

时间:2024-03-12 17:56:42浏览次数:27  
标签:开学 int 二周 fa 补题 ans include root 节点

pta天梯专栏

7-11 龙龙送外卖 - SMU 2024 spring 天梯赛1(补题) (pintia.cn)

题解:首先我们先建个图然后存一下各个节点的父亲节点

我们细看这个最短路可以发现,当全部节点加进来,那么最短路就是每一个节点跑两遍然后最深的那个节点最后才跑,这样就只需要1遍

所以我们首先把每一个节点的深度算出来,然后分别记录

然后我们一个个把需要用到的点加进来,从这个节点向上跑到根节点或者跑到之前跑过的点记录答案即可,

如果这点跑过,直接输出答案即可ans-ma+1

ma是最大的深度

#include <bits/stdc++.h>
//#pragma GCC optimize("Ofast")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
//#define double long double
#define int long long
#define endl '\n'
using namespace std;
const int N=1e5+9,M=1e1;
const int INF = 0x3f3f3f3f;
const int mod=1e9+7;
typedef pair<int,int> PII;
int kmp(int a,int k,int p)
{
    int ans=1;
    while (k)
    {
        if(k&1) ans=ans*a%p;
        k>>=1;
        a=a*a;
    }
    return ans;
}

vector<int> a[N];
int fa[N];
int dep[N];
bool st[N];
int ans;
int root=0;
void dfs1(int u,int de)
{
    dep[u]=de;
    for(auto i:a[u])
    {
        dfs1(i,de+1);
    }
}
void dfs2(int u)
{
    if(st[u] || u==root) return;
    st[u]= true;
    ans+=2;
    dfs2(fa[u]);
}
void solve()
{
    int n,m;
    cin>>n>>m;

    for(int i=1;i<=n;i++)
    {
        int x;
        cin>>x;
        if(x==-1)
        {
            root=i;
            fa[i]=i;
        }
        else
        {
            a[x].push_back(i);
            fa[i]=x;
        }
    }
    dfs1(root,1);
    int ma=-1;
    while (m--)
    {
        int x;
        cin>>x;
        if(st[x]) cout<<ans-ma+1<<endl;
        else
        {
            ma=max(ma,dep[x]);
            dfs2(x);
            cout<<ans-ma+1<<endl;
        }
    }
}
signed main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    int T=1;
//    cin>>T;
    while(T--){
        solve();
    }
    return 0;
}

 

标签:开学,int,二周,fa,补题,ans,include,root,节点
From: https://www.cnblogs.com/whatdo/p/18068881

相关文章

  • 单独补题-数正方形
    数正方形题意:做法:发现边长为1的正方形,中间不能放正方形。边长为2的正方形中间可以放1个正方形...以此类推。又容易计算出边长为x的正方形在n*n的矩阵中有几个。constintmod=1e9+7;voidsolve(){//JP8692[蓝桥杯2019国C]数正方形--思维..intn,ans=0;......
  • 开学第一周周报
    这个星期是开学的第一周,进行了天梯赛的选拔,两场比赛打的都不好。赛后反思了一下,感觉自己有点陷入算法的框架中了。现在无论做什么题第一时间就想往算法方面去思考,dp,树状数组,搜索。但是赛后补题的时候发现其实压根就用不到,大多数都是贪心,但不知道怎么的比赛过程中就没有想到去贪心......
  • 天梯选拔赛2补题_2024_03_09
    补题1:奶茶袋收集题意:做法:贪心。之前还做过类似的题,赛时一直想不出来。选择k个连续的的区间,就是需要添加k-1个挡板。问题是挡板设置在哪里?可以发现一个连续线段的max-min等于线段中各个差值之和。如果k=1,那么ans=∑(ai+1-ai);如果k=2,那么需要添加一个挡板。贪心地放,挡板应该放......
  • 牛客小白月赛88补题D
    D-我不是大富翁题意:做法:一开始是往贪心方面想,但是很明显,贪不了。又因为走的步先后顺序没影响,可以用dp来写。暴力也差不多。值得注意的点是动力序列可以一边读入一边处理,省了点空间。如果dp[5005][5005]这样开的话会MLE,实际上在dp的过程中,用到的只是i和i-1两行,其余都是多余的。......
  • 软件工程第二周开篇博客
    我是来自石家庄铁道大学软件工程专业的一名普通学生,本篇博客也是作为系主任布置的任务,旨在要我们养成记录自己进步的一个习惯,也可以让我们在日后的场景中被面试官等人更好的了解能力等。目前在软件学习上的一个基本现状就是,对jsp设计javaweb项目有一点的了解和操作,但是并出熟练,想......
  • 软件工程第二周开课博客
    1、介绍自己我叫张博林,是石家庄铁道大学软件工程系2022系的学生。我喜欢打篮球,并且是信息院院队的一员。而且我个人对数学、英语方面比较感兴趣。得益于长期的身体锻炼,我的身体素质还是比较不错。从小学开始,我就比较重视身体锻炼,在初中,我加入了学校田径队,由于身体原因,训练了一年......
  • 第二周周测
    1、尝试挖掘testfire.net网站的漏洞,编写渗透测试报告testfire.net渗透测试报告2、任选靶场解释并演示sql注入漏洞,为靶场编写防御程序解释作用首先利用语句“1’and’1’=’1”和“1’and’1’=’2”来判断是否有注入点。以下为两种语句的不同回显,可以判断出是有注入点的。......
  • 模拟赛c题补题
    暴力的写法会导致题目超时所以采用前缀和但是前缀和如果只靠一个数组表示会很绕https://vjudge.net/contest/614523#problem/C暴力代码(过不了)点击查看代码#include<bits/stdc++.h>usingnamespacestd;constintp=2e5+10;ints1[p],s2[p],qq[p];intmain(){ intn,......
  • 软件工程第二周开课博客
    自我介绍:我是徐健一个刚刚接触web应用程序和安卓app的小白(也没有那么白)。现状、经验和计划:现状:基本掌握了前端vue的使用和后端springboot框架,喜欢用mybaits-plus直接生成一部分后端代码。数据库小白只会写一些基础的增删改查方法,连表查询可望而不可及。安卓的学习处在门槛外,还......
  • 软件工程第二周开课博客
    1.自我介绍我是石家庄铁道大学软件工程系的学生,在系主任建民老师的guli下立志成为一名软件设计师,爱好是羽毛球(在正式报羽毛球这门课前),上大学前对计算机的认知几乎为0。平时在宿舍偶尔打一些游戏,课余时间也会去跑步、打球。很认同建民老师所说的”三板斧“,因此希望之后的几年能紧......