解题思路:

求出最大的横坐标差和最大的纵坐标轴之差,取较大值作为正方形城市边长即可。

代码:

#include <iostream>
#include <cmath>
using namespace std;
const int INF=1e9+5;int main()
{int n;while(cin >> n){int min_x=INF, max_x=-INF, min_y=INF, max_y=-INF;int x, y;for(int i=0; i<n; i++){cin >> x >> y;if(x > max_x)max_x = x;if(y > max_y)max_y = y;if(x < min_x)min_x = x;if(y < min_y)min_y = y;}//坐标取值范围[-1e9, 1e9],面积可能大于int范围。long long tmp = max(max_x-min_x,max_y-min_y); cout << tmp*tmp << endl;}return 0;
}


解题思路:

解法1:离线+树状数组。先把询问离线,并且按照右端点排序,然后从小区间开始,然后树状数组的含义就是指以当前r为结尾的前缀区间(除去后面出现过的元素)的元素种类数,简单点说,当计算到l , r区间,把l - r区间还没在树状数组上更新的值,更新一遍,在之前已经存在了的值先删掉再更新一遍,确保我确定的元素都是往r靠的。

解法2:主席树。

解法3:暴力求解。维护一个大小为m的数组,记录每个数的前缀出现次数,把l - r区间的每个数相减,再统计出现次数大于0的数字总数即为答案。(时间复杂度为Q*m,只适用于Q*m较小时;若此题m的范围改为1~1000,则超时。)

(在解法1和解法2中,m均用不上)

代码(解法1):

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<map>
using namespace std;const int N = 2005;
const int M = 1000005;
struct node
{int x, y, id;
}b[M];int c[N], ans[M], a[N];
map<int, int >vis;bool cmp(node a, node b)
{return a.y<b.y;
}
int lowbit(int x)
{return x & (-x);
}
void update(int x, int val,int n)
{while (x <= n){c[x] += val;x += lowbit(x);}
}
int sum(int x)
{int s = 0;while (x){s += c[x];x -= lowbit(x);}return s;
}
int main()
{int n, m, k;while (~scanf("%d%d", &n, &k)){for (int i = 1; i <= n; i++)scanf("%d", &a[i]);scanf("%d", &m);for (int i = 0; i<m; i++){scanf("%d%d", &b[i].x, &b[i].y);b[i].id = i;}cout<<endl;sort(b, b + m, cmp); for (int k = 0; k<m; k++){cout<<b[k].x<<" "<<b[k].y<<endl;}cout<<endl;int pre = 1;memset(c, 0, sizeof(c));vis.clear();for (int i = 0; i<m; i++){for (int j = pre; j <= b[i].y; j++){if (vis.find(a[j]) == vis.end())update(j, 1, n);else{update(vis[a[j]], -1, n);update(j, 1, n);}vis[a[j]] = j;}ans[b[i].id] = sum(b[i].y) - sum(b[i].x - 1);pre = b[i].y + 1;}cout<<endl;for (int i = 0; i<m; i++)printf("%d\n", ans[i]);}return 0;
}

解题思路:

很明显这是最长公共子序列LCS.

但是由于数据太大,普通的O(n2)的做法肯定不行,我们要考虑一种更快的做法.把LCS问题转换成LIS问题,然后再利用LISnlogn解法来求出答案。

思路是这样的,首先假设有两个串,为ab,比如:

a 1 2 3 5 4
b 5 4 3 2 1
下标 1 2 3 4 5

我们找出a中的每个数在b中的下标。

1出现在5位置,2出现在4位置,3出现在3位置,5出现在1位置,4出现在2位置,那么就形成了一个新的串.

5 4 3 1 2

(注意:若a中的元素在b中当有多个位置(k1,k2,k3……)时,要降序排列(k1>k2>k3),这样求最长上升子序列的时候,可以保证从这些位置中只取出一个)

然后对新生成的串求出LIS长度就是答案

注:LCS在最终的时间复杂度上不是严格的O(nlogn),不知均摊上是不是。
       举个退化的例子:
       如    a:666                b:66666

则新的序列为432143214321
       长度变成了n*m ,最终时间复杂度O(n*m*(lognm)) > O(n*m)。

不过此题每个元素都不一样,则算法时间复杂度O(nlogn)

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;const int MAXN = 50005;int a[MAXN], lis[MAXN * 20], d[MAXN * 20];
vector<int> pos[MAXN];int main()
{int n;while(~scanf("%d", &n)){for (int i = 1; i <= n; i++)scanf("%d", a + i);int b;for (int i = 1; i <= n; i++) {scanf("%d", &b);pos[b].push_back(i);}int len_lis = 1;for (int i = 0; i <= n; i++)for (int k = pos[a[i]].size() - 1; k >= 0; k--)lis[len_lis++] = pos[a[i]][k];d[1] = lis[1];int max_len_lcs = 1;for (int i = 2; i <= len_lis; i++){if (lis[i] > d[max_len_lcs])d[++max_len_lcs] = lis[i];else{int pos_greater_than_lis_i = lower_bound(d, d + max_len_lcs, lis[i]) - d;d[pos_greater_than_lis_i] = lis[i];}}printf("%d\n", max_len_lcs);}return 0;
}

2019 360校招笔试- 编程题 -2018.08.27相关推荐

  1. 商汤科技 2019校园招聘笔试编程题-2018.09.07

    本来阿里和商汤冲突了,就放弃了阿里的劝退型笔试,结果,商汤也劝退,只发一下题目做参考吧!知道题解的同学可以在评论区粘上链接,我会随时更新并加以感谢的.

  2. 滴滴 2019校园招聘笔试编程题-2018.09.18

    输入: slep slap sleep step shoe shop snap slep 输出: slep slap step 代码是交卷后写出来的,没有经过测试,不知道是否能够AC 利用DP求出每个 ...

  3. 魔法币 java_网易2018校招笔试编程题-魔法币 java实现

    魔法币 原题 小易准备去魔法王国采购魔法神器,购买魔法神器需要使用魔法币,但是小易现在一枚魔法币都没有,但是小易有两台魔法机器可以通过投入x(x可以为0)个魔法币产生更多的魔法币. 魔法机器1:如果投 ...

  4. 快手2019春招笔试编程题

    快手2019春招笔试编程题 第一题 输入描述 输出描述 分析 代码 第二题 输入描述 输出描述 分析 代码 第三题 输入描述 输出描述 分析 代码 个人主页:http://redtongue.cn o ...

  5. 贝壳找房 2019校招 研发类试卷C++ 编程题 2018.08.19

    贝壳找房 2019校招 研发类试卷编程题 C++ 2018.08.19 遍历的同时求出最小值min 和 村庄高度和sum,sum-min即可 #include <iostream>usin ...

  6. 阿里-2019算法岗笔试编程题-kmp匹配

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_25737169/article/details/82503724 </div>&l ...

  7. 搜狗2016年校招笔试编程题记录+总结

    不同的职位题目应该不一样,我遇到的2道题,其一是搜狗问答中的作弊判断,其二是矩阵计算. 1. 搜狗问答作弊判断 简单来说,就是存在作弊刷积分的情况,所以需要判断哪些人作弊,判断遵循下面2个原则: (A ...

  8. 华为2020校招笔试编程题 看这篇就够了(上)

    背景 近日一位在华为的师兄整理了一份内部的提纲给我们,想着以后肯定不会去华为,于是乎分享给大家,看看菊花厂今年的笔试题目是什么样子的. 编程题范围 这好像来自一个华为内部的文档,据说今年华为内部也在进 ...

  9. 奇安信2021年校招笔试编程题

    < 2020年9月12日奇安信笔试编程第一题 > <java实现获取数组中的连续子数组> 1. 题目信息 2. 参数要求 3. 解题思路 该题获取糖果可以分解为两个部分: (1 ...

  10. 网易2020校招笔试编程题回顾

    把今天的记忆里面的笔试题的情况梳理一下,投递的是算法工程师: 题型总共分为选择题10*1  编程题10.20.20.30  问答题5*2 编程题: 1.倒数排序:给你一个数n,以及1-n的一个排列,让 ...

最新文章

  1. linux Mysql 安装
  2. 4个做管理后才知道的秘密
  3. 211.Alpha多样性箱线图(样章,11图2视频)
  4. python绘制所有特征的密度图(density plot)
  5. [POJ 3270]Cow Sorting
  6. vant-image本地图片无法显示
  7. 【模拟】游戏(jzoj 1614)
  8. java jedis_Java操作Redis之Jedis用法详解
  9. Fragment:关于Avoid non-default constructors in fragments的错误
  10. 【Android】Android6.0发送短信Demo
  11. 对android中ActionBar中setDisplayHomeAsUpEnabled和setHomeButtonEnabled和setDisplayShowHomeEnabled方法的理解...
  12. 女生学电气or计算机,8个女生可以学习的工科专业,高三毕业生了解一下,值得报考...
  13. HCIE-Security Day37:理论学习:信息安全防范与趋势
  14. 一种边播边下的播放策略
  15. 音频HiFi的二三事
  16. 计算机的cpu故障,计算机cpu常见故障
  17. 基于掷色子规则的c语言编程,掷骰子游戏-C语言
  18. 用pytest实现POM模型
  19. 干货|建模3D Max中常见问题
  20. 计算机模拟爆破过程,基于LSDYNA岩石爆破模拟建模分析

热门文章

  1. u盘变o字节怎么修复_U盘变成0字节了数据怎么恢复
  2. Python数据可视化交互基本
  3. Android 实现动态背景“五彩蛛网”特效,让你大开眼界!
  4. June 12th No Matter How
  5. 图片相似度判断-差异值哈希算法JAVA版
  6. TF_REPEATED_DATA ignoring data with redundant timestamp for frame left_wheel at time
  7. Linux下基于UDP协议实现的聊天室项目(附源码)
  8. paperwhite3翻页_Kindle vs. Paperwhite vs. Voyage vs. Oasis:您应该购买哪种Kindle?
  9. Unity C# compiler: CS0121: The call is ambiguous between the following methods or properties
  10. 背篼酥课堂-GPS定位(一) nodemcu 解析gps