比赛 20120705 评测结果 C
题目名称 绘画 最终得分 0
用户昵称 Czb。 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2012-07-05 11:59:53
显示代码纯文本
#include<stdio.h>
#include<vector>
#include<set>

using namespace std;

struct orz
{
	char c;
	int x1,x2,y1,y2,k,last;
}a[100001];

int n,m,ans[1001][1001];

char str[10];

vector <int> Save;

set <int> s[1001];

set <int> :: iterator it,tmp;

void dfs(int k)
{
	if(k<=0)
	{
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=n;j++)
			{
				printf("%d ",ans[i][j]);
			}
			printf("\n");
		}
		exit(0);
	}
	if(a[k].c=='P')
	{
		for(int ii=a[k].x1;ii<=a[k].x2;ii++)
		{
			for(it=s[ii].lower_bound(a[k].y1);it!=s[ii].end();it++)
			{
				if(*it>a[k].y2)break;
				if((ii+*it-a[k].x1-a[k].y1)%2==0)
				{
					ans[ii][*it]=a[k].k;
					tmp=it;it--;s[ii].erase(tmp);
				}
			}
		}
		dfs(k-1);
	}
	else if(a[k].c=='S')
	{
		dfs(k-1);
	}
	else
	{
		dfs(Save[a[k].last-1]-1);
	}
}

int main()
{
	freopen("drawing.in","r",stdin);
	freopen("drawing.out","w",stdout);
	int i,j;
	scanf("%d%d%d\n",&n,&i,&m);
	//if(n*n*m<=)
	for(i=1;i<=m;i++)
	{
		scanf("%s",str);
		if(str[0]=='P')
		{
			a[i].c='P';
			scanf("%d%d%d%d%d",&a[i].k,&a[i].x1,&a[i].y1,&a[i].x2,&a[i].y2);
			a[i].x1++;a[i].x2++;a[i].y1++;a[i].y2++;
		}
		else if(str[0]=='S')
		{
			a[i].c='S';
			Save.push_back(i);
		}
		else
		{
			a[i].c='L';
			scanf("%d",&a[i].last);
		}
		scanf("\n");
	}
	for(i=1;i<=n;i++)
	{
		s[i].insert(-1);
		for(j=1;j<=n;j++)
		{
			ans[i][j]=1;
			s[i].insert(j);
		}
	}
	dfs(m);
	return 0;
}