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;
}

浙公网安备 33010602011771号