hdu 5671 Matrix(BC——思维题)

题目链接:acm.hdu.edu.cn/showproblem.php?pid=5671

Matrix

Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)

Total Submission(s): 891    Accepted Submission(s): 371

Problem Description

There is a matrix M that
has n rows
and m columns (1≤n≤1000,1≤m≤1000).Then
we perform q(1≤q≤100,000) operations:

1 x y: Swap row x and row y (1≤x,y≤n);

2 x y: Swap column x and column y (1≤x,y≤m);

3 x y: Add y to all elements in row x (1≤x≤n,1≤y≤10,000);

4 x y: Add y to all elements in column x (1≤x≤m,1≤y≤10,000);

Input

There are multiple test cases. The first line of input contains an integer T(1≤T≤20) indicating
the number of test cases. For each test case:

The first line contains three integers n, m and q.

The following n lines
describe the matrix M.(1≤Mi,j≤10,000) for
all (1≤i≤n,1≤j≤m).

The following q lines
contains three integers a(1≤a≤4), x and y.

Output

For each test case, output the matrix M after
all q operations.

Sample Input

2
3 4 2
1 2 3 4
2 3 4 5
3 4 5 6
1 1 2
3 1 10
2 2 2
1 10
10 1
1 1 2
2 1 2

Sample Output

12 13 14 15
1 2 3 4
3 4 5 6
1 10
10 1

Hint

 Recommand to use scanf and printf 

Source

BestCoder Round #81 (div.2)

题目大意:

有一个nn行mm列的矩阵(1 \leq n \leq 1000 ,1 \leq m \leq 1000 )(1≤n≤1000,1≤m≤1000),在这个矩阵上进行qq  (1 \leq q \leq 100,000)(1≤q≤100,000) 个操作:

1 x y: 交换矩阵MM的第xx行和第yy行(1 \leq x,y \leq n)(1≤x,y≤n);
2 x y: 交换矩阵MM的第xx列和第yy列(1 \leq x,y \leq m)(1≤x,y≤m);
3 x y: 对矩阵MM的第xx行的每一个数加上y(1 \leq x \leq n,1 \leq y \leq 10,000)y(1≤x≤n,1≤y≤10,000);
4 x y: 对矩阵MM的第xx列的每一个数加上y(1 \leq x \leq m,1 \leq y \leq 10,000)y(1≤x≤m,1≤y≤10,000);对于每组数据,输出经过所有q个操作之后的矩阵M。

解题思路:如果单纯进行模拟的话,数据量比较大,所以采用标记的方式。分别记录当前状态下每一行、每一列是原始数组的哪一行、哪一列即可。对每一行、每一列加一个数的操作,也可以两个数组分别记录。注意当交换行、列的同时,也要交换增量数组。输出时通过索引找到原矩阵中的值,再加上行、列的增量。

详见代码。

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

int Map[1010][1010],a;
int h[1010],l[1010],dh[1010],dl[1010];

int main()
{
    int T;
    scanf("%d",&T);
    while (T--)
    {
        memset(dh,0,sizeof(dh));
        memset(dl,0,sizeof(dl));
        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++)
            {
                scanf("%d",&Map[i][j]);
                h[i]=i;
                l[j]=j;
            }
        }
        for (int i=0; i<q; i++)
        {
            int a,x,y;
            scanf("%d%d%d",&a,&x,&y);

            if(a==1)
            {
                swap(h[x],h[y]);
                swap(dh[x],dh[y]);//交换要加的数字
            }
            else if(a==2)
            {
                swap(l[x],l[y]);
                swap(dl[x],dl[y]);
            }
            else if(a==3)
            {
                dh[x]+=y;
            }
            else if(a==4)
            {
                dl[x]+=y;
            }
        }
        for (int i=1; i<=n; i++)
        {
            for (int j=1; j<m; j++)
                printf ("%d ",Map[h[i]][l[j]]+dh[i]+dl[j]);
            printf ("%d\n",Map[h[i]][l[m]]+dh[i]+dl[m]);
        }
    }
    return 0;
}
时间: 2024-07-29 06:49:51

hdu 5671 Matrix(BC——思维题)的相关文章

hdu - 1172 猜数字 (思维题)

http://acm.hdu.edu.cn/showproblem.php?pid=1172 这个题换一种想法,可以找出四位数中所有满足条件的数看是否只有一个. 1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <vector> 5 #include <cstring> 6 #include <string> 7 #include <a

HDU 5671 Matrix

Matrix Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 502    Accepted Submission(s): 215 Problem Description There is a matrix M that has n rows and m columns (1≤n≤1000,1≤m≤1000).Then we perf

第八场 hdu 6143 Killer Names(思维题)

http://acm.hdu.edu.cn/showproblem.php?pid=6143 题目大意:有名和姓两种字符串,每种字符串长度都是n个字符,名和姓加起来的字符种类数最多是m个,问满足条件的字符串有多少种? 解题思路:我们能够枚举左边的字符种数是x,那么右边就有(m-x)n种排列方式.我们知道左边的排列方式数量是C(m,x)*f(x).其中f(x)=(xn-C(x,x-1)*f(x-1)-C(x,x-2)*f(x-2)--C(x,1)*f(1)).最后结果就是枚举每一个x,对C(m,x

HDU 5752 Sqrt Bo (思维题) 2016杭电多校联合第三场

题目:传送门. 题意:一个很大的数n,最多开5次根号,问开几次根号可以得到1,如果5次还不能得到1就输出TAT. 题解:打表题,x1=1,x2=(x1+1)*(x1+1)-1,以此类推.x5是不超过long long的,判断输出即可. #include <iostream> #include <cstdio> #include <cstring> #include <cmath> using namespace std; typedef long long

HDU 5671 Matrix (BestCoder Round #81 (div.2) 1002)

传送门 Matrix Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 311    Accepted Submission(s): 142 Problem Description There is a matrix M that has n rows and m columns (1≤n≤1000,1≤m≤1000).Then we

CODE FESTIVAL 2017 qual A C Palindromic Matrix(思维题)

题目链接:点我呀 题意:给出n*m由26位小写字母组成的矩阵,问是否能够重构形成一个每行每列都是回文的矩阵 题解:分三种情况考虑(偶偶,奇奇,奇偶),每种情况下考虑最少 需要4个相同字母的字母数,2个相同字母的字母数和一个字母的字母数(只有奇奇的时候才需要一个字母) 最后判断一下.感觉自己的这个代码不是很简洁,明天起来看看别人怎么写的,睡觉去... 1 //Atcoder 3 2 #include <cstring> 3 #include <iostream> 4 #include

hdu 4972 A simple dynamic programming problem (转化 乱搞 思维题) 2014多校10

题目链接 题意:给定一个数组记录两队之间分差,只记分差,不记谁高谁低,问最终有多少种比分的可能性 分析: 类似cf的题目,比赛的时候都没想出来,简直笨到极点..... 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <cmath> 6 #include <vector> 7 #include &

hdu 4920 Matrix multiplication(矩阵坑题)

http://acm.hdu.edu.cn/showproblem.php?pid=4920 被这道题虐了一下午,啥也不说了.继续矩阵吧. 超时就超在每步取余上,要放在最后取余,再者注意三个循环的次序. #include <stdio.h> #include <map> #include <set> #include <stack> #include <queue> #include <vector> #include <cma

hdu 4932 /bestcoder B题 #4 /思维题

题意:给一个数列(整数),用一些不相交的区间去覆盖(只能是用端点去覆盖,端点可以交).而且区间出度相等.求最大区间长度. 开始一下就敲了,枚举每个区间长度,判断合法,更新最大.但是后来一看小数,感觉不行,改为二分,后来还是挂了... 赛后才知道,二分的时候,答案必需要满足单调性啊,这里小的数据不行,大的数据可以行!如 0 1 5 6 10, 3不行,4行. 后来才知道,枚举时,每个差值的一半也是可以的:仔细想想很容易证明.(水,坑) #include<iostream> #include<