【上海交大oj】1053 二哥的内存

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,0≤n≤1000, 0≤m≤2000.

对 100% 的数据,数组行列的下标范围为 0..99999, 0≤n≤10000, 0≤m≤20000.

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\n",array[i].v);
25             flag = 1;
26             break;
27         }
28     }
29     if (!flag) printf("%d\n",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 }

时间: 2024-08-26 06:22:34

【上海交大oj】1053 二哥的内存的相关文章

【算法学习笔记】78. STL二分的练习 下标映射的处理技巧 SJTU OJ 1053 二哥的内存

水题也要优化 1.用两个数组单独记录下标的更新 2.用STL中lower_bound来进行二分查找. 要注意lower_bound的返回值意义 是大于等于val的第一个,所以返回值要进行判断才可以利用 #include <iostream> #include <cstdio> #include <algorithm> #include <cstdlib> using namespace std; struct Point { int x; int y; in

【算法学习笔记】53.单调队列的简单应用 SJTU OJ 1034 二哥的金链

1034. 二哥的金链 Description 一个阳光明媚的周末,二哥出去游山玩水,然而粗心的二哥在路上把钱包弄丢了.傍晚时分二哥来到了一家小旅店,他翻便全身的口袋也没翻着多少钱,而他身上唯一值钱的就是一条漂亮的金链.这条金链散发着奇异的光泽,据说戴上它能保佑考试门门不挂,RP++.好心的老板很同情二哥的遭遇,同意二哥用这条金链来结帐.虽然二哥很舍不得这条金链,但是他必须用它来付一晚上的房钱了. 金链是环状的,一共有 N 节,老板的要价是 K 节.随便取下其中 K 节自然没问题,然而金链上每一

sjtu oj 1034 二哥的金链

一道比较有意思的题目,我把队列改造了一下然后ac了,后来学数据结构的时候发现我改的队列还有个名词,叫单调队列,心里颇为激动,于是把题目和我的代码发上来与大家分享一下. Description 一个阳光明媚的周末,二哥出去游山玩水,然而粗心的二哥在路上把钱包弄丢了.傍晚时分二哥来到了一家小旅店,他翻便全身的口袋也没翻着多少钱,而他身上唯一值钱的就是一条漂亮的金链.这条金链散发着奇异的光泽,据说戴上它能保佑考试门门不挂,RP++.好心的老板很同情二哥的遭遇,同意二哥用这条金链来结帐.虽然二哥很舍不得

【算法学习笔记】87. 枚举路径 SJTU OJ 1999 二哥找宝藏

这个题只用BFS来搜索一次会很麻烦, 因为每次经过一个宝藏之后,要把所有的vis重置(因为可以重复经过同一点, 但是这样会有很多不必要的路径) 看题目的暗示 最多只有5个宝藏  我们要把所有的宝藏收集齐全, 如果确定了收集的顺序, 那么也就确定了路径 那么可以知道 A55的排列一共是120种路径 遍历起来毫无压力 我们枚举所有宝藏的全排列, 然后从起点开始走, 记录整个路径的步数, 最后取最小值即可. 这里生产全排列的方法利用了 STL的next_permutation函数 非常爽....(要引

sjtu oj 1008 二哥买期货问题

1008. 二哥买期货 Description 二哥想知道在一段时期内,一共有多少个交易日.期货交易日的限定如下: 周六.周日不能交易 元旦期间(1月1日)不能交易 五一劳动节期间(5月1日至3日)不能交易 十一国庆节期间(10月1日至7日)不能交易 没有在上述要求中提到的日期均可交易 Input Format 第一行有一个整数n,表示一共有n组数据. 每组数据都有一行,是两个用空格分开的日期,分别为开始日期和结束日期.日期格式为YYYY-MM-DD(比如2010-11-11):数据保证开始日期

【算法学习笔记】54.约瑟夫问题 模拟、逆推动规 SJTU OJ 1038 二哥的约瑟夫

Description 话说二哥当年学习数据结构的时候遇到了那道猴子报数的题目,其实这就是经典的约瑟夫问题. 可是当年的二哥还是个毛头小子,只会用模拟的方法,而其他同学却使用了一些令二哥完全摸不到头脑的方法. ……二哥一怒之下改了题目…… 话说当年花果山的猴子要选大王,选举办法如下: 所有猴子按1-M编号围坐一圈,二哥站在圈中心,由二哥指定一个整数Kn, 之后猴子们从1号开始按顺序报数,报到Kn的猴子退出到圈外,二哥再报出一个整数Kn+1, 然后由刚刚退出的猴子的下一只猴子再开始报数,如此循环报

【上海交大oj】赫萝的桃子(动态规划)

1370. 赫萝的桃子 Description 赫萝最喜欢吃蜂蜜腌渍的桃子.然而她能够得到的桃子有限,因此赫萝必须精打细算.赫萝在b天内可以得到a个桃子,每天赫萝至少吃一个桃子,她想知道她在a天内有多少种吃桃子的方法.吃桃子的顺序并不重要,也就是说赫萝认为“第一天吃一个桃子第二天吃两个桃子”和“第一天吃两个桃子第二天吃一个桃子”算一种方法. Input Format 每个测试点有多组测试数据. 第一行一个数n,表示测试的数量. 接下来n行每行两个数a, b(a>b). Output Format

【上海交大oj】畅畅的牙签袋(改)(枚举+模拟)

1391. 畅畅的牙签袋(改) 题目描述 上次妄图遮掩显示器的企图失败了,所以畅畅很不开心.这次,他换了一种牙签袋卷土重来了.这次他选择了十字形的牙签袋(即每贴一个牙签袋都会影响5块区域,贴的时候中心点必须贴在显示器上,如果中心点在边上,则会有一些块暴露在显示器外,不过没关系,畅畅会把这些块剪掉的),所以他觉得这次一定能把整个显示器贴的满满的. 贴了又撕,撕了又贴,怔了一会儿后,他发现整个显示器被整的凹凸不平,非常难受.因为强迫症,他决定要把每一块区域都贴到有偶数层牙签袋(就是说这次可以重叠的铺

【上海交大oj】畅畅的牙签袋(状态压缩dp)

1383. 畅畅的牙签袋 题目描述 畅畅说:“你们都说窝脑子瓦特了,我看你们才是脑子瓦特嘞- -” 为了阻挠我们再次揭露他的无chǐ,畅畅妄图破坏我们的显示器,他拿出了自己收集的牙签包装袋,其大小是1×2的矩形,他想用密铺的方式把显示器全部遮挡住.显示器大小是W×H的矩形,畅畅把包装袋背面涂上了胶水,开始一块一块粘到显示器上,要求不能有包装袋重叠,也不能有显示器的某一部分没被遮挡,包装袋的放置只有两种情况:横放和竖放. 畅畅为自己的周密计划洋洋得意之时,脑子又瓦特了,他想让你帮他算算针对每台显示