codeforces Goodbye2014
2014年最后一场codeforces,不能更逗比==
手速好慢,搭配上这个网速,再加上自己煞笔思考速度,尼玛简直了,造就了我史上降分最多,差点跌破紫名TAT。
因为手速问题,A到10+min才pass。。。
然后苦逼的B题,要求满足可交换矩阵交换后字典序最小,想到是从小到大将数尽可能的往前移,然后就是实现,我是从1到它自己的位置,只要比它小然后能交换那么交换,继续寻找知道木有~在1小时+这样pass后总感觉怪怪的==果不其然,在C过了不一会就被hack了,于2小时这样被hack,然后发现可以先往后移再往前移,于是这样就要对矩阵进行预处理,我先打了一个floyd传递可交换性,wst当时在旁边看了一下然后说貌似只能传递一次,我想想也是哦,然后没有提交立马删了floyd预处理。然后打了一个并查集,打完之后想会不会交换后就没法更改了汗==然后删了并查集。接着打了一个暴力dfs预处理,打完之后还剩一分钟,坑逼网点了一分钟木有反应gg。
赛后等到3点多重判完交了第一发dfs没交上的版本AC:
1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 using namespace std; 5 struct dian{ 6 int num,id; 7 }a[10005]; 8 int n; 9 int g[305][305],b[305],f[305]; 10 int cmp(dian n1,dian n2) 11 { 12 return n1.num<n2.num; 13 } 14 void dfs(int root,int tmp) 15 { 16 g[root][tmp]=g[tmp][root]=1; 17 for (int i=1;i<=n;i++) 18 if (g[tmp][i]&&g[root][i]==0) 19 { 20 dfs(root,i); 21 } 22 } 23 int main() 24 { 25 int i,j,x,y,k,t; 26 scanf("%d",&n); 27 for (i=1;i<=n;i++) 28 { 29 scanf("%d",&b[i]); 30 a[i].num=b[i]; 31 a[i].id=i; 32 } 33 sort(a+1,a+n+1,cmp); 34 for (i=1;i<=n;i++) 35 f[a[i].id]=i; 36 for (i=1;i<=n;i++) 37 for (j=1;j<=n;j++) 38 { 39 scanf("%1d",&g[i][j]); 40 } 41 for (i=1;i<=n;i++) 42 for (j=1;j<=n;j++) 43 if (g[i][j]) 44 dfs(i,j); 45 for (i=1;i<=n;i++) 46 { 47 for (k=1;k<=n;k++) 48 for (j=1;j<a[i].id;j++) 49 if (g[j][a[i].id]&&b[j]>b[a[i].id]) 50 { 51 swap(b[j],b[a[i].id]); 52 y=a[i].id; a[i].id=j; 53 a[f[j]].id=y; 54 t=f[j]; f[j]=f[y]; f[y]=t; 55 } 56 } 57 for (i=1;i<n;i++) 58 printf("%d ",b[i]); 59 printf("%d\n",b[n]); 60 }
第二天过来交了floyd的第一个版本AC:
1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 using namespace std; 5 struct dian{ 6 int num,id; 7 }a[10005]; 8 int n; 9 int g[305][305],b[305],f[305]; 10 int cmp(dian n1,dian n2) 11 { 12 return n1.num<n2.num; 13 } 14 int main() 15 { 16 int i,j,x,y,k,t; 17 scanf("%d",&n); 18 for (i=1;i<=n;i++) 19 { 20 scanf("%d",&b[i]); 21 a[i].num=b[i]; 22 a[i].id=i; 23 } 24 sort(a+1,a+n+1,cmp); 25 for (i=1;i<=n;i++) 26 f[a[i].id]=i; 27 for (i=1;i<=n;i++) 28 for (j=1;j<=n;j++) 29 { 30 scanf("%1d",&g[i][j]); 31 } 32 for (i=1;i<=n;i++) 33 for (j=1;j<=n;j++) 34 for (k=1;k<=n;k++) 35 { 36 if (g[i][j]&&g[k][j]) g[i][k]=g[k][i]=1; 37 if (g[i][j]&&g[i][k]) g[j][k]=g[k][j]=1; 38 if (g[k][i]&&g[k][j]) g[i][j]=g[j][i]=1; 39 } 40 for (i=1;i<=n;i++) 41 { 42 for (k=1;k<=n;k++) 43 for (j=1;j<a[i].id;j++) 44 if (g[j][a[i].id]&&b[j]>b[a[i].id]) 45 { 46 swap(b[j],b[a[i].id]); 47 y=a[i].id; a[i].id=j; 48 a[f[j]].id=y; 49 t=f[j]; f[j]=f[y]; f[y]=t; 50 } 51 } 52 for (i=1;i<n;i++) 53 printf("%d ",b[i]); 54 printf("%d\n",b[n]); 55 }
随后是期间被自己傻逼否定的并查集版本AC:
1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 using namespace std; 5 struct dian{ 6 int num,id; 7 }a[10005]; 8 int n; 9 int g[305][305],b[305],f[305],father[305]; 10 int cmp(dian n1,dian n2) 11 { 12 return n1.num<n2.num; 13 } 14 int find(int x) 15 { 16 if (father[x]!=x) father[x]=find(father[x]); 17 return father[x]; 18 } 19 int main() 20 { 21 int i,j,x,y,k,t; 22 scanf("%d",&n); 23 for (i=1;i<=n;i++) 24 { 25 scanf("%d",&b[i]); 26 a[i].num=b[i]; 27 a[i].id=i; 28 father[i]=i; 29 } 30 sort(a+1,a+n+1,cmp); 31 for (i=1;i<=n;i++) 32 f[a[i].id]=i; 33 for (i=1;i<=n;i++) 34 for (j=1;j<=n;j++) 35 { 36 scanf("%1d",&g[i][j]); 37 if (g[i][j]&&find(i)!=find(j))father[find(i)]=find(j); 38 } 39 for (i=1;i<=n;i++) 40 { 41 for (k=1;k<=n;k++) 42 for (j=1;j<a[i].id;j++) 43 if (find(j)==find(a[i].id)&&b[j]>b[a[i].id]) 44 { 45 swap(b[j],b[a[i].id]); 46 y=a[i].id; a[i].id=j; 47 a[f[j]].id=y; 48 t=f[j]; f[j]=f[y]; f[y]=t; 49 } 50 } 51 for (i=1;i<n;i++) 52 printf("%d ",b[i]); 53 printf("%d\n",b[n]); 54 }
哎说到底就是弱,哪来那么多理由TAT
C是个贪心,只要想到最忧顺序就是给的顺序代码就很好写了==
D比赛时没时间看了,赛后补了一发:http://www.cnblogs.com/xiao-xin/articles/4196009.html
最近比赛都没怎么补题,快期末了,期末考完再说吧TUT