金文彦成
(不干人事的学习委员)
1
@楼逸杨
《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。
1 个赞
陈之昊羽
(༺ཌༀཉི想养一只猫头鹰༃ༀད༻)
2
#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;
}
样例过了,有其他的吗?我再试试。我自己试试对了。
1 个赞
楼逸杨
(楼逸杨)
8
1 个赞
金文彦成
(不干人事的学习委员)
9
q<=100000,你这样做每次操作都是n*n级别的,大概率会爆。
1 个赞
陶荣杰1
(Chtholly)
19
不过这题没要求强制在线(还是太仁慈了,所以就是一个二维差分的裸板子了
1 个赞
陶荣杰1
(Chtholly)
20
#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的魔鬼输入输出记得用快读快写,我懒得打了(倒
2 个赞