meaning of the title
Sol
According to the routine of turning edges into undirected graphs, we adopt the strategy of connecting edges with large weight to small weight.
Then enumerate each point from small to large according to the weight, and then enumerate the points they connect out\(v\)
If the degree of (v\) is \(\leqslant M\), then en u merate the point of \(v\) connected violently \\\\\\\\\\\\\\\\
Otherwise, enumerate the points where (u\) is connected v iolently \\\\\\ and see if \\\\\\\\
Complexity is(O(M\sqrt{M})
#include<bits/stdc++.h> #define LL long long using namespace std; const int MAXN = 100001; inline int read() { char c = getchar(); int x = 0, f = 1; while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();} while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar(); return x * f; } int N, M, a[MAXN], block, siz[MAXN], flag[MAXN], rak[MAXN], tp[MAXN]; vector<int> v[MAXN]; set<int> s[MAXN]; int comp(const int &x, const int &y) { return a[x] == a[y] ? x < y : a[x] < a[y]; } int main() { N = read(); M = read(); block = sqrt(M); for(int i = 1; i <= N; i++) a[i] = read(), tp[i] = i; sort(tp + 1, tp + N + 1, comp); for(int i = 1; i <= N; i++) rak[tp[i]] = i; for(int i = 1; i <= M; i++) { int x = read(), y = read(); if(rak[x] > rak[y]) v[x].push_back(y), siz[x]++; else v[y].push_back(x), siz[y]++; } LL ans = 0; for(int i = 3; i <= N; i++) { int x = tp[i]; for(int j = 0, to; j < v[x].size(); j++) flag[to = v[x][j]] = i; for(int j = 0, to; j < v[x].size(); j++) { if(siz[to = v[x][j]] <= block) { for(int k = 0; k < v[to].size(); k++) if(flag[v[to][k]] == i) ans += a[x]; } else { for(int k = 0; k < v[x].size(); k++) if(s[to].count(v[x][k])) ans += a[x]; } s[x].insert(to); } } cout << ans; return 0; } /* 2 1 13 17 2 1 */