【CF套題】Codeforces Round #528 (Div. 1)
阿新 • • 發佈:2019-01-05
【前言】
並不能打div2的我十分絕望。
雖然上分了還是很高興。
【題目】
原題地址
A.Connect Three
將三個格子按 排序後,中間那個格子向上下擴充套件,兩邊的格子再向中間連即可。
#include<bits/stdc++.h>
#define pb push_back
#define fi first
#define se second
#define mkp make_pair
using namespace std;
typedef long long ll;
int mx,mi,ans;
pair<int,int> a[4];
int read()
{
int ret=0,f=1;char c=getchar();
while(!isdigit(c)) {if(c=='-')f=0;c=getchar();}
while(isdigit(c)) ret=ret*10+(c^48),c=getchar();
return f?ret:-ret;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen ("A.in","r",stdin);
freopen("A.out","w",stdout);
#endif
mx=0;mi=1000;
for(int i=1;i<=3;++i)
{
a[i].fi=read(),a[i].se=read();
mx=max(mx,a[i].se);mi=min(mi,a[i].se);
}
sort(a+1,a+4);
ans+=mx-mi+1;
ans+=a[2].fi-a[1].fi;ans+=a[3].fi-a[2].fi;
printf("%d\n",ans);
for(int i=mi;i<=mx;++i) printf ("%d %d\n",a[2].fi,i);
for(int i=a[1].fi;i<a[2].fi;++i) printf("%d %d\n",i,a[1].se);
for(int i=a[2].fi+1;i<=a[3].fi;++i) printf("%d %d\n",i,a[3].se);
return 0;
}
B.Minimum Diameter Tree
邊權在葉子的父邊處貢獻一定優於其他邊,因此將邊權平均分配給每個葉子的父邊即可。設葉子數為 ,則答案就是 。
#include<bits/stdc++.h>
#define pb push_back
#define fi first
#define se second
#define mkp make_pair
using namespace std;
typedef long long ll;
typedef double db;
const int N=1e5+10;
int n,S,cnt,siz[N];
int read()
{
int ret=0,f=1;char c=getchar();
while(!isdigit(c)) {if(c=='-')f=0;c=getchar();}
while(isdigit(c)) ret=ret*10+(c^48),c=getchar();
return f?ret:-ret;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("B.in","r",stdin);
freopen("B.out","w",stdout);
#endif
n=read();S=read();
for(int i=1;i<n;++i)
{
int u=read(),v=read();
++siz[u];++siz[v];
}
for(int i=1;i<=n;++i) if(siz[i]==1) ++cnt;
printf("%.12lf\n",(db)S/(db)cnt*2);
return 0;
}
C.Vasya and Templates
考慮 和 第一個不同的位置,那麼在這之前 的置換一定是唯一確定的。在這之後,我們可以考慮 是貼著上邊界還是貼著下邊界,或可以不貼著邊界(即直接滿足答案)。然後分情況討論即可,細節比較多。
#include<bits/stdc++.h>
#define pb push_back
#define fi first
#define se second
#define mkp make_pair
using namespace std;
typedef long long ll;
const int N=1e6+10,M=28;
int n,flag,ff,cnt;
int a[N],b[N],c[N];
int tg[M],cg[M],bo[M];
bool used[M],use[M];
char A[N],B[N],C[N];
int read()
{
int ret=0,f=1;char c=getchar();
while(!isdigit(c)) {if(c=='-')f=0;c=getchar();}
while(isdigit(c)) ret=ret*10+(c^48),c=getchar();
return f?ret:-ret;
}
void clear()
{
flag=1;cnt=0;
memset(used,0,sizeof(used));memset(use,0,sizeof(use));memset(tg,0,sizeof(tg));
memset(bo,0,sizeof(bo));memset(cg,0,sizeof(cg));
}
void output()
{
puts("YES");
int j=1;
for(int i=1;i<=cnt;++i)
{
if(tg[i]) cg[i]=tg[i];
if(!cg[i])
{
while(used[j] || use[j]) ++j;
cg[i]=j;use[j]=1;
}
putchar(cg[i]+'a'-1);
}
puts("");
}
void checkup(int p)
{
for(int i=p+1;i<n;++i)
{
if(tg[c[i]])
{
if(tg[c[i]]>a[i]) return;
if(tg[c[i]]==a[i]) continue;
ff=0;break;
}
else
{
for(int j=a[i]+1;j<=cnt;++j)
if(!use[j]) {tg[c[i]]=j;use[j]=1;return;}
if(!use[a[i]]) {tg[c[i]]=a[i];use[a[i]]=1;continue;}
ff=0;break;
}
}
}
void checkdown(int p)
{
for(int i=p+1;i<n;++i)
{
if(tg[c[i]])
{
if(tg[c[i]]<b[i]) return;
if(tg[c[i]]==b[i]) continue;
ff=0;break;
}
else
{
for(int j=1;j<b[i];++j)
if(!use[j]) {tg[c[i]]=j;use[j]=1;return;}
if(!use[b[i]]) {tg[c[i]]=b[i];use[b[i]]=1;continue;}
ff=0;break;
}
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("C.in","r",stdin);
freopen("C.out","w",stdout);
#endif
int T=read();
while(T--)
{
clear();cnt=read();
scanf("%s%s%s",C,A,B);n=strlen(C);
if(strcmp(A,B)>0) {puts("NO");continue;}
for(int i=0;i<n;++i)
{
a[i]=A[i]-'a'+1,b[i]=B[i]-'a'+1,c[i]=C[i]-'a'+1;
//cnt=max(cnt,a[i]);cnt=max(cnt,b[i]);cnt=max(cnt,c[i]);
}
int i;
for(i=0;i<n;++i)
{
if(a[i]!=b[i]) break;
if(cg[c[i]])
{
if(cg[c[i]]==a[i]) continue;
else {flag=0;break;}
}
else
{
if(used[a[i]]){flag=0;break;}
cg[c[i]]=a[i],used[a[i]]=1;
}
}
if(!flag) {puts("NO");continue;}
if(i>=n){output();continue;}
if(cg[c[i]])
{
if(cg[c[i]]>a[i] && cg[c[i]]<b[i]) {output();continue;}
if(cg[c[i]]<a[i] || cg[c[i]]>b[i]) {puts("NO");continue;}
ff=1;memcpy(tg,cg,sizeof(cg));memcpy(use,used,sizeof(used));
if(cg[c[i]]==a[i]) checkup(i);
else checkdown(i);
if(ff) {output();continue;}
}
else
{
for(int j=a[i]+1;j<b[i];++j) if(!used[j]) {cg[c[i]]=j;used[j]=1;break;}
if(cg[c[i]]>a[i] && cg[c[i]]<b[i]) {output();continue;}
if(!used[a[i]])
{
memcpy(tg,cg,sizeof(cg));memcpy