记录编号 422291 评测结果 AAAAAAAAAAAAAAA
题目名称 [USACO Mar10]星牛争霸 最终得分 100
用户昵称 Gravatar泪寒之雪 是否通过 通过
代码语言 C++ 运行时间 0.324 s
提交时间 2017-07-09 14:49:25 内存使用 31.18 MiB
显示代码纯文本
#include<bits/stdc++.h>
#define N 2010
#define eps 1E-10
#define inf 1e10
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
int n,m=3,kk,v[N][6];
double a[N][N];
char s[10];
inline void add(int x,int y,int z){
	v[++n][0]=x;v[n][1]=y;v[n][2]=z;
}
void pivot(int x,int y){
	double d=a[x][y];
	a[x][y]=-1;
  fo(i,0,m-1) a[x][i]/=-d;
	fo(i,0,n) if (i!=x&&abs(a[i][y])>eps){
		double d=a[i][y];  a[i][y]=0;
		fo(j,0,m) a[i][j]+=d*a[x][j];
	}
}
double simplex(){
	int x,y;
	for(x=y=0;;x=y=0){
		fo(i,1,n)	if (a[i][0]<-eps) {x=i;break;} if (!x) break;
		fo(i,1,m)	if (a[x][i]> eps) y=i;
		pivot(x,y);
	}
	for(x=y=0;;x=y=0){
		fo(i,1,m) if (a[0][i]>eps){y=i;break;}
		if (!y) return a[0][0];
		double k=inf;
		fo(i,1,n) if (a[i][y]<-eps&&-a[i][0]/a[i][y]<k) k=-a[i][0]/a[i][y],x=i;
		if (!x) return inf;
		pivot(x,y);
	}
}
int main()
{
	freopen("starc.in","r",stdin);
	freopen("starc.out","w",stdout);
	scanf("%d%d",&n,&kk);
	for (int i=1;i<=n;i++){
		scanf("%s",s);  for (int j=0;j<m*2;j++) scanf("%d",&v[i][j]);
		fo(ll,0,m-1)	v[i][ll]=s[0]=='J'?v[i][ll]-v[i][ll+m]:v[i][ll+m]-v[i][ll];
	}
	add(100,-1,0); add(100,0,-1);
	add(-1,100,0); add(0,100,-1);
	add(-1,0,100); add(0,-1,100);
	while (kk--){
		int tt[6];
		fo(i,0,m*2-1) scanf("%d",&tt[i]); 
		fo(i,1,n) fo(j,0,m-1) a[i][j]=v[i][j];
		fo(i,0,m-1) a[0][i]=tt[i]-tt[i+m];
		if (simplex()<-eps){putchar('B');continue;}
		fo(i,1,n) fo(j,0,m-1) a[i][j]=v[i][j];
		fo(i,0,m-1) a[0][i]=tt[i+m]-tt[i];
		if (simplex()<-eps){putchar('J');continue;}
		putchar('U');
	}
	return 0;
}