题目链接
正常难度
A
#include<bits/stdc++.h>
using namespace std;
#define ing long long
void solve()
{
int n;cin>>n;
vector<int>a(n+1);
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++){
cout<<abs(n+1-a[i])<<' ';
}
cout<<'\n';
}
signed main()
{
ios::sync_with_stdio(),cin.tie(0),cout.tie(0);
int t;cin>>t;
while(t--){
solve();
}
return 0;
}
B
#include<bits/stdc++.h>
using namespace std;
#define int long long
void solve()
{
int n;cin>>n;
vector<int>a(n+1),b(n+1);
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)cin>>b[i];
vector<int>mp(2*n+1,0);
for(int i=1;i<=n;i++){
int ans=1;
while(a[i]==a[i+1]&&i<n)ans++,i++;
mp[a[i]]=max(mp[a[i]],ans);
}
vector<int>m(2*n+1,0);
for(int i=1;i<=n;i++){
int ans=1;
while(b[i]==b[i+1]&&i<n)ans++,i++;
m[b[i]]=max(m[b[i]],ans);
}
int out=-1;
for(int i=1;i<=2*n;i++){
out=max(out,mp[i]+m[i]);
}
cout<<out<<'\n';
}
signed main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t;cin>>t;
while(t--){
solve();
}
return 0;
}
C
题目大意
给定
n
n
n个节点的树,有
n
−
1
n-1
n−1对描述,每对描述为两个链接的节点,一个节点被加入树当且仅当与他链接的节点已经在树上时。
有
m
m
m轮访问,每轮访问所有描述,请你确认形成完整树的最小
m
m
m
思路
搜索
正向模拟建树会
T
T
T掉,反向检查
广搜,用队列存节点信息,遍历,若某点的序号比父节点链接的边的序号小,则证明要多一层循环,插入循环次数加
1
1
1即可
ACcode
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
struct node{int x,y,z;};
void solve()
{
int n;cin>>n;
vector<vector<PII> >a(n+1);
for(int i=1;i<n;i++){
int l,r;cin>>l>>r;
a[l].push_back({r,i});
a[r].push_back({l,i});
}
int ans=1;
queue<node>mq;
vector<int>vis(n+1,0);
mq.push({1,0,1});
while(!mq.empty()){
auto [x,y,z]=mq.front();
mq.pop();
if(vis[x])continue;
vis[x]=1;
ans=max(ans,z);
for(auto [p,q]:a[x]){
if(q<y)mq.push({p,q,z+1});
else mq.push({p,q,z});
}
}
cout<<ans<<'\n';
}
signed main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t;cin>>t;
while(t--){
solve();
}
return 0;
}