bzoj 3498 PA2009 Cakes
N个点m条边,每个点有一个点权a。
对于任意一个三元环(i,j,k)(i<j<k),它的贡献为max(ai,aj,ak)
求所有三元环的贡献和。
N<100000
m<250000
模拟题意即可……
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N = 1e5 + 10; 4 vector<int> g[N]; 5 int deg[N], val[N], vis[N], n, m; 6 long long ans; 7 struct E { int u, v; } e[N * 3]; 8 int main() { 9 scanf("%d%d", &n, &m); 10 for(int i = 1 ; i <= n ; ++ i) scanf("%d", &val[i]); 11 for(int i = 1 ; i <= m ; ++ i) { 12 scanf("%d%d", &e[i].u, &e[i].v); 13 ++ deg[e[i].u], ++ deg[e[i].v]; 14 } 15 for(int i = 1 ; i <= m ; ++ i) { 16 int u = e[i].u, v = e[i].v; 17 if(deg[u] < deg[v] || (deg[u] == deg[v] && u > v)) swap(u, v); 18 g[u].push_back(v); 19 } 20 for(int x = 1 ; x <= n ; ++ x) { 21 for(int i = 0 ; i < g[x].size() ; ++ i) vis[g[x][i]] = x; 22 for(int i = 0 ; i < g[x].size() ; ++ i) { 23 int y = g[x][i]; 24 for(int j = 0 ; j < g[y].size() ; ++ j) { 25 int z = g[y][j]; 26 if(vis[z] == x) { 27 ans += max(max(val[x], val[y]), val[z]); 28 } 29 } 30 } 31 } 32 printf("%lld\n", ans); 33 }