Acwing 第 75 场周赛 ABC(dfs)

A-AcWing 4710. 局部和

注意看题,注意下标就行。

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL MAXN=1e18;
const LL N=500200,M=2002;
LL a[N];
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    LL T=1;
    //cin>>T;
    while(T--)
    {
        LL n;
        cin>>n;
        for(int i=1;i<n;i++)
        {
            cin>>a[i];
        }
        int l,r;
        cin>>l>>r;
        int sum=0;
        for(int i=l;i<r;i++)
        {
            sum+=a[i];
        }
        cout<<sum<<endl;
    }
    return 0;
}

B-AcWing 4711. 排队

推荐一个好东西
stable_sort(a+1,a+1+n);

  • 它可以保持下标的相对性(不知道怎么描述,比如这题假如下标1是rat,3也是rat,它在进行比较完成后还是能够按照1 3的顺序,但是sort有的时候不一定,天梯赛出过这样的题目)
    在强制要求下标相对性时这个是很有用的
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL MAXN=1e18;
const LL N=500200,M=2002;
map<string,int> mp;
void init()
{
    mp["rat"]=1;
    mp["woman"]=2;
    mp["child"]=2;
    mp["man"]=3;
    mp["captain"]=4;
}
struct node
{
    int idx;
    string name;
    string flag;
}a[N];
bool cmp(node l,node r)
{
    if(mp[l.flag]!=mp[r.flag]) return mp[l.flag]<mp[r.flag];
    else return l.idx<r.idx;
}
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    init();
    LL T=1;
    //cin>>T;
    while(T--)
    {
        LL n;
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i].name>>a[i].flag;
            a[i].idx=i;
        }
        stable_sort(a+1,a+1+n,cmp);
        for(int i=1;i<=n;i++)
        {
            cout<<a[i].name<<endl;
        }
    }
    return 0;
}

C-AcWing 4712. 变换树根

  1. 我们首先知道r1是已知根节点,用vector添加每个节点下的边,注意添加成为双向边(因为之后r2是会改变的,单向边就不能倒着跑了)
  2. 在新的根节点开始跑的时候顺道标记一下每个节点的父节点,最后直接输出答案即可
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL MAXN=1e18;
const LL N=500200,M=2002;
vector<LL> g[N];
LL a[N],ans[N];
void dfs(LL root,LL fa)
{
    ans[root]=fa;//每次跑到一个地方就标记一下它的父节点是谁
    //if(g[root].size()==1) return ;
    for(LL i=0;i<g[root].size();i++)//每次查看一下这个节点下连着哪些边
    {
        if(g[root][i]==fa) ;//如果发现是它祖先,也就是刚刚跑过了的,直接无视
        else
        {
            dfs(g[root][i],root);//从新的节点再度深入往下寻找
        }
    }
}
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    LL T=1;
    //cin>>T;
    while(T--)
    {
        LL n,r1,r2;
        cin>>n>>r1>>r2;
        for(LL i=1;i<=n;i++)
        {
            if(i==r1) ;//遇到自己的时候跳开
            else
            {
                cin>>a[i];
                g[a[i]].push_back(i);//a[i]这个点和i连接
                g[i].push_back(a[i]);//i这个点和a[i]连接
            }
        }
        dfs(r2,-1);//从新的根节点开始跑
        for(LL i=1;i<=n;i++)
        {
            if(i==r2) ;
            else cout<<ans[i]<<" ";
        }
        cout<<endl;
    }
    return 0;
}
posted @ 2022-10-29 22:01  Vijurria  阅读(26)  评论(0编辑  收藏  举报