【算法学习笔记】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;
    int z;
};

int n;
const int MAXN = 100000;
//int data[MAXN][MAXN];
Point points[MAXN];
int curx[MAXN];
int cury[MAXN];

void init(){
    cin>>n;
    for (int i = 0; i < n; ++i){
        //int x,y,z;
        //scanf("%d %d %d",&x,&y,&z);
        //data[x][y] = z;
        scanf("%d %d %d",&points[i].x,&points[i].y,&points[i].z);
    }

    for (int i = 0; i < MAXN; ++i)
        curx[i]=i;
    for (int i = 0; i < MAXN; ++i)
        cury[i]=i;

}

bool cmpPoint(const Point& a,const Point& b){
    if(a.x!=b.x){
        return a.x<b.x;
    }else
        return a.y<b.y;
}

int find(int x,int y){
    Point tofind;
    tofind.x = x;
    tofind.y = y;
    Point* f = lower_bound(points,points+n,tofind,cmpPoint);
    //注意lower_bound的返回值是大于等于val的第一个 不一定正好是它
    if(f != points+n and f->x==x and f->y==y)
        return f->z;
    return 0;
}

void exe(){
    int m;
    cin>>m;
    sort(points,points+n,cmpPoint);
    for (int i = 0; i < m; ++i)
    {
        int op,x,y;
        scanf("%d %d %d",&op,&x,&y);
        if(op==0){
            swap(curx[x],curx[y]);
        }else if(op==1)
            swap(cury[x],cury[y]);
        else{
            //printf("%d\n", data[curx[x]][cury[y]]);
            printf("%d\n", find(curx[x],cury[y]));
        }
    }
}

int main(int argc, char const *argv[])
{
    init();
    exe();
    return 0;
}
时间: 2024-10-07 04:50:35

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

【算法学习笔记】85.破环为链 序列DP 松弛+代价 SJTU OJ 1073 能量项链

和石子合并很像, 为了对环状进行处理, 我们可以把输入数据复制一份接连在后边. 这样在最后的结果枚举起点找最大即可. 注意这里代价的计算, 因为我们的data[i]只记录了珠子的头珠子的尾部即是下一个珠子的头部. //因为计算dp[i][j]时需要 用到dp[i][k] k比j小 所以j顺序 dp[k][j] k比i大 所以i逆序 k插入即可 for (int i = 2*n-1; i >=1 ; --i){ for (int j = i; j <= 2*n; ++j){ dp[i][j] =

【算法学习笔记】32.计算几何 求含最多给定点的直线 SJTU OJ 1350 穿越沙漠

1350. 穿越沙漠 Description 塞尔达公主又又又又被抓走了.林克为了找到她需要穿过拉纳鲁沙漠,坏消息是林克可能没有足够的体力穿越沙漠,好消息是沙漠中分布着N个力之果实,坏消息是我们的林克只能走直线.为了穿越沙漠,林克希望能够吃到尽可能多的力之果实.现在请你帮他规划一条直线,使他能够获得尽可能多的力之果实. Input Format 输入第一行有一个数N,表示沙漠中果实的数量. 接下来的N行每行两个正整数x,y,表示每个力之果实的坐标. Output Format 输出一个数,表示林

八大排序算法学习笔记:插入排序(二分插入排序)

二分插入排序   也称折半插入排序, 1.基本思想:设数列[0....n]分为两部分一部分是[0...i]为有序序列,另一部分是[i+1.....n]为无序序列,从无序序列中取一个数 x ,利用二分查找算法找到 x 在有序序列中的插入位置并插入,有序序列还是有序的,接下来重复上述步骤,直到无序序列全部插入有序序列 ,这是整个序列只剩下有序序列即有序了. 2.代码:    3.复杂度: 用二分插入排序所要进行的总比较次数为O(lgn),当n较大时,比直接插入排序的最大比较次数小得多,但大于最小比较

[算法学习笔记]直接插入排序笔记

直接插入排序概念: 带排元素放在elem[0...n-1]中,初始化时,elem[0]自成1个有序区,无序区为elem[1...n-1],从i=1起,到i=n-1,依次将elem[i]插入有序区[0...n-1]中 直接插入排序算法步骤: 1.在当前有序区域R[1,i-1]中查找R[i]的正确插入位置K(1<=K<=i-1) 2.将R[K,i-1]中的记录均向后移动 3.移动后腾出K位置,插入R[i] (最坏)时间复杂度:O(n^2) 空间复杂度:O(1) /// <summary>

八大排序算法学习笔记:插入排序(一)

插入排序     包括:直接插入排序,二分插入排序(又称折半插入排序),链表插入排序,希尔排序(又称缩小增量排序).属于稳定排序的一种(通俗地讲,就是两个相等的数不会交换位置) . 直接插入排序: 1.算法的伪代码(这样便于理解):     INSERTION-SORT (A, n)             A[1 . . n] for j ←2 to n do key ← A[ j] i ← j – 1 while i > 0 and A[i] > key do A[i+1] ← A[i]

算法学习笔记 递归之 快速幂、斐波那契矩阵加速

递归的定义 原文地址为:http://blog.csdn.net/thisinnocence 递归和迭代是编程中最为常用的基本技巧,而且递归常常比迭代更为简洁和强大.它的定义就是:直接或间接调用自身.经典问题有:幂运算.阶乘.组合数.斐波那契数列.汉诺塔等.其算法思想: 原问题可分解子问题(必要条件): 原与分解后的子问题相似(递归方程): 分解次数有限(子问题有穷): 最终问题可直接解决(递归边界): 对于递归的应用与优化,直接递归时要预估时空复杂度,以免出现用时过长或者栈溢出.优化递归就是以

EM算法学习笔记2:深入理解

文章<EM算法学习笔记1:简介>中介绍了EM算法的主要思路和流程,我们知道EM算法通过迭代的方法,最后得到最大似然问题的一个局部最优解.本文介绍标准EM算法背后的原理. 我们有样本集X,隐变量Z,模型参数θ,注意他们3个都是向量,要求解的log似然函数是lnp(X|θ),而这个log似然函数难以求解,我们假设隐变量Z已知,发现lnp(X,Z|θ) 的最大似然容易求解. 有一天,人们发现引入任意一个关于隐变量的分布q(Z),对于这个log似然函数,存在这样一个分解: lnp(X|θ)=L(q,θ

算法学习笔记 KMP算法之 next 数组详解

最近回顾了下字符串匹配 KMP 算法,相对于朴素匹配算法,KMP算法核心改进就在于:待匹配串指针 i 不发生回溯,模式串指针 j 跳转到 next[j],即变为了 j = next[j]. 由此时间复杂度由朴素匹配的 O(m*n) 降到了 O(m+n), 其中模式串长度 m, 待匹配文本串长 n. 其中,比较难理解的地方就是 next 数组的求法.next 数组的含义:代表当前字符之前的字符串中,有多大长度的相同前缀后缀,也可看作有限状态自动机的状态,而且从自动机的角度反而更容易推导一些. "前

算法学习笔记 最短路

图论中一个经典问题就是求最短路,最为基础和最为经典的算法莫过于 Dijkstra 和 Floyd 算法,一个是贪心算法,一个是动态规划,这也是算法中的两大经典代表.用一个简单图在纸上一步一步演算,也是很好理解的,理解透自己多默写几次即可记住,机试时主要的工作往往就是快速构造邻接矩阵了. 对于平时的练习,一个很厉害的 ACMer  @BenLin_BLY 说:"刷水题可以加快我们编程的速度,做经典则可以让我们触类旁通,初期如果遇见很多编不出,不妨就写伪代码,理思路,在纸上进行整体分析和一步步的演算