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