SMU winter 2025 Personal Round 2

过题数:3/6
补题数:1

A. Ichihime and Triangle

我们只要输出 b c c 就好了,因为保证可以组成三角形,这三个数是距离最近的。

点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
typedef pair<int, int> PII;
const int N = 2e5 + 7;
const int inf = LLONG_MAX / 10;
const int mod = 998244353;
#define x first
#define y second

void miaojiachun() {
    int a,b,c,d;
    cin>>a>>b>>c>>d;
    cout<<b<<" "<<c<<" "<<c<<endl;

}

signed main() {
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int ING = 1;
    cin >> ING;
    while (ING--) {
        miaojiachun();
    }
    return 0;
}

B. Kana and Dragon Quest game

优先使用第一种攻击,第一种攻击在血量等于20的时候会失效。所以直到血量不降反升之前使用第一攻击,之后再用第二种攻击,看看最后可不可以KO。

点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
typedef pair<int, int> PII;
const int N = 2e5 + 7;
const int inf = LLONG_MAX / 10;
const int mod = 998244353;
// #define x first
// #define y second

void miaojiachun() {
    int x,n,m;
    cin>>x>>n>>m;
    while(x>20 and n>0){
        x/=2;
        x+=10;
        n--;
    }
    x-=m*10;
    if(x>0){
        cout<<"NO"<<endl;
        return;
    }else{
        cout<<"YES"<<endl;
        return;
    }

}

signed main() {
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int ING = 1;
    cin >> ING;
    while (ING--) {
        miaojiachun();
    }
    return 0;
}

C. Linova and Kingdom

我们肯定是先选距离最远的叶子节点作为旅游城市,不过我们可能会经历一种情况,叶子节点选择完毕了,我们只能选择非叶子节点了。这样的话,非叶子节点的所有子节点都会减少经过一个旅游城市,我们首先进行dfs,记录每个节点的子树大小,然后记录这个结点出发到终点 1 的距离。对于非叶子节点,如果这个节点要走的话,我们减去他的子树大小就好了。

点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
typedef pair<int, int> PII;
const int N = 2e5 + 7;
const int inf = LLONG_MAX / 10;
const int mod = 998244353;
// #define x first
// #define y second
int f[N];
int ju[N];
vector<int>g[N];
int ans[N];
void dfs(int x,int fa){
    f[x]=1;
    for(int i=0;i<g[x].size();i++){
        if(g[x][i]==fa) continue;
        ju[g[x][i]]=ju[x]+1;
        dfs(g[x][i],x);
        f[x]+=f[g[x][i]];
    }
}
bool cmp(int x,int y){
    return x>y;
}
void miaojiachun(){
    int n,k;
    cin>>n>>k;
    for(int i=1;i<n;i++){
        int u,v;
        cin>>u>>v;
        g[u].push_back(v);
        g[v].push_back(u);
    }
    dfs(1,-1);
    // for(int i=1;i<=n;i++){
    //     cout<<ju[i]<<" ";
    // }
    // cout<<endl;
    for(int i=1;i<=n;i++){
        ju[i]=ju[i]-f[i];
    }
    sort(ju+1,ju+1+n,cmp);
    // for(int i=1;i<=n;i++){
    //     cout<<ju[i]<<" ";
    // }
    // cout<<endl;
    // for(int i=1;i<=n;i++){
    //     cout<<f[i]<<" ";
    // }
    // cout<<endl;
    int sum=0;
    for(int i=1;i<=k;i++){
        sum+=ju[i];
    }
    sum+=k;
    cout<<sum<<endl;
}

signed main() {
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int ING = 1;
    // cin >> ING;
    while (ING--) {
        miaojiachun();
    }
    return 0;
}

D. Xenia and Colorful Gems

我们考虑一个简单的性质:就是如果选了
A中的一个球 x,那么 B,C 中想让答案小是不是只要试图去接近他就可以了。然后 B,C 同理。
这样我们就对 A,B,C 各自做一遍。然后找到对应另外两个中与他接近的

点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
typedef pair<int, int> PII;
const int N = 1e5 + 7;
const int inf = LLONG_MAX / 10;
const int mod = 998244353;

int Q, na, nb, nc, ans;
vector<int> a, b, c;

inline int Calc(int x, int y, int z) {
    return (x - y) * (x - y) + (z - x) * (z - x) + (y - z) * (y - z);
}

void solve() {
    cin >> na >> nb >> nc;
    a.resize(na + 1);
    b.resize(nb + 1);
    c.resize(nc + 1);
    for (int i = 1; i <= na; i++) cin >> a[i];
    for (int i = 1; i <= nb; i++) cin >> b[i];
    for (int i = 1; i <= nc; i++) cin >> c[i];
    sort(a.begin() + 1, a.end());
    sort(b.begin() + 1, b.end());
    sort(c.begin() + 1, c.end());
    ans = inf;
    for (int i = 1; i <= na; i++) {
        int pb = upper_bound(b.begin() + 1, b.end(), a[i]) - b.begin();
        int pc = upper_bound(c.begin() + 1, c.end(), a[i]) - c.begin();
        int pbb = pb - 1, pcc = pc - 1;
        if (pb <= nb) {
            if (pc <= nc) ans = min(ans, Calc(a[i], b[pb], c[pc]));
            if (pcc >= 1) ans = min(ans, Calc(a[i], b[pb], c[pcc]));
        }
        if (pbb >= 1) {
            if (pc <= nc) ans = min(ans, Calc(a[i], b[pbb], c[pc]));
            if (pcc >= 1) ans = min(ans, Calc(a[i], b[pbb], c[pcc]));
        }
    }
    for (int i = 1; i <= nb; i++) {
        int pa = upper_bound(a.begin() + 1, a.end(), b[i]) - a.begin();
        int pc = upper_bound(c.begin() + 1, c.end(), b[i]) - c.begin();
        int paa = pa - 1, pcc = pc - 1;
        if (pa <= na) {
            if (pc <= nc) ans = min(ans, Calc(b[i], a[pa], c[pc]));
            if (pcc >= 1) ans = min(ans, Calc(b[i], a[pa], c[pcc]));
        }
        if (paa >= 1) {
            if (pc <= nc) ans = min(ans, Calc(b[i], a[paa], c[pc]));
            if (pcc >= 1) ans = min(ans, Calc(b[i], a[paa], c[pcc]));
        }
    }
    for (int i = 1; i <= nc; i++) {
        int pb = upper_bound(b.begin() + 1, b.end(), c[i]) - b.begin();
        int pa = upper_bound(a.begin() + 1, a.end(), c[i]) - a.begin();
        int pbb = pb - 1, paa = pa - 1;
        if (pb <= nb) {
            if (pa <= na) ans = min(ans, Calc(c[i], b[pb], a[pa]));
            if (paa >= 1) ans = min(ans, Calc(c[i], b[pb], a[paa]));
        }
        if (pbb >= 1) {
            if (pa <= na) ans = min(ans, Calc(c[i], b[pbb], a[pa]));
            if (paa >= 1) ans = min(ans, Calc(c[i], b[pbb], a[paa]));
        }
    }
    cout << ans << endl;
}

signed main() {
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    int ING = 1;
    cin >> ING;
    while (ING--) {
        solve();
    }
    return 0;
}
posted @ 2025-02-09 18:30  miao-jc  阅读(13)  评论(0)    收藏  举报