zoukankan      html  css  js  c++  java
  • 【上海交大oj】1053 二哥的内存

    Description

    二哥买了一台内存非常非常大的电脑,以至于二哥写程序直接开了一个 100,000 * 100,000 的数组都跑得很顺畅。这个数组初始被清零,二哥在其中的 n 个位置赋了值,然后他做了 m 次操作,每次操作为以下三个指令之一:

    0 x y :交换数组的 x 行与 y 行

    1 x y :交换数组的 x 列与 y 列

    2 x y :读取数组当期 x 行 y 列的数

    现在请你写一个程序,对于每次读取,输出内存中对应位置的数。

    Input Format

    第 1 行:一个整数 n 表示初始化了 n 个位置。

    第 2..n+1 行:每行三个整数: x y z 表示数组中 x 行 y 列的值被赋值为 z。

    第 n+2 行:一个整数 m 表示操作的数量

    第 n+3..n+m+2 行:每行一条指令 op x y,其中 op 为 0 表示交换行,op 为 1 表示交换列,op 为 2 表示读取操作。

    数组中一个位置不会被赋值两次。

    Output Format

    对于每个读取指令,输出一行一个整数,为内存中对应位置的数。

    Hint

    对 70% 的数据,数组行列的下标范围为 0..199,0n10000m2000.

    对 100% 的数据,数组行列的下标范围为 0..99999, 0n100000m20000.

    Sample Input

    3
    0 1 1
    1 0 2
    2 2 3
    9
    0 0 1
    2 0 0
    2 1 1
    2 2 2
    1 0 1
    0 0 1
    2 0 0
    2 1 1
    2 2 2
    

    Sample Output

    2
    1
    3
    1
    2
    3


    题目不难,就是开个数组记录下标,如果要优化的话可以排个序然后二分查找,不过这题可以直接过。
    但当我写完以后发现无论如何都有几个点过不了,这个bug隐藏的太深,费了好大功夫才找到。原因就是我交换一个数组的两个位置的值时采用异或的办法,结果就悲剧了,因为这两个位置可能相同,这么一来异或一下本来只改变一个变量的值,现在由于实际上是同一个变量,这么一交换实际上就是变为零了。比如执行a ^= a,就这一步已经把a变为了零。
    实际上貌似异或的办法并不能提高效率,以后还是别装逼了。
    代码:
     1 #include <cstdio>
     2 #include <iostream>
     3 #include <algorithm>
     4 using namespace std;
     5 
     6 struct arr{
     7     int r;
     8     int c;
     9     int v;
    10     bool operator < (const arr &a)const{
    11         return r<a.r;
    12     }
    13 }array[100005];
    14 
    15 int x[100005]; //记录下标 
    16 int y[100005];
    17 int n;
    18 
    19 void Find(int a,int b){
    20     int xx = x[a],yy = y[b];
    21     bool flag = 0;
    22     for (int i = 0;i < n;++i){
    23         if (array[i].r == xx && array[i].c == yy) {
    24             printf("%d
    ",array[i].v);
    25             flag = 1;
    26             break;
    27         }
    28     } 
    29     if (!flag) printf("%d
    ",0);
    30 }
    31 int main(){
    32     int m;
    33 
    34     for (int i = 0;i < 100005;++i) x[i] = y[i] = i;
    35     scanf("%d",&n);
    36     for (int i =0;i < n;++i)
    37     {
    38         scanf("%d%d%d",&array[i].r,&array[i].c,&array[i].v);
    39     }
    40     sort(array,array+n); 
    41     scanf("%d",&m);
    42     for (int i = 0;i < m;++i)
    43     {
    44         int op,a,b;
    45         scanf("%d%d%d",&op,&a,&b);
    46         switch (op){
    47             case 0:{
    48                 if (a != b) {  
    49                     x[a] = x[a]^x[b]; //这就是坑爹的异或交换 ,只有下标不同才能换 
    50                     x[b] = x[a]^x[b];
    51                     x[a] = x[a]^x[b];
    52             }
    53                 break;
    54             }
    55             case 1:{
    56                 if (a != b) {
    57                     y[a] = y[a]^y[b];
    58                     y[b] = y[a]^y[b];
    59                     y[a] = y[a]^y[b];
    60                 }
    61                 
    62                 break;
    63             }
    64             default:{
    65                 Find(a,b);
    66             }
    67         }
    68     }
    69 
    70     return 0;
    71 }
    View Code
  • 相关阅读:
    剑指Offer
    剑指Offer
    剑指Offer
    选书
    马的遍历
    从事效应
    魔性的素数环1~20 自带解释~
    [POJ1236]Network of Schools(并查集+floyd,伪强连通分量)
    [HDOJ3974]Assign the task(建树胡搞)
    [HDOJ4027]Can you answer these queries?(线段树,特殊成段更新,成段查询)
  • 原文地址:https://www.cnblogs.com/wenma/p/4668472.html
Copyright © 2011-2022 走看看