1 条题解

  • 0
    @ 2026-10-25 18:48:32

    思路

    只能按编号删除前缀,反向加点并查集合并,最大分量超过n/2时定位最小删除数。

    参考程序(C++11)

    #include <bits/stdc++.h>
    using namespace std;
    vector<int>p,sz;int findr(int x){return p[x]==x?x:p[x]=findr(p[x]);}int main(){ios::sync_with_stdio(false);cin.tie(nullptr);int n;cin>>n;vector<vector<int>>g(n);for(int i=0;i<n;i++){int k;cin>>k;while(k--){int x;cin>>x;g[i].push_back(--x);g[x].push_back(i);}}p.resize(n);iota(p.begin(),p.end(),0);sz.assign(n,1);int maxsize=0;for(int i=n-1;i>=0;i--){maxsize=max(maxsize,1);for(int u:g[i])if(u>i){int a=findr(i),b=findr(u);if(a!=b){if(sz[a]<sz[b])swap(a,b);p[b]=a;sz[a]+=sz[b];maxsize=max(maxsize,sz[a]);}}if(maxsize>n/2){cout<<i+1<<'\n';return 0;}}}
    
    • 1

    信息

    ID
    1409
    时间
    1000ms
    内存
    64MiB
    难度
    普及
    标签
    递交数
    1
    已通过
    1
    上传者