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. 变换树根
- 我们首先知道r1是已知根节点,用vector添加每个节点下的边,注意添加成为双向边(因为之后r2是会改变的,单向边就不能倒着跑了)
- 在新的根节点开始跑的时候顺道标记一下每个节点的父节点,最后直接输出答案即可
#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;
}