闲的没事,出了道题

@linan04129

《701班之军训》

题目背景:

自Dan的香脚事件后,701班的同学迎来了军训,很不幸Dan被选作了纪律委员,他负责来执行教官的转体训练命令。

题目描述 :

701班的同学排成了一个n行m列的矩阵,每个同学都有一个状态。
当a[i][j]=1,代表该同学朝前。
当a[i][j]=2,代表该同学朝左。
当a[i][j]=3,代表该同学朝后。
当a[i][j]=4,代表该同学朝右。
每个同学初始状态都是1。
共q 次询问,每次输入五个数:x1,y1,x2,y2,dire。
对以a[x1][y1]为左上角,a[x2][y2]为右下角的矩阵执行转体命令。
当dire=1,代表矩阵内的同学向左转。
当dire=2,代表矩阵内的同学向右转。
当dire=3,代表矩阵内的同学向后转。
保证不出现其他情况。

输入格式:

第一行三个整数:n,m,q。后面q行,每行五个整数:x1,y1,x2,y2,dire。

输出格式:

一个n行m列的矩阵,表示目前所有同学各自的状态。

输入样例:

5 5 2
1 1 4 4 2
3 3 5 5 1

输出示例:

4 4 4 4 1
4 4 4 4 1
4 4 1 1 2
4 4 1 1 2
1 1 2 2 2

数据范围:

0<n,m≤2000,0<q≤100000。

#include<bits/stdc++.h>
using namespace std;
int n,m,q;
int mapn[2005][2005];
int main(){
	cin>>n>>m>>q;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			mapn[i][j]=1;
		}
	}
	while(q--){
		int x1,y1,x2,y2,dire;
		cin>>x1>>y1>>x2>>y2>>dire;
		for(int i=x1;i<=x2;i++){
			for(int j=y1;j<=y2;j++){
				if(dire==1)mapn[i][j]+=1;
				else if(dire==2)mapn[i][j]+=3;
				else mapn[i][j]+=2;
				if(mapn[i][j]>4)mapn[i][j]%=4;
			}
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cout<<mapn[i][j]<<" ";
		}
		cout<<endl;
	}
	return 0;
}

样例过了,有其他的吗?我再试试。我自己试试对了。

@金文彦成

不,我什么时候成为记录委员了?标兵 @金文彦成

??何出此言?

我乃Dan

所以 @金文彦成 我这样对不对

他应该不上线
来晒你的桌面 - 常规 - 信友队论坛 (xinyoudui.com)
你也晒一个

q<=100000,你这样做每次操作都是n*n级别的,大概率会爆。

那还有什么方法?

你居然会上线

(帖子已被作者删除)

差分(应该吧)

你不会骗我说是自创题目,实则是模拟卷上的吧

怎么可能

bu xing

再见 睡了啊。

二维线段树(doge

1 个赞

不过这题没要求强制在线(还是太仁慈了,所以就是一个二维差分的裸板子了

1 个赞
#include<bits/stdc++.h>
using namespace std;
const int N=2005;
int a[N][N];
int n,m,q;
int fun(int p){
	if(p==1) return 1;
	else if(p==2) return 3;
	else return 2; 
}
int main(){
	cin>>n>>m>>q;
	while(q--){
		int op,x1,x2,y1,y2;
		cin>>x1>>y1>>x2>>y2>>op;
		a[x1][y1]+=fun(op);a[x2+1][y2+1]+=fun(op);
		a[x1][y2+1]-=fun(op);a[x2+1][y1]-=fun(op);
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			a[i][j]+=(a[i-1][j]+a[i][j-1]-a[i-1][j-1]);
			cout<<a[i][j]%4+1<<" ";	
		}
		cout<<endl;
	}
	return 0;
} 

样例过了应该没什么问题了,还有就是1e6的魔鬼输入输出记得用快读快写,我懒得打了(倒

1 个赞