SPOJ D-query 【主席树】
一 题目
二 分析
主席树的运用。
这题首先应该考虑的是,如何分出种类数?再就是考虑如何维护区间信息?
最开始想的是直接离散化后用权值线段树建主席树,发现不行,因为假如$ [l,r] $的值在$l$之前已经出现了,那么直接用历史版本的相减肯定会出问题。所以排除此方法。
所以在维护历史版本的时候要同时更新各个种类值的最新位置。这样就保证了,在给定$[l,r]$后就可以根据$r$位置的权值线段树,找到比$l$大的数目就是答案。
三 AC代码
- 1 #include <bits/stdc++.h>
- 2
- 3 using namespace std;
- 4
- 5 const int MAXN = 3e4 + 15;
- 6 int n, q, a[MAXN], root[MAXN], tot;
- 7 struct Node
- 8 {
- 9 int l, r, c;
- 10 }T[MAXN*30];
- 11
- 12 void build(int &rt, int l, int r)
- 13 {
- 14 T[++tot].c = 0;
- 15 rt = tot;
- 16 if(l == r) return;
- 17 int mid = (l+r)>>1;
- 18 build(T[rt].l, l, mid);
- 19 build(T[rt].r, mid + 1, r);
- 20 }
- 21 void update(int &cur, int pre,int l, int r, int pos, int val)
- 22 {
- 23 T[++tot] = T[pre];
- 24 cur = tot;
- 25 T[cur].c += val;
- 26 if(l == r) return;
- 27 int m = (l + r) >> 1;
- 28 if(pos <= m)
- 29 update(T[cur].l, T[pre].l, l, m, pos, val);
- 30 else
- 31 update(T[cur].r, T[pre].r, m + 1, r, pos, val);
- 32 }
- 33 int query(int rt, int l, int r, int pos)
- 34 {
- 35
- 36 if(l >= pos) return T[rt].c;
- 37 int ans = 0;
- 38 int m = (l + r) >>1;
- 39 if(pos <= m)
- 40 {
- 41 ans += T[T[rt].r].c;
- 42 ans += query(T[rt].l, l, m, pos);
- 43 }
- 44 else
- 45 {
- 46 ans += query(T[rt].r, m + 1, r, pos);
- 47 }
- 48 return ans;
- 49 }
- 50 int main()
- 51 {
- 52 //freopen("in.txt", "r", stdin);
- 53 scanf("%d", &n);
- 54 for(int i = 1; i <= n; i++)
- 55 {
- 56 scanf("%d", &a[i]);
- 57 }
- 58 tot = 0;
- 59 build(root[0], 1, n);
- 60 map<int, int> mp;
- 61 for(int i = 1; i <= n; i++)
- 62 {
- 63 if(mp.find(a[i]) == mp.end())
- 64 update(root[i], root[i-1], 1, n, i, 1);
- 65 else
- 66 {
- 67 int tmp;
- 68 update(tmp, root[i-1], 1, n, mp[a[i]], -1);
- 69 update(root[i], tmp, 1, n, i, 1);
- 70 }
- 71 mp[a[i]] = i;
- 72 }
- 73 scanf("%d", &q);
- 74 for(int i = 0; i < q; i++)
- 75 {
- 76 int x, y;
- 77 scanf("%d%d", &x, &y);
- 78 printf("%d\n", query(root[y], 1, n, x));
- 79 }
- 80 return 0;
- 81 }
SPOJ D-query 【主席树】的更多相关文章
- SPOJ - 3267. D-query 主席树求区间个数
SPOJ - 3267 主席树的又一种写法. 从后端点开始添加主席树, 然后如果遇到出现过的元素先把那个点删除, 再更新树, 最后查询区间就好了. #include<bits/stdc++.h& ...
- SPOJ DQUERY (主席树求区间不同数个数)
题意:找n个数中无修改的区间不同数个数 题解:使用主席树在线做,我们不能使用权值线段树建主席树 我们需要这么想:从左向右添加一到主席树上,添加的是该数字处在的位置 但是如果该数字前面出现过,就在此版本 ...
- 【学术篇】SPOJ COT 树上主席树
这是学完主席树去写的第二道题_(:з」∠)_ 之前用树上莫队水过了COT2... 其实COT也可以用树上莫队水过去不过好像复杂度要带个log还是怎么样可能会被卡常数.. 那就orz主席吧.... 写了 ...
- EC Round 33 F. Subtree Minimum Query 主席树/线段树合并
这题非常好!!! 主席树版本 很简单的题目,给一个按照指定节点的树,树上有点权,你需要回答给定节点的子树中,和其距离不超过k的节点中,权值最小的. 肯定首先一想,按照dfs序列建树,然后按照深度为下标 ...
- Count on a tree SPOJ - COT (主席树,LCA)
You are given a tree with N nodes. The tree nodes are numbered from 1 to N. Each node has an integer ...
- CF893F Subtree Minimum Query 主席树
如果是求和就很好做了... 不是求和也无伤大雅.... 一维太难限制条件了,考虑二维限制 一维$dfs$序,一维$dep$序 询问$(x, k)$对应着在$dfs$上查$[dfn[x], dfn[x] ...
- SPOJ - DQUERY (主席树求区间不同数的个数)
题目链接:https://vjudge.net/problem/SPOJ-DQUERY 题目大意:给定一个含有n个数的序列,有q个询问,每次询问区间[l,r]中不同数的个数. 解题思路:从左向右一个一 ...
- SPOJ - DQUERY D-query 主席树
题意; 给一个数列$\{ a_i\}$ 一些询问$(l_i,r_i)$ 问你$[l,r]$有多少个不同元素 题解: 其实本质思路和离线化处理询问的线段树/树状数组写法差不多,对区间$[x,r]$来说, ...
- SPOJ Query on a tree III (树剖(dfs序)+主席树 || Splay等平衡树)(询问点)
You are given a node-labeled rooted tree with n nodes. Define the query (x, k): Find the node whose ...
随机推荐
- 实现基于股票收盘价的时间序列的统计(用Python实现)
时间序列是按时间顺序的一组真实的数字,比如股票的交易数据.通过分析时间序列,能挖掘出这组序列背后包含的规律,从而有效地预测未来的数据.在这部分里,将讲述基于时间序列的常用统计方法. 1 用rollin ...
- 缓冲区溢出实验 4 内存管理(类似于malloc free)
实验环境.代码.及准备 https://www.cnblogs.com/lqerio/p/12870834.html vul4 观察foo函数,可见问题在于最后一次tfree(q).由于之前已经tfr ...
- Java中输出小数点后几位
笔试时候,遇到让你写输出小数点后几位,当时很是头疼,下来后,查了查发现,没什么难的.网上有各种情况都讨论了(一般分为4种),在这里我着重讨论一下比较实用,比较简单,比较方便操作的几种: 1 publi ...
- 计算机网络 part1 TCP
一.TCP协议 references:newcoder TCP/IP协议,TCP和UDP的区别及特点 1.四层模型 应用层:载有应用程序,将数据发送给传输层.主要协议有HTTP.SMTP.FTP.DN ...
- HDU 3920 Clear All of Them I(状压DP)题解
题意:2n个点,一个起点,开n枪,每枪必须打两个点,花费为起点到其中一点距离加上两点距离.问打完2n个点的最小花费. 思路:很显然应该dp状态,然后枚举i j两个空位置去填,那么复杂度$O(20 * ...
- OpenCV3.2+Python3.5+Ubuntu16.04+缺少boostdesc和vgg_generated
问题: OpenCV3.2在cmake通过https无法获取boostdesc和vgg_generated2类文件 可尝试的解决方法: 参考, 依其方法至这里做调整, 最后注释xfeatures2d/ ...
- OAuth 2.0 All In One
OAuth 2.0 All In One 授权类型 授权代码 隐式 密码凭证 客户端凭证 授权码 授权码授予类型要求用户向提供者进行身份验证-然后将授权码发送回客户端应用程序,提取并与提供者交换以获取 ...
- D language
D language https://en.wikipedia.org/wiki/D_(programming_language) Dart https://dlang.org/ flutter fr ...
- Flutter: 显示&关闭系统叠加层ui
import 'package:flutter/services.dart'; /// 关闭 SystemChrome.setEnabledSystemUIOverlays([]); /// 显示 S ...
- 200万枚SPC空投来袭,这样的薅羊毛活动你确定不参加吗?
在过去的2020年,币圈真的是很火爆,很多人在参与数字货币交易或DeFi挖矿中赚到了大钱.但是转眼到了2021年,DeFi进入了下半场,区块链市场也进入了新的阶段,那么区块链的下一个爆点是什么呢?很多 ...