Codeforces Round #382 (Div. 1), problem: (E) Chess Championship Solution in C/C++

#include<iostream>
#include<cstdio>
#include<algorithm>
#define N 3010
using namespace std;
int n,m,f[N][N];
struct ma{int x,y;}a[N];
bool operator<(ma p,ma q){return p.x>q.x;}
void get(int k)
{
	sort(a+k,a+n+1);
	int w=a[k].x;
	for(int i=n;i>k;i--)
	{
		if(w>1) w-=2,f[a[k].y][a[i].y]=1;
		else if(!w) a[i].x-=2,f[a[i].y][a[k].y]=1;
		else w--,a[i].x--,f[a[k].y][a[i].y]=f[a[i].y][a[k].y]=2;
	}
	a[k].x=0;
}
int main()
{
	cin>>n>>m;
	int x=0,sum=0;
	for(int i=1;i<=m;i++)
	{
		scanf("%d",&a[i].x);
		a[i].y=i;
		x+=2*(n-i);
		sum+=a[i].x;
		if(sum>x) return puts("no"),0;
	}
	for(int i=m+1;i<=n;i++)
	{
		a[i].y=i;
		x+=2*(n-i);
		a[i].x=min(a[i-1].x,x-sum);
		sum+=a[i].x;
	}
	if(sum!=x) return puts("no"),0;
	for(int i=1;i<n;i++) get(i);
	puts("yes");
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			if(i==j) putchar('X');
			else if(!f[i][j]) putchar('L');
			else if(f[i][j]==1) putchar('W');
			else putchar('D');
		}
		puts("");
	}
}

Leave a Reply

Your email address will not be published. Required fields are marked *