3 条题解
-
3
#include<bits/stdc++.h> using namespace std; int my[1005][1005]; int xy[5]={-1,0,0,+1}; int yy[5]={0,+1,-1,0}; int main() { int n,m;//这道题没有用到判断出界 所以n,m没用到 int q; cin>>n>>m>>q; int sum=0; while(q--) { int x,y,z; cin>>x>>y>>z; // if(x>n||y>m||x<0||y<0) // { // cout<<sum<<endl; // continue; // }其实没用到 sum+=z*4;// 每个放置先直接加 后面再减去 if(my[x][y]==0&&z!=0)//此地没放并且放置非零个 { sum+=2; } my[x][y]+=z; for(int i=0;i<4;i++) { // if(x+xy[i]>n||y+yy[i]>m||x+xy[i]<0||y+yy[i]<0) // { // continue; // }依然没用到 int minn=min(my[x+xy[i]][y+yy[i]]-my[x][y]+z,z);//每次需要减去的就是前后左右与原来的高度差和放置个数的最小值 if(minn<=0) { continue; } sum-=minn*2;//然后因为每个加的时候都是直接加的四个面 所以减minn*2 } cout<<sum<<endl; } } -
1
低调
没啥好说的,数据太水了,体现不出我的优势
思路分析
把每个格子看成一根高度为 的柱子(初始都是 0)。整个建筑物的表面积可以拆成两部分来算:
- 顶面和底面:只要这根柱子存在(),就贡献 (顶)(底) 的面积,且这个贡献只在柱子从 0 变为非 0 的那一瞬间产生一次,之后柱子继续增高不会再产生新的顶/底面积(原来的顶面被"顶上去"了,底面本来就没变过)。
- 四个侧面:这是核心难点。每往柱子上加一层,这一层在每个方向(上、下、左、右)上是否"暴露"在外面,取决于这一层的高度和对应邻居柱子高度的相对关系:
- 如果这一层的高度 邻居高度,说明这一层被邻居"挡住"了,这个方向不产生暴露面;
- 如果这一层的高度 邻居高度,说明这一层比邻居高,会暴露出来,产生 1 单位暴露面。
分情况讨论+四面单独判断即可
代码实现
#include<bits/stdc++.h> using namespace std; int a[1005][1005],n,m,q,s,i,j,x; int main() { scanf("%d%d%d",&n,&m,&q); while(q--){ scanf("%d%d%d",&i,&j,&x); if(x==0){ printf("%d\n",s); continue; } if(a[i][j]==0)s+=2; if(a[i-1][j]<=a[i][j])s+=x; else if(a[i][j]+x<=a[i-1][j])s-=x; else s+=(x+a[i][j]-a[i-1][j])-(a[i-1][j]-a[i][j]); if(a[i+1][j]<=a[i][j])s+=x; else if(a[i][j]+x<=a[i+1][j])s-=x; else s+=(x+a[i][j]-a[i+1][j])-(a[i+1][j]-a[i][j]); if(a[i][j-1]<=a[i][j])s+=x; else if(a[i][j]+x<=a[i][j-1])s-=x; else s+=(x+a[i][j]-a[i][j-1])-(a[i][j-1]-a[i][j]); if(a[i][j+1]<=a[i][j])s+=x; else if(a[i][j]+x<=a[i][j+1])s-=x; else s+=(x+a[i][j]-a[i][j+1])-(a[i][j+1]-a[i][j]); a[i][j]+=x; printf("%d\n",s); } return 0; } -
0
非常好理解
判断放置的位置前后左右是否有方块([i+1,j]、[i-1,j]、[i,j+1]、[i,j-1])
if 有 : 面积--
else : 面积++
若当前位置没有放置过方块,加上上下的表面积(虽然我不知道为什么要加上底面积)
最后输出每次修改后的表面积即可
#include<bits/stdc++.h> #define int long long using namespace std; const int MAXN=1010; int m, n, q; int ini, inj, inx; int bu[MAXN][MAXN]; int sum; int bu_insert(int i,int j,int x); signed main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> m >> n; cin >> q; while(q--){ cin >> ini >> inj >> inx; sum+=bu_insert(ini, inj, inx); cout << sum << '\n'; } return 0; } int bu_insert(int i,int j,int x){ if(x==0)return 0; int change=0; if(bu[i][j]==0)change+=2; for(int p=1 ; p<=x ; p++){ bu[i][j]++; if(bu[i][j]<=bu[i+1][j]) change--; else change++; if(bu[i][j]<=bu[i][j+1]) change--; else change++; if(bu[i][j]<=bu[i-1][j]) change--; else change++; if(bu[i][j]<=bu[i][j-1]) change--; else change++; } return change; }
- 1
信息
- ID
- 1002
- 提交时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者
冀公网安备13098402000493号