当前位置: 首页 > wzjs >正文

合肥网站建设多少钱开封网站建设培训班

合肥网站建设多少钱,开封网站建设培训班,腾讯云服务器怎么做网站,wordpress如何上传html代码区间统计种类 问题描述 给你一个整数数组,给你很多个区间[L,R],对于所有区间,打印区间内有多少个不同的整数。 输入示例 5 1 2 2 1 2 6 1 4 1 5 2 2 2 4 2 3 1 1输出示例 2 2 1 2 1 1输入示例 6 1 2 3 4 3 5 3 1 2 3 5 2 6输出示例 2 …

区间统计种类

问题描述

给你一个整数数组,给你很多个区间[L,R],对于所有区间,打印区间内有多少个不同的整数。

输入示例

5
1 2 2 1 2
6
1 4
1 5
2 2
2 4
2 3
1 1

输出示例

2
2
1
2
1
1

输入示例

6
1 2 3 4 3 5
3
1 2
3 5
2 6

输出示例

2
2
4

c++代码

#include<bits/stdc++.h>
#include<stdio.h>using namespace std;class query {
public:int l, r, key;
};int n, m;
vector<int> trees, ans, arr;
vector<query> querys;
vector<vector<int>> end_by_r;
unordered_map<int, int> mp;bool mycom(query a, query b) { return a.r < b.r; }void build(int p, int l, int r) {if (l == r) {trees[p] = 1;return;}int mid = (l + r) / 2;build(2 * p, l, mid);build(2 * p + 1, mid + 1, r);trees[p] = trees[2 * p] + trees[2 * p + 1];
}void update(int p, int l, int r, int k) {if (l == r && l == k) {trees[p] = 0;return;}int mid = (l + r) / 2;if (k <= mid) update(2 * p, l, mid, k);else update(2 * p + 1, mid + 1, r, k);trees[p] = trees[2 * p] + trees[2 * p + 1];
}int ask(int p, int l, int r, int range_l, int range_r) {if (range_l <= l && range_r >= r) return trees[p];int mid = (l + r) / 2, ans = 0;if (mid >= range_l) ans += ask(2 * p, l, mid, range_l, range_r);if (mid < range_r) ans += ask(2 * p + 1, mid + 1, r, range_l, range_r);return ans;
}int main() {scanf("%d", &n);trees = vector<int>(4 * n), arr = vector<int>(n + 1), end_by_r = vector<vector<int>>(n + 1);for (int i = 1; i <= n; i++) scanf("%d", &arr[i]);build(1, 1, n);scanf("%d", &m);querys = vector<query>(m), ans = vector<int>(m);for (int i = 0; i < m; i++) scanf("%d %d", &querys[i].l, &querys[i].r), querys[i].key = i;sort(querys.begin(), querys.end(), mycom);for (int i = 0; i < m; i++) end_by_r[querys[i].r].push_back(i);for (int i = 1; i <= n; i++) {if (mp.find(arr[i]) != mp.end()) update(1, 1, n, mp[arr[i]]);mp[arr[i]] = i;for (int x : end_by_r[i]) {ans[querys[x].key] = ask(1, 1, n, querys[x].l, querys[x].r);}}for (int i = 0; i < m; i++) printf("%d\n", ans[i]);return 0;
}//by wqs

思路解析

线段树法,时间复杂度0(nlogn)

用区间和模拟区间种类数

但是从1-right要预处理,例如数组1 2 2 1 2,我们要查询[1,4]多少种类,线段树初始化1 1 1 1

第一个数为1,没出现过,下一个,线段树状态1 1 1 1

第二个数为2,没出现过,下一个,线段树状态1 1 1 1

第三个数为2,把上一个2的位置变成0,线段树状态1 0 1 1

第四个数为1,把上一个1的位置变成0,线段树状态0 0 1 1

然后区间求和为2,得出[1,4]多少2个种类

这道题目就是用这样的单点修改+区间求和查询模拟出种类数。

刚刚是一个查询,现在考虑多个查询。

我们主要保证当前修改不会对其他查询产生影响就行。

贪心的办法是将所有的查询按右端点从小到大排序,这样我修改这个就不会对未来的查询产生影响。

例如查询1 1、1 2、2 2、2 3

这个是排序好的,修改1 1,对1 2来说我本来就要修改1 1,对于2 2和2 3来说,1 1不在我的范围,本来就影响不到。

当然,这只是我自己的理解,严格的贪心证明,我是不会的。下面给出算法步骤。

算法步骤

建立线段树

vector<int> trees;
void build(int p, int l, int r) {if (l == r) {trees[p] = 1;//线段树初始值为1return;}int mid = (l + r) / 2;build(2 * p, l, mid);build(2 * p + 1, mid + 1, r);trees[p] = trees[2 * p] + trees[2 * p + 1];
}
build(1, 1, n);

编写单点修改+区间求和函数

void update(int p, int l, int r, int k) {//把[k,k]的值变为0,并且更新线段树if (l == r && l == k) {trees[p] = 0;return;}int mid = (l + r) / 2;if (k <= mid) update(2 * p, l, mid, k);else update(2 * p + 1, mid + 1, r, k);trees[p] = trees[2 * p] + trees[2 * p + 1];
}int ask(int p, int l, int r, int range_l, int range_r) {//返回[range_l, range_r]的区间和if (range_l <= l && range_r >= r) return trees[p];int mid = (l + r) / 2, ans = 0;if (mid >= range_l) ans += ask(2 * p, l, mid, range_l, range_r);if (mid < range_r) ans += ask(2 * p + 1, mid + 1, r, range_l, range_r);return ans;
}

查询排序

class query {
public:int l, r, key;
};
vector<query> querys;
bool mycom(query a, query b) { return a.r < b.r; }
sort(querys.begin(), querys.end(), mycom);

记录所有r结尾的区间

vector<vector<int>> end_by_r;
for (int i = 0; i < m; i++) end_by_r[querys[i].r].push_back(i);

注意记录答案

for (int i = 1; i <= n; i++) {if (mp.find(arr[i]) != mp.end()) update(1, 1, n, mp[arr[i]]);//让一次出现的位置变成0mp[arr[i]] = i;//更新上一次出现for (int x : end_by_r[i]) {ans[querys[x].key] = ask(1, 1, n, querys[x].l, querys[x].r);//此时,区间的和就是种类数。}
}

按顺序输出答案

for (int i = 0; i < m; i++) printf("%d\n", ans[i]);

文章转载自:

http://iaKO11BZ.yqyhr.cn
http://yHBUCTym.yqyhr.cn
http://TzYkUyRc.yqyhr.cn
http://P4lTcBdO.yqyhr.cn
http://zeyi39B9.yqyhr.cn
http://YWRTS10S.yqyhr.cn
http://22xVdRRQ.yqyhr.cn
http://vIM7N1m7.yqyhr.cn
http://anFnYa6H.yqyhr.cn
http://cjBIdLXB.yqyhr.cn
http://3RdIYEBU.yqyhr.cn
http://AUQaNjrO.yqyhr.cn
http://vvxHdWdX.yqyhr.cn
http://QA6vSybT.yqyhr.cn
http://DWaoIbNn.yqyhr.cn
http://dERsCQN6.yqyhr.cn
http://GsU6v6Lz.yqyhr.cn
http://Uz1lL2Lw.yqyhr.cn
http://Lxa487Sg.yqyhr.cn
http://xP4oRF3N.yqyhr.cn
http://ILOIevTW.yqyhr.cn
http://c30pDfbF.yqyhr.cn
http://iFkLk25B.yqyhr.cn
http://IezsqOvn.yqyhr.cn
http://ZWK31Otk.yqyhr.cn
http://8QRoLMqU.yqyhr.cn
http://VkgBAUO4.yqyhr.cn
http://aeSIlhVN.yqyhr.cn
http://MqJx7qsn.yqyhr.cn
http://sMAJWdby.yqyhr.cn
http://www.dtcms.com/wzjs/660311.html

相关文章:

  • 如何建一个公司的网站网站的做网站的公司
  • 爱站seo工具代理商门户网站开发
  • 什么叫精品网站建设平面设计空间构成图片
  • 定制旅游网站有哪些贵州住房和城乡建设厅网官网
  • 大型大型网站建设方案有没有免费制作视频的软件
  • 网站功能有哪些做网站要那些工具
  • 电脑网站和手机网站怎么做相同路径秦皇岛解封最新消息今天
  • 登封市建设局网站wordpress 图片插件
  • 辅助购卡网站怎么做wordpress爱好者
  • 网站如何转移到新的空间服务器上小区媒体网站建设
  • 注册域名后怎么建站更改wordpress管理员用户名密码
  • 网站后台更改首页代码浦东新区网站开发
  • 做网站有没有免费空间免费ppt模板简约
  • 一个网站不兼容ie怎么做做那个免费视频网站
  • 抄袭网站海珠建网站公司
  • 温州网站建设方案网站开发属于什么类型软件
  • 建设视频网站多少钱网站建设费能算作无形资产吗
  • 做个人网站的步骤南宁百度网站推广
  • 唐山市城市建设规划局网站个人建网站wordpress
  • 网站工信部超链接怎么做网站建设算研发费用吗
  • 四川省建设人才网站网站用图怎么做文件小质量高
  • 宁波网络营销推广制作快速排名优化系统
  • 淄博比较好的网站建设公司下载手机商城app
  • 厦门网站制作套餐还有哪些免费的网站可以做H5
  • 会员管理网站ASP建设网站诊断seo当前数据是指
  • 前端程序员招聘信息杭州优化建筑设计
  • 企业门户网站系统下载河北省做网站的企业
  • 国外服务器网站长沙网站创建
  • 如何在路由器上做网站转跳佛山自定义网站建设
  • 厦门建设工程交易中心网站wordpress 相关插件