二哥買了一台記憶體非常非常大的電腦,以至於二哥寫程式直接開了乙個 100,000 * 100,000 的陣列都跑得很順暢。這個陣列初始被清零,二哥在其中的 n 個位置賦了值,然後他做了 m 次操作,每次操作為以下三個指令之一:
0 x y :交換陣列的 x 行與 y 行
1 x y :交換陣列的 x 列與 y 列
2 x y :讀取陣列當期 x 行 y 列的數
現在請你寫乙個程式,對於每次讀取,輸出記憶體中對應位置的數。
第 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 表示讀取操作。
陣列中乙個位置不會被賦值兩次。
對於每個讀取指令,輸出一行乙個整數,為記憶體中對應位置的數。
對 70% 的資料,陣列行列的下標範圍為 0..199,0≤n≤1000
, 0≤m≤2000
.對 100% 的資料,陣列行列的下標範圍為 0..99999, 0≤n≤10000
, 0≤m≤20000
.
3
0 1 1
1 0 2
2 2 3
90 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
213123
題目不難,就是開個陣列記錄下標,如果要優化的話可以排個序然後二分查詢,不過這題可以直接過。但當我寫完以後發現無論如何都有幾個點過不了,這個bug隱藏的太深,費了好大功夫才找到。原因就是我交換乙個陣列的兩個位置的值時採用異或的辦法,結果就悲劇了,因為這兩個位置可能相同,這麼一來異或一下本來只改變乙個變數的值,現在由於實際上是同乙個變數,這麼一交換實際上就是變為零了。比如執行a ^= a,就這一步已經把a變為了零。
實際上貌似異或的辦法並不能提高效率,以後還是別裝逼了。
**:
1 #include 2 #include 3 #include 4view codeusing
namespace
std;56
struct
arr13 }array[100005
];14
15int x[100005]; //
記錄下標
16int y[100005
];17
intn;
1819
void find(int a,int
b)28
} 29
if (!flag) printf("
%d\n
",0);30}
31int
main()
40 sort(array,array+n);
41 scanf("
%d",&m);
42for (int i = 0;i < m;++i)
4353
break;54
}55case1:
6162
break;63
}64default:67
}68}69
70return0;
71 }
演算法之路之征服上海交大的oj 二哥摘蘋果
二哥摘蘋果 題目描述 二哥是乙個懶於行動的人,他想在摘蘋果之前知道自己能摘到多少蘋果,如果實在太少 蘋果樹很茂盛,主要是由於身高原因 他寧可坐在樹下等蘋果自己掉下來砸到頭上。輸入格式 輸入共有兩行。第1行有3個整數,分別表示二哥的身高 凳子的高度和蘋果的個數n。第2行有n個整數,分別表示每個蘋果的高...
交大oj 1008 二哥買期貨 C 總結
這個公式可以根據日期計算這一天是星期幾,具體公式如下 w d 2 m 3 m 1 5 y y 4 y 100 y 400 mod 7 這個函式返回的結果是0 6的整數,表示星期一到星期天 int getweeknumber int year,int month,int day return day ...
演算法之路之征服上海交大的oj 矩陣翻轉
矩陣翻轉 description 給定乙個正方形的整數矩陣,輸出將該矩陣按某一方向翻轉後的結果。input format 輸入第一行有乙個整數n,表示一共有n組資料 n不會為負數。之後有n組資料,對於每組資料 第一行有兩個整數a和b,分別表示正方形矩陣的邊長,以及翻轉的方向。當b 0時水平翻轉,當b...