3 条题解

  • 3
    @ 2026-8-14 15:04:06
    #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
      @ 2026-8-20 11:26:23
      低调没啥好说的,数据太水了,体现不出我的优势

      思路分析

      把每个格子看成一根高度为 hi,jh_{i,j} 的柱子(初始都是 0)。整个建筑物的表面积可以拆成两部分来算:

      • 顶面和底面:只要这根柱子存在(hi,j>0h_{i,j}>0),就贡献 11(顶)+ 1+\ 1(底)=2= 2 的面积,且这个贡献只在柱子从 0 变为非 0 的那一瞬间产生一次,之后柱子继续增高不会再产生新的顶/底面积(原来的顶面被"顶上去"了,底面本来就没变过)。
      • 四个侧面:这是核心难点。每往柱子上加一层,这一层在每个方向(上、下、左、右)上是否"暴露"在外面,取决于这一层的高度和对应邻居柱子高度的相对关系
        • 如果这一层的高度 \le 邻居高度,说明这一层被邻居"挡住"了,这个方向不产生暴露面;
        • 如果这一层的高度 >> 邻居高度,说明这一层比邻居高,会暴露出来,产生 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
        @ 2026-8-14 15:04:06

        非常好理解

        判断放置的位置前后左右是否有方块([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
        上传者