BZOJ3498: PA2009 Cakes (ternary ring)

Keywords: C++ PHP

meaning of the title

Title Link

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

*/

Posted by hankster on Thu, 24 Jan 2019 10:36:13 -0800