2010 ACM-ICPC世界总决赛试题分析1-3

1

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<string>
#include<iostream>
#include<map>
using namespace std;
const int MAXN=10010;
struct Tmatrix
{
	int n,m,k,f,d;
	int a[MAXN];
	int &get(int i,int j,int k1)
	{
		return a[i*m*k+j*k+k1];
	}
};

int n,m;
map<string,int> hash1;
Tmatrix a[100];
string b[100];
void init()
{
	hash1.clear();
	m=0;
}

int getNum(string &s)
{
	if(hash1[s]==0)
		hash1[s]=++m;
	return hash1[s];
}

void readln()
{
	n=0;
	char c=' ';
	while(c==' ')
	{
		cin>>b[++n];
		c=getchar();
	}
}

void deal(int &l,int &r)
{
	int i,t;
	while(1)
	{
		if(b[l]!="(" || b[r]!=")")
			return;
		t=0;
		for(i=l;i<=r;++i)
			if(b[i]=="(")
				++t;
			else if(b[i]==")")
				--t;
			else if(t==0)
				return;
		++l;
		--r;
	}
}

bool isNum(string &s)
{
	int i,l=s.size();
	for(i=0;i<l;++i)
		if(s[i]<'0'||s[i]>'9')
			return false;
	return true;
}

int strToNum(string &s)
{
	int i,l=s.size();
	int t=0;
	for(i=0;i<l;++i)
		t=t*10+s[i]-'0';
	return t;
}

bool isAllNum(int l,int r)
{
	for(int i=l;i<=r;++i)
		if(!isNum(b[i]))
			return false;
	return true;
}

Tmatrix operator + (Tmatrix m1,Tmatrix m2)
{
	if(m1.f>0)
		m1=a[m1.f];
	if(m2.f>0)
		m2=a[m2.f];
	Tmatrix tmp=m1;
	int i,j,k;
	if(m2.n*m2.m*m2.k==1)
	{
		for(i=0;i<m1.n;++i)
			for(j=0;j<m1.m;++j)
				for(k=0;k<m1.k;++k)
					tmp.get(i,j,k)+=m2.get(0,0,0);
	}
	else if(m1.n*m1.m*m1.k==1)
	{
		tmp=m2;
		for(i=0;i<m2.n;++i)
			for(j=0;j<m2.m;++j)
				for(k=0;k<m2.k;++k)
					tmp.get(i,j,k)+=m1.get(0,0,0);
	}
	else
	{
		for(i=0;i<m1.n;++i)
			for(j=0;j<m1.m;++j)
				for(k=0;k<m1.k;++k)
					tmp.get(i,j,k)+=m2.get(i,j,k);
	}
	return tmp;
}

Tmatrix operator - (Tmatrix m1,Tmatrix m2)
{
	if(m1.f>0)
		m1=a[m1.f];
	if(m2.f>0)
		m2=a[m2.f];
	Tmatrix tmp=m1;
	int i,j,k;
	if(m2.n*m2.m*m2.k==1)
	{
		for(i=0;i<m1.n;++i)
			for(j=0;j<m1.m;++j)
				for(k=0;k<m1.k;++k)
					tmp.get(i,j,k)-=m2.get(0,0,0);
	}
	else if(m1.n*m1.m*m1.k==1)
	{
		tmp=m2;
		for(i=0;i<m2.n;++i)
			for(j=0;j<m2.m;++j)
				for(k=0;k<m2.k;++k)
					tmp.get(i,j,k)=m1.get(0,0,0)-tmp.get(i,j,k);
	}
	else
	{
		for(i=0;i<m1.n;++i)
			for(j=0;j<m1.m;++j)
				for(k=0;k<m1.k;++k)
					tmp.get(i,j,k)-=m2.get(i,j,k);
	}
	return tmp;
}

Tmatrix operator * (Tmatrix m1,Tmatrix m2)
{
	if(m1.f>0)
		m1=a[m1.f];
	if(m2.f>0)
		m2=a[m2.f];
	Tmatrix tmp=m1;
	int i,j,k;
	if(m2.n*m2.m*m2.k==1)
	{
		for(i=0;i<m1.n;++i)
			for(j=0;j<m1.m;++j)
				for(k=0;k<m1.k;++k)
					tmp.get(i,j,k)*=m2.get(0,0,0);
	}
	else if(m1.n*m1.m*m1.k==1)
	{
		tmp=m2;
		for(i=0;i<m2.n;++i)
			for(j=0;j<m2.m;++j)
				for(k=0;k<m2.k;++k)
					tmp.get(i,j,k)*=m1.get(0,0,0);
	}
	else
	{
		for(i=0;i<m1.n;++i)
			for(j=0;j<m1.m;++j)
				for(k=0;k<m1.k;++k)
					tmp.get(i,j,k)*=m2.get(i,j,k);
	}
	return tmp;
}

Tmatrix rho(Tmatrix m1,Tmatrix m2)
{
	if(m1.f>0)
		m1=a[m1.f];
	if(m2.f>0)
		m2=a[m2.f];
	Tmatrix tmp;
	tmp.f=0;
	tmp.n=m1.get(0,0,0);
	tmp.m=m1.get(1,0,0);
	tmp.k=m1.get(2,0,0);
	if(m1.n<3)
		tmp.k=1;
	if(m1.n<2)
		tmp.m=1;
	tmp.d=m1.n;
	int i,j,k,l=0;
	for(i=0;i<tmp.n;++i)
		for(j=0;j<tmp.m;++j)
			for(k=0;k<tmp.k;++k)
			{
				tmp.get(i,j,k)=m2.get(l,0,0);
				l=(l+1)%m2.n;
			}
	return tmp;
}

Tmatrix iota(Tmatrix m1)
{
	if(m1.f>0)
		m1=a[m1.f];
	Tmatrix tmp;
	tmp.f=0;
	tmp.n=m1.get(0,0,0);
	tmp.m=1;
	tmp.k=1;
	tmp.d=1;
	for(int i=0;i<tmp.n;++i)
		tmp.get(i,0,0)=i+1;
	return tmp;
}

Tmatrix drop(Tmatrix m1,Tmatrix m2)
{
	if(m1.f>0)
		m1=a[m1.f];
	if(m2.f>0)
		m2=a[m2.f];
	Tmatrix tmp=m2;
	tmp.f=0;
	int i,j,k;
	tmp.n-=m1.get(0,0,0);
	for(i=0;i<m2.n-m1.get(0,0,0);++i)
		for(j=0;j<m2.m;++j)
			for(k=0;k<m2.k;++k)
				tmp.get(i,j,k)=tmp.get(i+m1.get(0,0,0),j,k);
	return tmp;
}

Tmatrix op1(Tmatrix m1)
{
	if(m1.f>0)
		m1=a[m1.f];
	Tmatrix tmp=m1;
	if(tmp.d>1)
		--tmp.d;
	int i,j,k;
	if(m1.d==3)
	{
		tmp.k=1;
		for(i=0;i<m1.n;++i)
			for(j=0;j<m1.m;++j)
			{
				tmp.get(i,j,0)=m1.get(i,j,m1.k-1);
				for(k=m1.k-2;k>=0;--k)
					tmp.get(i,j,0)=m1.get(i,j,k)+tmp.get(i,j,0);
			}
	}
	else if(m1.d==2)
	{
		tmp.m=1;
		for(i=0;i<m1.n;++i)
		{
			tmp.get(i,0,0)=m1.get(i,m1.m-1,0);
			for(k=m1.m-2;k>=0;--k)
				tmp.get(i,0,0)=m1.get(i,k,0)+tmp.get(i,0,0);
		}
	}
	else
	{
		tmp.n=1;
		{
			tmp.get(0,0,0)=m1.get(m1.n-1,0,0);
			for(k=m1.n-2;k>=0;--k)
				tmp.get(0,0,0)=m1.get(k,0,0)+tmp.get(0,0,0);
		}
	}
	return tmp;
}

Tmatrix op2(Tmatrix m1)
{
	if(m1.f>0)
		m1=a[m1.f];
	Tmatrix tmp=m1;
	if(tmp.d>1)
		--tmp.d;
	int i,j,k;
	if(m1.d==3)
	{
		tmp.k=1;
		for(i=0;i<m1.n;++i)
			for(j=0;j<m1.m;++j)
			{
				tmp.get(i,j,0)=m1.get(i,j,m1.k-1);
				for(k=m1.k-2;k>=0;--k)
					tmp.get(i,j,0)=m1.get(i,j,k)-tmp.get(i,j,0);
			}
	}
	else if(m1.d==2)
	{
		tmp.m=1;
		for(i=0;i<m1.n;++i)
		{
			tmp.get(i,0,0)=m1.get(i,m1.m-1,0);
			for(k=m1.m-2;k>=0;--k)
				tmp.get(i,0,0)=m1.get(i,k,0)-tmp.get(i,0,0);
		}
	}
	else
	{
		tmp.n=1;
		{
			tmp.get(0,0,0)=m1.get(m1.n-1,0,0);
			for(k=m1.n-2;k>=0;--k)
				tmp.get(0,0,0)=m1.get(k,0,0)-tmp.get(0,0,0);
		}
	}
	return tmp;
}

Tmatrix op3(Tmatrix m1)
{
	if(m1.f>0)
		m1=a[m1.f];
	Tmatrix tmp=m1;
	if(tmp.d>1)
		--tmp.d;
	int i,j,k;
	if(m1.d==3)
	{
		tmp.k=1;
		for(i=0;i<m1.n;++i)
			for(j=0;j<m1.m;++j)
			{
				tmp.get(i,j,0)=m1.get(i,j,m1.k-1);
				for(k=m1.k-2;k>=0;--k)
					tmp.get(i,j,0)=m1.get(i,j,k)*tmp.get(i,j,0);
			}
	}
	else if(m1.d==2)
	{
		tmp.m=1;
		for(i=0;i<m1.n;++i)
		{
			tmp.get(i,0,0)=m1.get(i,m1.m-1,0);
			for(k=m1.m-2;k>=0;--k)
				tmp.get(i,0,0)=m1.get(i,k,0)*tmp.get(i,0,0);
		}
	}
	else
	{
		tmp.n=1;
		{
			tmp.get(0,0,0)=m1.get(m1.n-1,0,0);
			for(k=m1.n-2;k>=0;--k)
				tmp.get(0,0,0)=m1.get(k,0,0)*tmp.get(0,0,0);
		}
	}
	return tmp;
}



Tmatrix calc(int l,int r)
{
	deal(l,r);
	int i,j,t=0;
	Tmatrix tmp;
	if(isAllNum(l,r))
	{
		tmp.n=tmp.f=0;
		tmp.m=tmp.k=tmp.d=1;
		for(i=l;i<=r;i++)
			tmp.get(tmp.n++,0,0)=strToNum(b[i]);
		return tmp;
	}
	if(l==r)
	{
		tmp.f=getNum(b[l]);
		return tmp;
	}
	j=-1;
	for(i=l;i<=r;++i)
		if(b[i]==")")
			++t;
		else if(b[i]=="(")
			--t;
		else if(t==0&&(i>l)&&
			(b[i]=="+" || b[i]=="-"
			||b[i]=="*"||b[i]=="="
			||b[i]=="iota"||b[i]=="drop"
			||b[i]=="rho"))
		{
			j=i;
			break;
		}
		Tmatrix m1,m2;
		if(b[l]=="iota")
		{
			m1=calc(l+1,r);
			return iota(m1);
		}
		if(b[l+1]=="/")
		{
			m1=calc(l+2,r);
			if(b[l]=="+")
				return op1(m1);
			if(b[l]=="-")
				return op2(m1);
			if(b[l]=="*")
				return op3(m1);
		}
		if(b[j]=="+")
		{
			m2=calc(j+1,r);
			if(m2.f>0)
				m2=a[m2.f];
			m1=calc(l,j-1);
			return m1+m2;
		}
		if(b[j]=="-")
		{
			m2=calc(j+1,r);
			if(m2.f>0)
				m2=a[m2.f];
			m1=calc(l,j-1);
			return m1-m2;
		}
		if(b[j]=="*")
		{
			m2=calc(j+1,r);
			if(m2.f>0)
				m2=a[m2.f];
			m1=calc(l,j-1);
			return m1*m2;
		}
		if(b[j]=="=")
		{
			m2=calc(j+1,r);
			m1=calc(l,j-1);
			a[m1.f]=m2;
			return m2;
		}
		if(b[j]=="rho")
		{
			m2=calc(j+1,r);
			if(m2.f>0)
				m2=a[m2.f];
			m1=calc(l,j-1);
			return rho(m1,m2);
		}
		if(b[j]=="drop")
		{
			m2=calc(j+1,r);
			if(m2.f>0)
				m2=a[m2.f];
			m1=calc(l,j-1);
			return drop(m1,m2);
		}
}

void solve()
{
	int CASE=0;
	readln();
	int i,j,k;
	Tmatrix tmp;
	while(b[1]!="#")
	{
		cout<<"Case "<<(++CASE)<<":";
		for(i=1;i<=n;++i)
			cout<<" "<<b[i];
		cout<<endl;
		tmp=calc(1,n);
		if(tmp.f>0)
			tmp=a[tmp.f];
		if(tmp.d==3)
		{
			for(j=0;j<tmp.m;++j)
			{
				for(k=0;k<tmp.k;++k)
					cout<<" "<<tmp.get(0,j,k);
				cout<<endl;
			}
			for(i=1;i<tmp.n;++i)
			{
				cout<<endl;
				for(j=0;j<tmp.m;++j)
				{
					for(k=0;k<tmp.k;++k)
						cout<<" "<<tmp.get(i,j,k);
					cout<<endl;
				}
			}
		}
		else if(tmp.d==2)
		{
			for(j=0;j<tmp.n;++j)
			{
				for(k=0;k<tmp.m;++k)
					cout<<" "<<tmp.get(j,k,0);
				cout<<endl;
			}
		}
		else
		{
			for(k=0;k<tmp.n;++k)
				cout<<" "<<tmp.get(k,0,0);
			cout<<endl;
		}
		//fupdate(stdout);
		readln();
	}
}

int main()
{
	init();
	solve();
	return 0;
}



2

#include<stdio.h>
#include<string.h>
#include<stdio.h>
const int MAXN=210;
const int MAXM=310;
int n,m;
double w;
int a[MAXN];
int b[MAXN];
int c[MAXN];
double abs(double x)
{
	return x<0?-x:x;
}
void init()
{
	for(int i=1;i<=n;++i)
		scanf("%d",a+i);
}

bool CheckWide(double w)
{
	for(int i=1;i<=n;++i)
		if(abs(a[i]-w)*20<=w+1e-6)
			b[i]=0;
		else if(abs(a[i]-w*2)*10<=w+1e-6)
			b[i]=1;
		else
			return false;
	return true;
}

bool check()
{
	int i;
	for(i=6;i<=n;i+=6)
		if(b[i]!=0)
			return false;
	for(i=1;i<=n;i+=6)
	{
		if(b[i]==0&&b[i+1]==0&&b[i+2]==0&&b[i+3]==0&&b[i+4]==1)
			c[i/6+1]=0;
		else if(b[i]==1&&b[i+1]==0&&b[i+2]==0&&b[i+3]==0&&b[i+4]==1)
			c[i/6+1]=1;
		else if(b[i]==0&&b[i+1]==1&&b[i+2]==0&&b[i+3]==0&&b[i+4]==1)
			c[i/6+1]=2;
		else if(b[i]==1&&b[i+1]==1&&b[i+2]==0&&b[i+3]==0&&b[i+4]==0)
			c[i/6+1]=3;
		else if(b[i]==0&&b[i+1]==0&&b[i+2]==1&&b[i+3]==0&&b[i+4]==1)
			c[i/6+1]=4;
		else if(b[i]==1&&b[i+1]==0&&b[i+2]==1&&b[i+3]==0&&b[i+4]==0)
			c[i/6+1]=5;
		else if(b[i]==0&&b[i+1]==1&&b[i+2]==1&&b[i+3]==0&&b[i+4]==0)
			c[i/6+1]=6;
		else if(b[i]==0&&b[i+1]==0&&b[i+2]==0&&b[i+3]==1&&b[i+4]==1)
			c[i/6+1]=7;
		else if(b[i]==1&&b[i+1]==0&&b[i+2]==0&&b[i+3]==1&&b[i+4]==0)
			c[i/6+1]=8;
		else if(b[i]==1&&b[i+1]==0&&b[i+2]==0&&b[i+3]==0&&b[i+4]==0)
			c[i/6+1]=9;
		else if(b[i]==0&&b[i+1]==0&&b[i+2]==1&&b[i+3]==0&&b[i+4]==0)
			c[i/6+1]=10;
		else if(b[i]==0&&b[i+1]==0&&b[i+2]==1&&b[i+3]==1&&b[i+4]==0)
			c[i/6+1]=11;
		else
			return false;
	}
	if(c[1]!=11||c[m]!=11)
		return false;
	int C=0,K=0;
	int nn=m-4;
	for(i=1;i<=nn;++i)
		C=(C+((nn-i)%10+1)*c[i+1])%11;
	if(C!=c[m-2])
	{
		printf("bad C\n");
		return true;
	}
	for(i=1;i<=nn+1;++i)
		K=(K+((nn-i+1)%9+1)*c[i+1])%11;
	if(K!=c[m-1])
	{
		printf("bad K\n");
		return true;
	}
	for(i=2;i<=nn+1;++i)
	{
		if(c[i]<10)
			printf("%d",c[i]);
		else
			printf("-");
	}
	printf("\n");
	return true;
}

void solve()
{
	int i,j;
	if(n%6!=5)
	{
		printf("bad code\n");
		return;
	}
	m=n/6+1;
	if(m<4)
	{
		printf("bad cold\n");
		return;
	}
	j=1;
	for(i=1;i<=n;++i)
	{
		w=a[i];
		if(CheckWide(w))
		{
			j=0;
			break;
		}
		w=a[i]/0.95;
		if(CheckWide(w))
		{
			j=0;
			break;
		}
		w=a[i]/1.05;
		if(CheckWide(w))
		{
			j=0;
			break;
		}
	}
	if(j)
	{
		printf("bad code\n");
		return;
	}
	if(check())
		return;
	for(i=1;i*2<=n;++i)
	{
		j=b[i];
		b[i]=b[n+1-i];
		b[n+1-i]=j;
	}
	if(!check())
	{
		printf("bad code\n");
	}
}

int main()
{
	int CASE=0;
	while((scanf("%d",&n)!=EOF)&&n)
	{
		init();
		printf("Case %d: ",++CASE);
		solve();
	}
	return 0;
}

3

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
const int MAXN=2010;
struct Twall
{
	int x1,x2,y;
};
int n,m,w,n1,m1;
Twall a[MAXN];
int lx[MAXN*2];
long long ans;
bool f[MAXN];
bool g[MAXN];

void init()
{
	int i;
	ans=(long long) n*m;
	n1=0;
	for(i=1;i<=w;++i)
	{
		scanf("%ld %ld %ld %ld",&a[i].x1,&a[i].y,&a[i].x2,&a[i].y);
		++a[i].x2;
		ans-=a[i].x2-a[i].x1;
		lx[++n1]=a[i].x1;
		lx[++n1]=a[i].x2;
	}
	lx[++n1]=0;
	lx[++n1]=n;
}

void discrete(int a[],int &len)
{
	sort(a+1,a+1+len);
	int i,j=1;
	for(i=2;i<=len;++i)
		if(a[j]!=a[i])
			a[++j]=a[i];
	len=j;
}

int bin(int a[],int len,int k)
{
	int l=1;
	int r=len;
	int m;
	while(l<r)
	{
		m=(l+r)>>1;
		if(a[m]==k)
			return m;
		else if(a[m]>k)
			r=m-1;
		else
			l=m+1;
	}
	return -1;
}

bool cmp_Twall(Twall a,Twall b)
{
	if(a.y==b.y)
		return a.x2>b.x2;
	else
		a.y>b.y;
}

void deal_f(int k)
{
	int i;
	long long t=0;
	for(i=1;i<n1;++i)
		if(f[i])
			t+=lx[i+1]-lx[i];
	ans-=(long long )t*k;
}



void solve()
{
	discrete(lx,n1);
	int i,j;
	for(i=1;i<=w;++i)
	{
		a[i].x1=bin(lx,n1,a[i].x1);
		a[i].x2=bin(lx,n1,a[i].x2);
	}
	sort(a+1,a+w+1,cmp_Twall);
	int last=m;
	memset(f,0,sizeof(f));
	f[n1-1]=true;
	int st=1,ed;
	while(st<=w)
	{
		ed=st;
		while((ed<w)&&(a[ed+1].y==a[ed].y))
			++ed;
		if(a[st].y!=last-1)
		{
			for(i=n1-2;i>=1;--i)
				f[i]=f[i]||f[i+1];
			deal_f(last-a[st].y-1);
		}
		memset(g,true,sizeof(g));
		for(i=st;i<=ed;++i)
			for(j=a[i].x1;j<a[i].x2;++j)
				g[j]=false;
		f[n1-1]=f[n1-1]&&g[n1-1];
		for(i=n1-2;i>=1;--i)
			f[i]=g[i]&&(f[i]||f[i+1]);
		deal_f(1);
		last=a[st].y;
		st=ed+1;
	}
	for(i=n1-2;i>=1;--i)
		f[i]=f[i]||f[i+1];
	deal_f(last);
	printf("%lld\n",ans);
}

int main()
{
	int CASE=0;
	while((scanf("%ld %ld %ld",&m,&n,&w)!=EOF)&&(n||m))
	{
		init();
		printf("Case %ld: ",++CASE);
		solve();
	}
	return 0;
}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值