求助复杂度
查看原帖
求助复杂度
974277
水星湖psgqwq楼主2024/8/27 22:57
#include <bits/stdc++.h>
#define int long long
using namespace std;

const int N = 1e5 + 5;

int n, r, c, low[N], dfn[N], ins[N], stk[N], top, t[N], ans, cnt, C, s[N], sz[N], ind[N], f[N];
vector<int> p[N], col[N*10], row[N*10], g[N];
map<pair<int, int>, int> mp;
pair<int, int> a[N];
queue<int> q;
void dfs(int u) {
    low[u] = dfn[u] = ++cnt;
    stk[++top] = u, ins[u] = 1;
    for(int v : p[u]) {
        if(!dfn[v]) {
            dfs(v);
            low[u] = min(low[u], low[v]);
        }
        else if(ins[v])
            low[u] = min(low[u], dfn[v]);
    }
    if(low[u] == dfn[u]) {
        ++C; int v;
        do {
            v = stk[top--];
            s[v] = C, sz[C]++;
            ins[v] = 0;
        } while(v != u);
    }
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> n >> r >> c;
    for(int i = 1; i <= n; i++) {
        int x, y; cin >> x >> y >> t[i];
        row[x].push_back(i);
        col[y].push_back(i);
        mp[{x, y}] = i;
        a[i] = {x, y};
    }
    for(int i = 1; i <= n; i++) {
        if(t[i] == 1) 
            for(int j : row[a[i].first])
                p[i].push_back(j);
        if(t[i] == 2)
            for(int j : col[a[i].second])
                p[i].push_back(j);
        if(t[i] == 3) {
            int dx[] = {0, 0, 1, 1, 1, -1, -1, -1};
            int dy[] = {1, -1, 0, 1, -1, 0, 1, -1};
            for(int j = 0; j < 8; j++) 
                if(mp.count({a[i].first + dx[j], a[i].second + dy[j]})) 
                    p[i].push_back(mp[{a[i].first + dx[j], a[i].second + dy[j]}]);
        }
    }
    for(int i = 1; i <= n; i++)
        if(!dfn[i]) dfs(i);
    for(int i = 1; i <= n; i++)
        for(int j : p[i])
            if(s[i] != s[j]) 
                g[s[i]].push_back(s[j]), ind[s[j]]++;

    queue<int> q;
    for(int i = 1; i <= C; i++) 
        if(!ind[i]) q.push(i), f[i] = sz[i];
    while(!q.empty()) {
        int u = q.front(); q.pop();
        for(int v : g[u]) {
            f[v] = max(f[v], f[u] + sz[v]);
            if(!--ind[v]) q.push(v);
        }
    }
    cout << *max_element(f + 1, f + C + 1) << endl;
    return 0;
}

为什么过了,不是平方的吗/kel

2024/8/27 22:57
加载中...