头像

vanilla




离线:2021-09-28 01:31


最近来访(1)
用户头像
手撕蓝莓酥


vanilla
2019-05-26 13:48

题目描述

输入一个n行m列的整数矩阵,再输入q个操作,每个操作包含五个整数x1, y1, x2, y2, c,其中(x1, y1)和(x2, y2)表示一个子矩阵的左上角坐标和右下角坐标。

每个操作都要将选中的子矩阵中的每个元素的值加上c。

请你将进行完所有操作后的矩阵输出。

输入格式
第一行包含整数n,m,q。

接下来n行,每行包含m个整数,表示整数矩阵。

接下来q行,每行包含5个整数x1, y1, x2, y2, c,表示一个操作。

输出格式
共 n 行,每行 m 个整数,表示所有操作进行完毕后的最终矩阵。

数据范围
1≤n,m≤1000,
1≤q≤100000,
1≤x1≤x2≤n,
1≤y1≤y2≤m,
−1000≤c≤1000,
−1000≤矩阵内元素的值≤1000

样例

输入样例:
3 4 3
1 2 2 1
3 2 2 1
1 1 1 1
1 1 2 2 1
1 3 2 3 2
3 1 3 4 1
输出样例:
2 3 4 1
4 3 4 1
2 2 2 2

矩阵差分模板题,先矩阵差分,最后进行前缀和计算,得到原矩阵值

1.jpg

C++ 代码

#include<iostream>
#include<cstdio>
using namespace std;
const int MAX_N = 1e3+5;
int a[MAX_N][MAX_N] = {0};
int s[MAX_N][MAX_N] = {0};
void insert(int x1,int y1,int x2,int y2,int v){
    a[x1][y1] += v;
    a[x2+1][y1] -= v;
    a[x1][y2+1] -= v;
    a[x2+1][y2+1] += v; //多减一次,加v进行抵消操作
}
int main(){
    int n,m,q;
    scanf("%d%d%d",&n,&m,&q);
    for(int i = 1; i <= n; i++){
        for(int j = 1;j <= m; j++){
            int t;
            scanf("%d",&t);
            insert(i,j,i,j,t);
        }
    }
    while(q--){
        int x1,y1,x2,y2,t;
        scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&t);
        insert(x1,y1,x2,y2,t);
    }
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= m; j++){
            s[i][j] = s[i-1][j] + s[i][j-1] - s[i-1][j-1] + a[i][j];
            printf("%d",s[i][j]);
            if(j != m)
                printf(" ");
        }
        if(i!= n)
            printf("\n");
    }
    return 0;
}


活动打卡代码 AcWing 91. 最短Hamilton路径

vanilla
2019-05-07 15:30
#include<bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
const int MAX_N = 21;
int temp[MAX_N][MAX_N] = {0};
int dp[1<<MAX_N][MAX_N];
int main(){
    memset(dp,inf,sizeof(dp));
    int n;
    scanf("%d",&n);
    for(int i = 0 ;i  < n; i++)
        for(int j = 0; j < n; j++)
            scanf("%d",&temp[i][j]);

    dp[1][0] = 0;
    for(int i = 1; i <(1<< n); i++){
        for(int j = 0; j < n; j++){
            if((i>>j & 1)){
                for(int k = 0; k < n; k++){
                    if((i^(1<<j))>>k & 1)
                    dp[i][j] = min(dp[i][j],dp[i^(1<<j)][k] + temp[k][j]);
                }
            }
        }
    }
    printf("%d\n",dp[(1<<n)-1][n-1]);
    return 0;
}



活动打卡代码 AcWing 90. 64位整数乘法

vanilla
2019-05-06 16:55
#include<iostream>
#include<cstdio>
using namespace std;
typedef unsigned long long int ll;
void mod_add(ll x, ll n, ll p){
    ll res = 0;
    while(n){
        if(n & 1) res = (res + x) % p;
        x = (x<<1)%p;
        n >>= 1;
    }
    cout<<res<<endl;
}
int main(){
    ll a,b,p;
    cin>>a>>b>>p;
    mod_add(a,b,p);
    return 0;
}



活动打卡代码 AcWing 89. a^b

vanilla
2019-05-06 16:11
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<sstream>
#include<cstring>
#include<string>
#include<vector>
#include<set>
#include<stack>
#include<queue>
#include<map>
#include<cmath>
#include<algorithm>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
#define MAX_N 1000005
#define gcd(a,b) __gcd(a,b)
#define mem(a,x) memset(a,x,sizeof(a))
#define mid(a,b) a+b/2
#define stol(a) atoi(a.c_str())//string to long
int temp[MAX_N];
void mod_power(ll x, ll n, ll mod){
    ll res = 1;
    while(n){
        if(n & 1) res = res * x % mod;
        x <<= 1;
        n >>= 1;
    }
    printf("%lld\n",res);
}
int main(){
    //std::ios::sync_with_stdio(false);
    //std::cin.tie(0);
//    #ifndef ONLINE_JUDGE
//        freopen("D:\\in.txt","r",stdin);
//        freopen("D:\\out.txt","w",stdout);
//    #else
//    #endif
    ll a,b,c;
    cin>>a>>b>>c;
    mod_power(a,b,c);
    return 0;
}