4 条题解
-
0
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e6+10; int n; int fa[N]; int a[N]; int find(int x){ return fa[x]==x ? x : fa[x] = find(fa[x]) ; } void unite(int x,int y){ fa[find(y)] = find(x); } int main(){ ios::sync_with_stdio(false); cin.tie(0); cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; fa[i]=i; } for(int i=1;i<=n;i++){ unite(i,a[i]); } vector<int> size(n+1,0); for(int i=1;i<=n;i++){ size[find(i)]++; } int ans = 0; for(int i=1;i<=n;i++){ ans = max(ans,size[i]); } for(int i=1;i<=n-1;i++){ int r1 = find(i); int r2 = find(i+1); if(r1!=r2){ ans = max(ans,size[r1]+size[r2]); } } cout<<ans; return 0; } -
0
#include<bits/stdc++.h> using namespace std; const int N=1e6+10; int fa[N]; int a[N]; int find(int x){ if(fa[x]!=x) fa[x]=find(fa[x]); return fa[x]; } void merge(int x,int y){ fa[find(x)]=find(y); } int main() { int n; cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; fa[i]=i; } for(int i=1;i<=n;i++){ merge(i,a[i]); } vector<int> res(n+1); for(int i=1;i<=n;i++){ res[find(i)]++; } sort(res.begin(),res.end(),greater<int>()); int ans=0; ans+=res[0]+res[1]; cout<<ans; } -
0
#include<vector> #include<iostream> #include<map> #include<queue> using namespace std; using ll = long long ; priority_queue<int> mxheap; priority_queue<int,vector<int>,greater<int>> mnheap; const int N =1e6+9; int n; int a[N];//存储原数组 int c[N];//存储联通 int p[N];//存储数量 void solve(){ cin>>n; for(int i=1; i<=n;i++) cin>>a[i]; int id = 0; for(int i=1; i<=n;i++){ if(!c[i]) id++; int curr = i ; int count = 0 ; while(!c[curr]){ c[curr] = id; count++; curr = a[curr]; p[id] = count; } } int mx =0 ; for(int i=1; i<=id ; i++){ mx = max(mx , p[i]); } for(int i=1; i<=n;i++){ int left = c[i]; int right = c[i+1]; if(left != right){ mx = max(mx , p[left] + p[right]); } } cout<<mx<<endl; } int main(){ ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); int t_ = 1; while(t_--) solve(); return 0; } -
0
#include<bits/stdc++.h> #include<unordered_map> using namespace std; //我们用队列进行bfs,把所有联通的点打上一个遇到的这个联通图的点的值 //然后使用哈希图统计,每个联通图特有值出现的次数,当然你直接用数组也可以,范围不大 //然后将所有的点打上这个它所在的联通图的点的数量, //当两个连续的点处于一个联通图中时,将第一个点与最大值进行比较 //当两个连续的点出狱不同的联通图中时,将两个点的所在联通图点数量总和相加与最大值比较 //最后对末尾的一个点进行比较处理,得到最终最大值,输出 int main(){ int N;cin>>N; vector<int> a(N+1); for(int i=1;i<=N;i++)cin>>a[i]; vector<int> b(N+1,0); for(int i=1;i<=N;i++){ int tp = 0; if(b[i]==0)tp=i; else continue; deque<int>dq; dq.push_back(i); while(!dq.empty()){ int x = dq.front();dq.pop_front(); if(b[a[x]]==tp)break; b[a[x]] = tp; dq.push_back(a[x]); } } unordered_map<int,int> mp; for(int i=1;i<=N;i++) mp[b[i]]++; vector<int> t(N+1,0); for(int i=1;i<=N;i++)t[i] = mp[b[i]]; int max_val = t[0]; for(int i=1;i<N;i++){ if(b[i]!=b[i+1]) max_val = max(max_val,t[i]+t[i+1]); else if(b[i]==b[i+1]) max_val = max(max_val,t[i]); } max_val = max(max_val,t[N]); cout<<max_val<<endl; // for(int i=1;i<=N;i++)cout<<a[i]<<' '; // cout<<endl; // for(int i=1;i<=N;i++)cout<<b[i]<<' '; //不会使用断点的代价 return 0; } // 这道题好好玩
- 1
信息
- ID
- 608
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 普及
- 标签
- 递交数
- 431
- 已通过
- 139
- 上传者