1. 程式人生 > >【CF套題】Codeforces Round #528 (Div. 1)

【CF套題】Codeforces Round #528 (Div. 1)

【前言】
並不能打div2的我十分絕望。
雖然上分了還是很高興。

【題目】
原題地址

A.Connect Three

將三個格子按 x x 排序後,中間那個格子向上下擴充套件,兩邊的格子再向中間連即可。

#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

邊權在葉子的父邊處貢獻一定優於其他邊,因此將邊權平均分配給每個葉子的父邊即可。設葉子數為 x x ,則答案就是 2 S n \frac {2S} n

#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

考慮 A A B B 第一個不同的位置,那麼在這之前 S S 的置換一定是唯一確定的。在這之後,我們可以考慮 S S 是貼著上邊界還是貼著下邊界,或可以不貼著邊界(即直接滿足答案)。然後分情況討論即可,細節比較多。

#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