文章同时发表于:洛谷(GWBailang的Bolg),微信公众号(万物皆可编程)。
题目意思:
有一张图片,图片被分成了n*m
个点,每个点都对应R,G,B
三个值,初始时所有点都为(0,0,0)
。
现在有q
次操作,对于每次操作如下:
输入i,j,t,c
i和j分别代表要操作的点的横坐标和竖坐标。
t代表要要改这个点的R/G/B(分别是1,2,3)
c代表这个点的R/G/B的值要加c,超过255就%256
每次更改完以后输出这张图片是否对称。
方法:
这是一道超水的题!
很明显这是一道暴力的题目
每次输入,改变,判断就可以了
最大的数据: n<=100 m<=100 q<=500
而我们判断是否对称的复杂度是O(q*n*m/2)
,暴力是不会TLE的!
上代码:
不懂看注释
#include<bits/stdc++.h>//万能头文件
using namespace std;
struct Node{
int r=0,g=0,b=0;//R,G,B
}a[105][105];//每个点
int main(){
int n,m,q;
cin>>n>>m>>q;//输入
long long x,y,t,c;//坐标和要改变的值
while(q--){//循环q次
cin>>x>>y>>t>>c;//输入
c%=256;//后面要对256取模,所以这里可以先对c取模,否则可能int装不下
if(t==1){//R
a[x][y].r+=c;
a[x][y].r%=256;//不要忘了对256取模
//不能直接在这里判断两个点是否相同
//因为如果上次加完就不对称,这次那个点还有可能是不对称的
}
if(t==2){//G,操作同上
a[x][y].g+=c;
a[x][y].g%=256;
}
if(t==3){//B,操作同上
a[x][y].b+=c;
a[x][y].b%=256;
}
int sf=0;//用于记录是否对称
//这里我习惯用int,0代表对称,1代表不对称
for(int i=1;i<=n;i++){//n行
for(int j=1;j<=m/2;j++){//要判断左右对称,只用到m/2列即可,+1可以但是没必要
//如果是奇数列,不用管中间那列,懂的都懂呵呵
//如果是偶数列,每个点都会被看一遍的
if(a[i][j].r!=a[i][m-j+1].r){//R
//m-j+1列,题目说过了,只不过后来出题人好像有把这句话给删了
sf++;
break;//不对称就可以不用再往下找了
}
if(a[i][j].g!=a[i][m-j+1].g){//G,同上
sf++;
break;
}
if(a[i][j].b!=a[i][m-j+1].b){//B,同上
sf++;
break;
}
}
}
if(sf)cout<<"No"<<endl;//如果sf不是0,就说明不对称,输出NO
else cout<<"Yes"<<endl;//否则输出Yes
//注意大小写,不要输出错了!
}
return 0;
}
本蒟蒻第一次写题解,点个赞再走吧~