CF Edu 180 2025.6.23 题解A-D
CF Edu 180 2025.6.23 题解
A题
https://codeforces.com/contest/2112/problem/A
易错点:
x和y的大小不明确,如果x>y,记得swap
B题
https://codeforces.com/contest/2112/problem/B
思路:
要找到一对相邻的数大小相差不超过1
有操作:将一对数换成一个大小在[min(a[i], a[i+1])-1, max(a[i], a[i+1])+1]之间的数,由此去创造一对相邻大小相差不超过1的数。
1.无需操作,本身就有
2.操作之后有,判断条件就是 a[i-1]|| a[i+2]在[min(a[i], a[i+1])-1, max(a[i], a[i+1])+1]范围里 ;
只操作一次,在怎么操作也改变不了
比如:3 5 7 9 11 ,就是-1
C题
https://codeforces.com/contest/2112/problem/C
评价:
一个很经典的二分。
思路:
1.BOB选的最大值 a[i]+a[j]+t>a[n]
2.BOB选的是A选的3个里面的最大值 a[i]+a[j]>t;(补充:理解一下就是A选得3条边可作为三角形)
求满足条件的t,用lower_bound()实现二分查找即可。
const int xmmm=5e4+100, xxx=1e8;
int a[xmmm];
signed main()
{
int T;T=1;
cin>>T;
while(T--){
int n;cin>>n;
F(i,1,n)cin>>a[i];
sort(a+1, a+1+n);
int ans=0;
int cnt=0;
for(int i=1;i<n;i++){
cnt=0;
for(int j=i+1;j<n;j++){
auto cnt=lower_bound(a+1, a+1+n, a[n]-a[i]-a[j]+1);//注意边界问题
auto t=lower_bound(a+1, a+1+n, a[i]+a[j]);
t--;
int l=t-a, r=cnt-a;
if(*t<=a[i]+a[j]&&t!=a+j&&l>=r){
ans+=max((int)0, t-a-max(j+1, cnt-a)+1);
}
}
}
cout<<ans<<'\n';
}
return 0;
}
D题
https://codeforces.com/contest/2112/problem/D
思路:
https://blog.csdn.net/AKDreamer_HeXY/article/details/148892212
(主播第一次写wa了, 参考了一下这位博主,然后在加了一点自己的理解)
给出n个点,至少可以找到n-1对(u,v)
每条边就是一对
简单画一下:1--> 2 <-- 3 --> 4 找到n-1对有效(u,v)
如上发现每个点只有一种状态,要么箭头都指向它要么都不指向它
那么如何在此基础上再创造一个有效对呢,结论就是存在一个度为2的点,就能创造
就是这个小模型 1--> 2 --> 3 这样就是3对了
所以,理解就是 1--> 2<-- 5 <--3 --> 4 在2和3之间再加一个即可,看作一个小整体。
#include <bits/stdc++.h>
#define int long long
using namespace std;
#define yes cout<<"YES"<<'\n'
#define no cout<<"NO"<<'\n'
#define ooo cout<<"ENTER"<<'\n';
#define pii pair<int, int>
#define pb push_back
#define fi first
#define se second
#define F(i, a, b) for(int i=a;i<=b;i++)
const int xmmm=2e5+100, xxx=1e8;
vector<pii>ans;
int w=0;
int fa[xmmm];
vector<int>s[xmmm];
void mm(int l, int r, int p){
if(p==1){
ans.pb({r, l});
}
else ans.pb({l, r});
}
void dfs(int x, int y){
int len=s[x].size();
for(int i=0;i<len;i++){
int t=s[x][i];
if(fa[x]==t)continue;
fa[t]=x;
if(x==w)mm(x, t, y^1);
else mm(x, t, y);
dfs(t, y^1);
}
}
signed main()
{
int T;T=1;
cin>>T;
while(T--){
w=-1;
int n;cin>>n;
ans.clear();
F(i, 1, n)s[i].clear();
F(i,1, n-1){
int u, v;cin>>u>>v;
s[u].pb(v);s[v].pb(u);
}
if(n==2){no;continue;}
F(i, 1, n){
if(s[i].size()==2){
w=i;break;
}
}
if(w==-1)no; continue;
fa[s[w][0]]=w;fa[s[w][1]]=w;
ans.pb({w, s[w][0]});
ans.pb({s[w][1], w});
dfs(s[w][0], 1);
dfs(s[w][1], 0);
yes;
for(auto p:ans){
cout<<p.fi<<' '<<p.se<<'\n';
}
}
return 0;
}