bzoj3208:花神的秒题计划I

Posted DUXT

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj3208:花神的秒题计划I相关的知识,希望对你有一定的参考价值。

思路:因为Q、S、B操作总和不超过100,因此怎么暴力怎么写。。。。当然记忆化搜索还是要的

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
#define maxn 705

const int lx[]={-1,0,1,0};
const int ly[]={0,-1,0,1};

int n,m;
int a[maxn][maxn],f[maxn][maxn];
bool can[maxn][maxn];
char s[10];

inline int read(){
	int x=0;char ch=getchar();
	for (;ch<‘0‘||ch>‘9‘;ch=getchar());
	for (;ch>=‘0‘&&ch<=‘9‘;ch=getchar()) x=x*10+ch-‘0‘;
	return x;
}

int dp(int x,int y){
	if (!can[x][y]) return -n*n;
	if (f[x][y]) return f[x][y];
	f[x][y]=1;
	for (int i=0;i<4;i++){
		int nx=x+lx[i],ny=y+ly[i];
		if (nx>0&&ny>0&&nx<=n&&ny<=n&&a[x][y]>a[nx][ny]) f[x][y]=max(f[x][y],dp(nx,ny)+1);
	}
	return f[x][y];
}

int main(){
	n=read();
	for (int i=1;i<=n;i++)	
		for (int j=1;j<=n;j++)
			a[i][j]=read();
	m=read();memset(can,1,sizeof(can));
	while (m--){
		scanf("%s",s+1);
		if (s[1]==‘C‘){int x=read(),y=read(),v=read();a[x][y]=v;}
		if (s[1]==‘S‘){
			int a=read(),b=read(),c=read(),d=read();
			for (int i=a;i<=c;i++)
				for (int j=b;j<=d;j++)
					can[i][j]=0;
		}
		if (s[1]==‘B‘){
			int a=read(),b=read(),c=read(),d=read();
			for (int i=a;i<=c;i++)
				for (int j=b;j<=d;j++)
					can[i][j]=1;
		}
		if (s[1]==‘Q‘){
			int ans=0;memset(f,0,sizeof(f));
			for (int i=1;i<=n;i++)
				for (int j=1;j<=n;j++)
					ans=max(ans,dp(i,j));
			printf("%d\n",ans);
		}
	}
	return 0;
}

 

以上是关于bzoj3208:花神的秒题计划I的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ 3208: 花神的秒题计划Ⅰ

bzoj3208花神的秒题计划Ⅰ

BZOJ3207花神的嘲讽计划I 可持久化线段树/莫队

BZOJ3207花神的嘲讽计划Ⅰ Hash+主席树

BZOJ_3207_花神的嘲讽计划Ⅰ_哈希+主席树

BZOJ3207 花神的嘲讽计划Ⅰ