CodeForces-884C
来源:互联网 发布:spss for mac已到期 编辑:程序博客网 时间:2024/06/03 19:21
题意抽象:1.每一个点都只有一进一出,也就是他一定自己成环或者和别人一起成环。
2.舒适度计算——当x能到达y的时候,舒适度加一。经过计算,在一个环里面,每一个点的舒适度都为环的总点数N的平方,即n*n
3.题目通过更改两条路的终点,使舒适度MAX。实际上就是找到最大的两个环,改动两条使两个环变成一个环(因为设环1的点数为N,环2的点数为M,所以增加的舒适度为(N+M)( N+M )-N*N-M*M==2NM,所以环越大,最后增加的越大,所以找最大的两个环)。
所以AC代码:
#include <iostream>#include <algorithm>#include <string>#include <math.h>#include <queue>#include <cstdio>#define pie (long double)acos(-1)#define lld long doubleusing namespace std;int n;const int maxn=100000+10;int a[maxn]={0};int visit[maxn]={0};priority_queue<long long >q;int temp=0;int dfs(int i){ if(visit[i]==1) return temp; else { temp++; visit[i]=1; dfs(a[i]); // cout<<i<<" "<<temp<<endl; return temp; }}int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } for(int i=1;i<=n;i++) { if(visit[i]==0) { temp=0; q.push(dfs(i)); } } if(q.size()>=2) { long long x=q.top(); q.pop(); // cout<<x<<endl; long long y=q.top(); q.pop(); // cout<<y<<endl; long long ans=(x+y)*(x+y); while(!q.empty()) { ans=ans+q.top()*q.top(); q.pop(); } printf("%I64d\n",ans); } else if(q.size()==1) { long long x=q.top(); printf("%I64d\n",x*x); } return 0;}
错了两次,一个是因为当情况为“只有一个环”的时候,那么第二次q.push()会失败的~,应该要分类讨论
第二次是因为他最后要算的是总的舒适度,我只算了两个环变成一个环的舒适度。
阅读全文
0 0
- CodeForces-884C
- codeforces 884C. Bertown Subway
- codeforces 884C Bertown Subway
- Codeforces-340-C(c++)
- Codeforces-507-C(c++)
- CodeForces 731C C
- CodeForces-612C C
- CODEFORCES 265C CODEFORCES, 265C
- codeforces #78 div2 C
- Codeforces 117C Cycle
- CodeForces 209C
- CodeForces 156C Cipher
- codeforces 148 div2 C
- codeforces 242C
- Codeforces-234C Weather
- codeforces 106C Buns
- codeforces 158C
- Codeforces 243C
- Waymo全自动驾驶汽车上路测试,不久后你可以租辆无人车通勤、跑腿儿了
- 斯坦福大学秋季课程《深度学习理论》STATS 385开讲
- 【noip2015】信息传递
- spring boot
- 018 含参方程组习题及公共解理论
- CodeForces-884C
- Xcode9学习笔记46
- Spring
- python import、datetime获取时间及转换
- 打造Android万能下拉刷新上拉加载控件
- 【模板】Tarjan
- Android下拉刷新完全解析,教你如何一分钟实现下拉刷新功能
- NOIP2017多校联测&提高组模拟25-A
- Xcode9学习笔记47