codeforces884C(暴力想法题?)

题意:输入n表示有n个车站
输入n个数,表示这些从这些车站出发可以到达的车站
输出:最多修改两个车站的到达站点,并且满足限制条件,求最大的路线数。
限制条件:一个车站有且仅有一个到达车站。
可以从这个车站到它本身
思路:其实就是一个很简单的题目…
由于公式a^2+b^2<(a+b)^2,易知我们只需找出两个最大的环,将这两个环融合。然后每个环内节点数的平方和就是答案。若整个铁路系统是一个环,那么直接平方就是答案。
虽然这么简单一眼就看懂了但是还是莫名地WA了= =
WA代码:

#include
using namespace std;
const int MAXN =1e5+7;
int p[MAXN],visit[MAXN];
vector<long long> pa;
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int n;
    cin>>n;
    memset(visit,0,sizeof(visit));
    for(int i=1;i<=n;i++){
        cin>>p[i];
    }
    int maxn=0,maxm=0;
    for(int i=1;i<=n;i++){
        int now=i;
        int loop=1;
        if(visit[now]) continue;
  //                  cout<<"now=="<
        while(p[now]!=i){
            loop++;
            visit[now]++;
            now=p[now];

        }
        visit[now]++;
  //      cout<<"loop=="<
        if(loop==n){
            pa.push_back(loop);
            break;
        }
        else if(loop>maxn){
            pa.push_back(maxn);
             maxn=loop;
        }
        else if(loop>maxm){
            pa.push_back(maxm);
             maxm=loop;
        }
        else pa.push_back(loop);
    }
//    cout<
 //   cout<
    pa.push_back(maxm+maxn);
    long long ans=0;
    while(!pa.empty()){
        long long a=pa.back();
        ans+=a*a;
        pa.pop_back();
    }
    cout<return 0;
}

AC代码:

#include
using namespace std;
const int MAXN =1e5+7;
int p[MAXN],visit[MAXN];
vector<long long> pa;
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int n;
    cin>>n;
    memset(visit,0,sizeof(visit));
    for(int i=1;i<=n;i++){
        cin>>p[i];
    }
    int maxn=0,maxm=0;
    for(int i=1;i<=n;i++){
        int loop=0;
        if(!visit[i]){
            int j=i;
            while(!visit[j]){
                visit[j]++;
                loop++;
                j=p[j];
            }
        }
    pa.push_back(loop);
    }
//    cout<
 //   cout<
    long long ans=0;
    sort(pa.begin(),pa.end());
    long long addi=pa.back();
    if(n==1){
        ans=n;
        addi=0;
    }
    else{
    ans=pa.back()*pa.back();
    pa.pop_back();
    ans+=pa.back()*pa.back();
    addi=addi*2*pa.back();
    pa.pop_back();
    while(!pa.empty()){
        long long a=pa.back();
        ans+=a*a;
        pa.pop_back();
    }
    }
    cout<return 0;
}

你可能感兴趣的:(codeforces,codeforces,Cynthia=w=,构造)