2 条题解

  • 0
    @ 2025-9-15 14:35:23

    c++ ac代码 二维转化成一维

    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    int a[1010][1010],b[1010][1010];//a数组存储原来数字 b数组用来存差分
    signed main(){
     int n,m,q;
     cin>>n>>m>>q;
     for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>a[i][j];
            if(j!=1)
            b[i][j]=a[i][j]-a[i][j-1];
            else {
            b[i][j]=a[i][j];//第一列就等于原本的
            }
        }
     }
     for(int k=1;k<=q;k++){
        int x1,y1,x2,y2,ans=0,d;
        cin>>x1>>y1>>x2>>y2>>d;
        
        for(int i=x1;i<=x2;i++){
            b[i][y1]+=d;//y1开始差分
            b[i][y2+1]-=d;//y2+1减去
        }
     }
     for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(j!=1){
                a[i][j]=a[i][j-1]+b[i][j];
                cout<<a[i][j]<<" ";
            }
            else {
                a[i][j]=b[i][j];
                cout<<a[i][j]<<" ";
            }
        }
        cout<<endl;
     }
    }
    

    然鹅这个代码还是一维的时间复杂度 数据太水了可以过去!!! 我们需要二维的根本差分

    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    int a[1050][1050],b[1050][1000];
    int n,m,q;
    signed main(){
    cin>>n>>m>>q;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>a[i][j];
        }
    }
    while(q--){
        int x1,x2,y1,y2,d;
        cin>>x1>>y1>>x2>>y2>>d;
        b[x1][y1]+=d;
        b[x2+1][y1]-=d;b[x1][y2+1]-=d;
        b[x2+1][y2+1]+=d;
        
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            b[i][j]+=b[i-1][j]+b[i][j-1]-b[i-1][j-1];
            cout<<b[i][j]+a[i][j]<<" ";
        }
        cout<<endl;
    }
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    }
    
    
    • 0
      @ 2025-5-8 22:00:36

      蓝桥云课 AC代码 JAVA

      import java.util.*;
      import java.util.StringTokenizer;
      import java.io.*;
      
      public class Main {
      
      	public static void main(String[] args) {
      		int n=in.nextInt();
      		int m=in.nextInt();
      		int q=in.nextInt();
      		int[][] arr=new int[n+10][m+10];
      		int[][] b=new int[n+10][m+10];
      		for(int i=1;i<=n;i++){
      			for(int j=1;j<=m;j++){
      				arr[i][j]=in.nextInt();
      				b[i][j]=arr[i][j]-arr[i-1][j]-arr[i][j-1]+arr[i-1][j-1];
      			}
      		}
      		while(q-->0){
      			int x1=in.nextInt(),y1=in.nextInt(),x2=in.nextInt(),y2=in.nextInt(),c=in.nextInt();
      			b[x1][y1]+=c;
      			b[x2+1][y1]-=c;
      			b[x1][y2+1]-=c;
      			b[x2+1][y2+1]+=c;
      		}
      		for(int i=1;i<=n;i++){
      			for(int j=1;j<=m;j++){
      				arr[i][j]=b[i][j]+arr[i][j-1]+arr[i-1][j]-arr[i-1][j-1];
      				out.print(arr[i][j]+" ");
      			}out.println();
      		}
      		out.close();
      	}
      	
      	
      
      	static FastReader in=new FastReader();
      	static PrintWriter out=new PrintWriter(System.out);
      	static class FastReader{
      		static BufferedReader br;
      		static StringTokenizer st;
      		FastReader(){
      			br=new BufferedReader(new InputStreamReader(System.in));
      		}
      		String next() {
      			String str="";
      			while(st==null||!st.hasMoreElements()) {
      				try {
      					str=br.readLine();
      				}catch(IOException e) {
      					throw new RuntimeException(e);
      				}
      				st=new StringTokenizer(str);
      			}
      			return st.nextToken();
      		}
      		int nextInt() {
      			return Integer.parseInt(next());
      		}
      		double nextDouble() {
      			return Double.parseDouble(next());
      		}
      		long nextLong() {
      			return Long.parseLong(next());
      		}
      	}
      	
      }
      
      
      • 1

      信息

      ID
      41
      时间
      1000ms
      内存
      256MiB
      难度
      2
      标签
      递交数
      51
      已通过
      31
      上传者