一 题目

  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 【主席树】的更多相关文章

  1. SPOJ - 3267. D-query 主席树求区间个数

    SPOJ - 3267 主席树的又一种写法. 从后端点开始添加主席树, 然后如果遇到出现过的元素先把那个点删除, 再更新树, 最后查询区间就好了. #include<bits/stdc++.h& ...

  2. SPOJ DQUERY (主席树求区间不同数个数)

    题意:找n个数中无修改的区间不同数个数 题解:使用主席树在线做,我们不能使用权值线段树建主席树 我们需要这么想:从左向右添加一到主席树上,添加的是该数字处在的位置 但是如果该数字前面出现过,就在此版本 ...

  3. 【学术篇】SPOJ COT 树上主席树

    这是学完主席树去写的第二道题_(:з」∠)_ 之前用树上莫队水过了COT2... 其实COT也可以用树上莫队水过去不过好像复杂度要带个log还是怎么样可能会被卡常数.. 那就orz主席吧.... 写了 ...

  4. EC Round 33 F. Subtree Minimum Query 主席树/线段树合并

    这题非常好!!! 主席树版本 很简单的题目,给一个按照指定节点的树,树上有点权,你需要回答给定节点的子树中,和其距离不超过k的节点中,权值最小的. 肯定首先一想,按照dfs序列建树,然后按照深度为下标 ...

  5. 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 ...

  6. CF893F Subtree Minimum Query 主席树

    如果是求和就很好做了... 不是求和也无伤大雅.... 一维太难限制条件了,考虑二维限制 一维$dfs$序,一维$dep$序 询问$(x, k)$对应着在$dfs$上查$[dfn[x], dfn[x] ...

  7. SPOJ - DQUERY (主席树求区间不同数的个数)

    题目链接:https://vjudge.net/problem/SPOJ-DQUERY 题目大意:给定一个含有n个数的序列,有q个询问,每次询问区间[l,r]中不同数的个数. 解题思路:从左向右一个一 ...

  8. SPOJ - DQUERY D-query 主席树

    题意; 给一个数列$\{ a_i\}$ 一些询问$(l_i,r_i)$ 问你$[l,r]$有多少个不同元素 题解: 其实本质思路和离线化处理询问的线段树/树状数组写法差不多,对区间$[x,r]$来说, ...

  9. 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 ...

随机推荐

  1. ysoserial Commons Collections2反序列化研究

    Apache Commons Collections2反序列化研究 环境准备 JDK 1.7 Commons Collections 4.0 javassit 前置知识 PriorityQueue() ...

  2. JDK下载安装与卸载详解

    JDK下载安装 1. 下载: 推荐版本:JDK 8 (7.8目前广泛应用) 官网地址:https://www.oracle.com/cn/java/technologies/javase/javase ...

  3. Ubuntu pppoeconf失败

    之前是通过sudo pppoeconf一路yes就可以连通有线网络(dsl和ethernet)的, 系统再次瘫痪后终于进入图形界面, 有线网络丢失, sudo pppoeconf也fail了, 其实加 ...

  4. Storybook 最新教程

    Storybook 最新教程 Storybook is the most popular UI component development tool for React, Vue, and Angul ...

  5. Swift 5.3 All In One

    Swift 5.3 All In One refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!

  6. node os env reader

    node os env reader node-os-env-reader.js #!/usr/bin/env node "use strict"; /** * * @author ...

  7. JSDoc in action

    JSDoc in action JSDoc https://jsdoc.app/index.html https://github.com/jsdoc/jsdoc $ npm -g jsdoc $ n ...

  8. PWA & bug

    PWA bug https://developer.mozilla.org/zh-CN/docs/Web/Progressive_web_apps https://learning.xgqfrms.x ...

  9. nasm astrncat_s函数 x86

    xxx.asm: %define p1 ebp+8 %define p2 ebp+12 %define p3 ebp+16 %define p4 ebp+20 section .text global ...

  10. 为什么10月上线的NGK Global即将燎原资本市场

    近日据社区透露,NGK Global将在10月全面启动,数据公开透明,人人可以参与运营监管. 现在,区块链经济已经处于爆发前夜.金融行业的探索领先一筹,而其他行业的应用正在快速展开.区块链行业应用头部 ...