4 条题解

  • 0
    @ 2026-5-30 9:53:12
    #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
      @ 2026-5-27 23:21:25
      #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
        @ 2026-5-19 16:43:36
        #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
          @ 2026-5-9 15:05:17
          #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
          上传者