Codeforces Round #528 div1
阿新 • • 發佈:2018-12-24
完了,看來上一次的flag要應驗了,我大概是真的要掉成pupil了吧。。
A - Connect Three
這個就是找到x的中間值,y的中間值,然後切一下,然後把所有的點掛到這條邊上。但是我做的還是太慢了啊,還WA了一次,具體原因就是把\(sort(x,x+3)\)寫成了\(sort(x,x+2)\)。。。然後就多花了十分鐘。涼涼的前兆。
#include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<set> #include<map> #include<vector> #include<cmath> #include<cctype> using namespace std; typedef long long ll; const int Maxn=410000; int x[10],y[10],a[10],b[10],num; int ansx[Maxn],ansy[Maxn],bj[1100][1100]; int main() { scanf("%d%d%d%d%d%d",&x[0],&y[0],&x[1],&y[1],&x[2],&y[2]); memcpy(a,x,sizeof(a)); memcpy(b,y,sizeof(b)); sort(x,x+3);sort(y,y+3); int xx=x[1],yy=y[1]; for(int i=x[0];i<=x[2];i++) bj[i][yy]=1; for(int i=b[0];i<=yy;i++) bj[a[0]][i]=1; for(int i=yy;i<=b[0];i++) bj[a[0]][i]=1; for(int i=b[1];i<=yy;i++) bj[a[1]][i]=1; for(int i=yy;i<=b[1];i++) bj[a[1]][i]=1; for(int i=b[2];i<=yy;i++) bj[a[2]][i]=1; for(int i=yy;i<=b[2];i++) bj[a[2]][i]=1; for(int i=0;i<=1000;i++) for(int j=0;j<=1000;j++) if(bj[i][j]) ansx[++num]=i,ansy[num]=j; printf("%d\n",num); for(int i=1;i<=num;i++) printf("%d %d\n",ansx[i],ansy[i]); return 0; }
B - Minimum Diameter Tree
這個有一個結論,最後有權值的邊都是入度為1的點連出去的邊,因為如果不是入度為1的點連出去的邊,那麼一定可以把他的權值下放給入度為1的邊,這樣一定不會更差。
#include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<set> #include<map> #include<vector> #include<cmath> #include<cctype> using namespace std; typedef long long ll; const int Maxn=410000; int d[Maxn]; int main() { int n,s,u,v; scanf("%d%d",&n,&s); for(int i=1;i<n;i++) { scanf("%d%d",&u,&v); d[u]++;d[v]++; } int sum=0; for(int i=1;i<=n;i++) if(d[i]==1) sum++; printf("%.8lf",2.0*s/sum); return 0; }
C - Vasya and Templates
這個本質上是傻逼題,但是我太急了,所以就寫崩了:
然後我考完試之後看了看資料,然後把一個很簡單的特判改了一下就RE了,又一看是陣列開小了,再改上就A了。。然而直接把這個特判刪掉也能對。我。。。
好吧,這個題就是說如果a和b相等,那就直接挨著賦值,如果不行那就不行了。
如果不相等,那麼從前往後看,如果這一位可以賦成兩個中間的值,那剩下的隨便賦就好了。
如果這一位那兩個相等,那肯定要賦成這個值,如果不行那就不行了。
如果不相等,那就列舉賦成那個,另一個就不用考慮了。
#include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<set> #include<map> #include<vector> #include<cmath> #include<cctype> using namespace std; typedef long long ll; const int Maxn=1010000; int lens,k; char s[Maxn],a[Maxn],b[Maxn]; int ans[31],vis[31],tmp[31],tmp2[31]; int sola(int x); int solb(int x); int main() { // freopen("test.in","r",stdin); int t;scanf("%d",&t); while(t--) { scanf("%d",&k); scanf("%s%s%s",s,a,b); memset(ans,-1,sizeof(ans)); memset(vis,-1,sizeof(vis)); lens=strlen(s); int flag=0,bj=0; for(int i=0;i<lens;i++) s[i]-='a',a[i]-='a',b[i]-='a'; for(int i=0;i<lens;i++) if(b[i]<a[i]) {//對,沒錯,就是這個特判,我也是不知道怎麼想的,還要判a是否小於b,但是他保證了這一點了吧。。 puts("NO"); bj=1; break; } else if(b[i]>a[i]) break; if(bj) continue; for(int i=0;i<lens;i++) if(a[i]!=b[i]) { flag=1; break; } if(flag) { for(int i=0;i<lens;i++) { if(~ans[s[i]]) { if(ans[s[i]]>a[i]&&ans[s[i]]<b[i]) break; if(ans[s[i]]<a[i]||ans[s[i]]>b[i]) { puts("NO"); bj=1;break; } if(a[i]!=b[i]) { if(ans[s[i]]==a[i]) if(sola(i+1)) break; if(ans[s[i]]==b[i]) if(solb(i+1)) break; puts("NO"); bj=1; break; } } else { for(int j=a[i]+1;j<b[i];j++) if(vis[j]==-1) { ans[s[i]]=j; vis[j]=s[i]; goto solve; } if(a[i]!=b[i]) { memcpy(tmp,ans,sizeof(tmp)); memcpy(tmp2,vis,sizeof(tmp2)); if(vis[a[i]]==-1) { ans[s[i]]=a[i],vis[a[i]]=s[i]; if(sola(i+1)) break; } memcpy(ans,tmp,sizeof(ans)); memcpy(vis,tmp2,sizeof(vis)); if(vis[b[i]]==-1) { ans[s[i]]=b[i],vis[b[i]]=s[i]; if(solb(i+1)) break; } puts("NO"); bj=1;break; } else { if(~vis[a[i]]) { puts("NO"); bj=1; break; } ans[s[i]]=a[i]; vis[a[i]]=s[i]; } } } } else { for(int i=0;i<lens;i++) if(ans[s[i]]==-1) { if(vis[a[i]]==-1) ans[s[i]]=a[i],vis[a[i]]=s[i]; else { puts("NO"); bj=1; break; } } else if(ans[s[i]]!=a[i]) { puts("NO"); bj=1; break; } } solve:; if(bj) continue; int temp=0; for(int i=0;i<k;i++) if(ans[i]==-1) { while(~vis[temp]) temp++; ans[i]=temp;vis[temp]=1; } puts("YES"); for(int i=0;i<k;i++) printf("%c",ans[i]+'a'); putchar('\n'); } return 0; } int sola(int x) { for(int i=x;i<lens;i++) { if(~ans[s[i]]) { if(ans[s[i]]>a[i]) return 1; if(ans[s[i]]<a[i]) return 0; } else { for(int j=a[i]+1;j<k;j++) if(vis[j]==-1) { ans[s[i]]=j; vis[j]=s[i]; return 1; } if(vis[a[i]]==-1) { ans[s[i]]=a[i]; vis[a[i]]=s[i]; continue; } return 0; } } return 1; } int solb(int x) { for(int i=x;i<lens;i++) { if(~ans[s[i]]) { if(ans[s[i]]<b[i]) return 1; if(ans[s[i]]>b[i]) return 0; } else { for(int j=0;j<b[i];j++) if(vis[j]==-1) { ans[s[i]]=j; vis[j]=s[i]; return 1; } if(vis[b[i]]==-1) { ans[s[i]]=b[i]; vis[b[i]]=s[i]; continue; } return 0; } } return 1; }
這場也體現出了一些缺陷,比如看題太過急躁,程式碼能力還是較弱,除錯能力太差,做題狀態不佳,這些可能是與平常練習的方式有關,最近要努力了,爭取能再上回去,當然能上橙更好啊。