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;
}
 
posted @ 2025-06-26 19:16  devoteeing  阅读(26)  评论(0)    收藏  举报