• BestCoder Round #81 (div.2) Matrix


     1 #include <cstdio>
     2 #include <cstring>
     3 using namespace std;
     4 
     5 int s[1001][1001];
     6 
     7 int main()
     8 {
     9     int t,m,n,q,a,x,y;
    10     scanf("%d",&t);
    11     while(t--)
    12     {
    13         scanf("%d%d%d",&n,&m,&q);
    14         for(int i=0;i<n;i++)
    15             for(int j=0;j<m;j++)
    16                 scanf("%d",&s[i][j]);
    17         while(q--)
    18         {
    19             scanf("%d%d%d",&a,&x,&y);
    20             if(a==1)
    21             {
    22                 int t;
    23                 for(int i=0;i<m;i++)
    24                 {
    25                     t=s[x-1][i];    s[x-1][i]=s[y-1][i];   s[y-1][i]=t;
    26                 }
    27             }
    28             if(a==2)
    29             {
    30                 int t;
    31                 for(int i=0;i<n;i++)
    32                 {
    33                     t=s[i][x-1];    s[i][x-1]=s[i][y-1];    s[i][y-1]
    34 
    35 =t;
    36                 }
    37             }
    38             if(a==3)
    39             {
    40                 for(int i=0;i<m;i++)
    41                     s[x-1][i]+=y;
    42             }
    43             if(a==4)
    44             {
    45                 for(int i=0;i<n;i++)
    46                     s[i][x-1]+=y;
    47             }
    48         }
    49         int i,j;
    50         for(i=0;i<n;i++)
    51         {
    52             for(j=0;j<m-1;j++)
    53             {
    54                 printf("%d ",s[i][j]);
    55             }
    56             printf("%d
    ",s[i][j]);
    57         }
    58     }
    59     return 0;
    60 }
    View Code

    之前我算着时间肯定回超的,但我抱着试试态度,我提交ac,到了结束有显示超时,哎呀我去,看了下题解又做了一遍。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 using namespace std;
     6 
     7 const int MAX=1001;
     8 int arr[MAX][MAX];
     9 int h[MAX],l[MAX];//h表示换行后的位置,l代表换列后的位置
    10 int r[MAX],lr[MAX];//r表示第i行的之后加上的数,lr表示第i列之后加上的数
    11 
    12 int main()
    13 {
    14     int n,m,t,q,a,x,y;
    15     scanf("%d",&t);
    16     while(t--)
    17     {
    18         for(int i=1;i<=1000;i++)    
    19         {
    20             h[i]=i; l[i]=i;
    21         }
    22         memset(r,0,sizeof(r));
    23         memset(lr,0,sizeof(lr));
    24         scanf("%d%d%d",&n,&m,&q);
    25         for(int i=1;i<=n;i++)
    26             for(int j=1;j<=m;j++)
    27                 scanf("%d",arr[i]+j);
    28         while(q--)
    29         {
    30             scanf("%d%d%d",&a,&x,&y);
    31             if(a==1)
    32                 swap(h[x],h[y]);
    33              if(a==2)
    34                 swap(l[x],l[y]);
    35              if(a==3)
    36                 r[h[x]]+=y;
    37              if(a==4)
    38                 lr[l[x]]+=y;
    39         }
    40         int i,j,ans;
    41         for(i=1;i<=n;i++)
    42         {
    43             for(j=1;j<m;j++)
    44             {
    45                 ans=arr[h[i]][l[j]]+r[h[i]]+lr[l[j]];
    46                 printf("%d ",ans);
    47             }
    48             ans=arr[h[i]][l[j]]+r[h[i]]+lr[l[j]];
    49             printf("%d
    ",ans);
    50         }
    51     }
    52     return 0;
    53 }
    54                 
    AC代码

    对于交换行、交换列的操作,分别记录当前状态下每一行、每一列是原始数组的哪一行、哪一列即可。

    对每一行、每一列加一个数的操作,也可以两个数组分别记录。注意当交换行、列的同时,也要交换增量数组。

    输出时通过索引找到原矩阵中的值,再加上行、列的增量。

    复杂度O(q+mn)

  • 相关阅读:
    ny2 括号配对问题
    ny14 会场安排问题
    杭电ACM题目分类
    hdoj2037 今年暑假不AC
    ny37 回文字符串
    算法 字符串的排列组合
    手撸IoC
    Java设计模式
    多种方法求java求整数的位数
    二叉树之 二叉树深度
  • 原文地址:https://www.cnblogs.com/WDKER/p/5422780.html
Copyright © 2020-2023  润新知