A 小K的疑惑

显然我们选的三个点必须是两两之间的距离之差是偶数,我们选定一个参考点(也就是根),求出其他点到这个点的距离,然后距离为偶数的为一组,奇数的为一组,答案就是偶数的个数的三次方加上奇数的个数的三次方(可以重复选)

#include <bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
#define pii pair<int,int>
#define int long long
const int inf = 0x3f3f3f3f;
const int maxn = 100110;
const int M = 1e9+7;
int n;

vector<pii> v[maxn];

int d[maxn];
int a[3];

void dfs(int u,int pre)
{   
    for(auto i : v[u])
    {
        if(i.first == pre) continue;
        d[i.first] = (d[u] + i.second)%2;
        a[d[i.first]]++;
        dfs(i.first,u);
    }
}

signed main()
{
    ios::sync_with_stdio(false);cin.tie(0);
    cin>>n;
    for(int i = 2,x,y,z; i <= n; i++) 
    {
        cin>>x>>y>>z;
        v[x].push_back({y,z});
        v[y].push_back({x,z});
    }
    a[0] = 1;
    dfs(1,0);
    int ans = a[0]*a[0]*a[0] + a[1]*a[1]*a[1];
    cout<<ans<<endl;
    return 0;
}

B 救救企鹅

py大法好,四行搞定

s = input()
a = input()
b = input()
print(s.replace(a,b))

MIKU酱的氪金宝典

我们可以二分这个值,然后利用走权值小于等于这个值的边,如果可以走到 n 点,就代表这个值是可行的。

注意是有向边,因为这个wa了2发。

#include <bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
#define pii pair<int,int>
#define int long long
const int inf = 0x3f3f3f3f;
const int maxn = 310;
const int M = 1e9+7;
int n,m;

vector<pii> v[maxn];

bool vis[maxn];

bool check(int x)
{  
    mem(vis,0);vis[1] = 1;
    queue<int> q;q.push(1);
    while(q.size())
    {
        int u = q.front();q.pop();
        for(auto i : v[u])
        {
            if(vis[i.first] || x < i.second) continue;
            vis[i.first] = 1;
            if(i.first == n) return true;
            q.push(i.first);
        }
    }
    return false;
}

signed main()
{
    ios::sync_with_stdio(false);cin.tie(0);
    while(cin>>n>>m)
    {  
        for(int i = 1,x,y,z; i <= m; i++)
        {
            cin>>x>>y>>z;
            v[x].push_back({y,z});
        }
        int l = 0,r = 1000,ans = 0;
        while(l <= r)
        {
            int mid = (l+r)/2;
            if(check(mid))
            {
                ans = mid;
                r = mid-1;
            }
            else l = mid+1;
        }
        cout<<ans<<endl;
        for(int i = 1; i <= n; i++) v[i].clear();
    }
    return 0;
}