php 网站开发心得,新会人才网,如何建设公众平台网站,ai设计网站P2634 [国家集训队]聪聪可可
题意#xff1a;
一颗n个点的树#xff0c;问其中两点之间的边上数的和加起来是3的倍数的点对有多少个#xff1f; 输出这样的点对所占比例
题解#xff1a;
因为是求三的倍数#xff0c;我们num来记录%30#xff0c;1#xff0c;2的数量…P2634 [国家集训队]聪聪可可
题意
一颗n个点的树问其中两点之间的边上数的和加起来是3的倍数的点对有多少个 输出这样的点对所占比例
题解
因为是求三的倍数我们num来记录%3012的数量对于u得到的d[]累加num[3-d[]]的数量。 其实就是常规的点分治模板
代码
#include bits/stdc.h
#include unordered_map
#define debug(a, b) printf(%s %d\n, a, b);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pairint, int PII;
clock_t startTime, endTime;
//Fe~Jozky
const ll INF_ll 1e18;
const int INF_int 0x3f3f3f3f;
void read(){};
template typename _Tp, typename... _Tps void read(_Tp x, _Tps... Ar)
{x 0;char c getchar();bool flag 0;while (c 0 || c 9)flag| (c -), c getchar();while (c 0 c 9)x (x 3) (x 1) (c ^ 48), c getchar();if (flag)x -x;read(Ar...);
}
template typename T inline void write(T x)
{if (x 0) {x ~(x - 1);putchar(-);}if (x 9)write(x / 10);putchar(x % 10 0);
}
void rd_test()
{
#ifdef LOCALstartTime clock();freopen(in.txt, r, stdin);
#endif
}
void Time_test()
{
#ifdef LOCALendTime clock();printf(\nRun Time:%lfs\n, (double)(endTime - startTime) / CLOCKS_PER_SEC);
#endif
}
const int maxn 2e5 9;
vectorPII vec[maxn];
int vis[maxn], d[maxn], sz[maxn];
int rt, cnt;
int num[4];
void dfs_rt(int u, int fa, int tot)
{sz[u] 1;int v, w, n 0;for (auto it : vec[u]) {v it.first;if (v fa || vis[v])continue;dfs_rt(v, u, tot);sz[u] sz[v];n max(n, sz[v]);}n max(n, tot - sz[u]);if (2 * n tot)rt u;
}
void dfs_dis(int u, int fa, int dis)
{d[cnt] dis;for (auto it : vec[u]) {int v it.first;int w it.second;if (v fa || vis[v])continue;dfs_dis(v, u, dis w);}
}
int work(int u, int fa, int tot)
{dfs_rt(u, fa, tot);u rt;vis[u] 1;ll ans 0;for (auto it : vec[u]) {int v it.first;int w it.second;if (vis[v])continue;cnt 0;dfs_dis(v, u, w);sz[v] cnt;for (int i 1; i cnt; i) {ans num[(3 - d[i] % 3) % 3];if (d[i] % 3 0)ans;}for (int i 1; i cnt; i) {num[d[i] % 3];}}num[0] num[1] num[2] 0;for (auto it : vec[u]) {int v it.first;if (vis[v])continue;ans work(v, u, sz[v]);}return ans;
}
int main()
{//rd_test();int n;read(n);for (int i 1; i n; i) {int u, v, w;read(u, v, w);vec[u].push_back({v, w});vec[v].push_back({u, w});}ll a 2ll * work(1, 0, n) n;ll b 1ll * n * n;ll g __gcd(a, b);printf(%lld/%lld\n, a / g, b / g);return 0;//Time_test();
}