题意:

  给定长度为n的序列和q次询问。每次询问给出一个区间(L,R),求出区间内每个数第一次出现位置的中位数,强制在线。

题解:

  用主席树从右向左的插入点。对于当前点i,如果a[i]出现过,则把原位置-1,i处+1。这样保证了每个点只出现1次。

  对于询问区间(L,R),求出L节点[L,R]的值即为区间内有多少不同的数。最后就是主席树求k_th的操作。倒着插省去了二分的复杂度。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 2e5+10;
int t, n, q, tot;
int l, r;
int a[N];
int root[N], vis[N];
int ans[N];
struct node {int l, r, sum;
}tre[N*40];
void update(int l, int r, int &x, int y, int pos, int val) {tre[++tot] = tre[y];tre[tot].sum += val;x = tot;if(l==r) return ;int mid = l+r>>1;if(pos<=mid) update(l, mid, tre[x].l, tre[y].l, pos, val);else update(mid+1, r, tre[x].r, tre[y].r, pos, val);
}
int query(int l, int r, int x, int ql, int qr) {if(ql<=l&&r<=qr) return tre[x].sum;int mid = l+r>>1;int res = 0;if(ql<=mid) res += query(l, mid, tre[x].l, ql, qr);if(qr>mid) res += query(mid+1, r, tre[x].r, ql, qr);return res;
}
int find_kth(int l, int r, int x, int k) {if(l==r) return l;int mid = l+r>>1;int t = tre[tre[x].l].sum;if(t>=k) return find_kth(l, mid, tre[x].l, k);return find_kth(mid+1, r, tre[x].r, k-t);
}
int main() {scanf("%d", &t);for(int casee = 1; casee <= t; casee++) {memset(vis, 0, sizeof(vis));tot = 0;scanf("%d%d", &n, &q);root[n+1] = 0;for(int i = 1; i <= n; i++) scanf("%d", &a[i]);for(int i = n; i >= 1; i--) {update(1, n, root[i], root[i+1], i, 1);if(vis[a[i]]) update(1, n, root[i], root[i], vis[a[i]], -1);vis[a[i]] = i;}ans[0] = 0;printf("Case #%d: ", casee);for(int i = 1; i <= q; i++) {scanf("%d%d", &l, &r);int tt = l;l = min((l+ans[i-1])%n+1, (r+ans[i-1])%n+1);r = max((tt+ans[i-1])%n+1, (r+ans[i-1])%n+1);int k = query(1, n, root[l], l, r);ans[i] = find_kth(1, n, root[l], (k+1)/2);printf("%d", ans[i]);if(i!=q) printf(" ");}puts("");}
}

View Code

转载于:https://www.cnblogs.com/Pneuis/p/9096643.html

HDU - 5919 Sequence II相关推荐

  1. HDU - 5919 Sequence II——主席树+区间种类++逆序建树

    [题目描述] HDU - 5919 Sequence II [题目分析] 题目给定一个数组,每次查询一个区间,找出区间内不同数字的个数x,然后输出按出现顺序第x/2向上取整个数字的位置. 按照要求,我 ...

  2. HDU 5919 Sequence II 主席树

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5919 Sequence II Time Limit: 9000/4500 MS (Java/Othe ...

  3. HDU - 5919 Sequence II(主席树+思维)

    题目链接:点击查看 题目大意:给出一个长度为 n 的数列 a ,再给出 m 次询问,每次询问给出一个区间 [ l , r ] ,问区间 [ l , r ] 内首次出现的数字的位置的中位数 题目分析:题 ...

  4. Sequence II (HDU 5919)(主席树)

    Sequence II 题目大意是有mmm次询问,每次询问一段区间[l,r][l, r][l,r],从左到右,如果这个数是在这个区间第一次出现,则记录下其下标, 我们会得到一个新的数组,要求这个数组的 ...

  5. HDOJ 5147 Sequence II 树阵

    树阵: 每个号码的前面维修比其数数少,和大量的这后一种数比他的数字 再枚举每一个位置组合一下 Sequence II Time Limit: 5000/2500 MS (Java/Others)    ...

  6. HDU 3397 Sequence operation(线段树)

    HDU 3397 Sequence operation 题目链接 题意:给定一个01序列,有5种操作 0 a b [a.b]区间置为0 1 a b [a,b]区间置为1 2 a b [a,b]区间0变 ...

  7. 2016CCPC长春:Sequence II(主席树)

    问题概述:n个数q次查询,每次查询(l,r)表示查询区间[l,r]内所有不同数字第一次出现的下标,输出这些下标中位数 特殊:如果下标数sum为偶数个,则输出第sum/2个下标,且强制在线,每一组的l和 ...

  8. hdu 3397 Sequence operation(线段树,lazy,区间合并)

    hdu 3397 Sequence operation 线段树lazy和区间合并结合的一个题,相当于几个题集中到一起嘛,分开想就好了 0,1,2操作都要lazy,2的异或操作找到每一只含1或只含0的区 ...

  9. Sequence II HDU - 5919(主席树)

    Mr. Frog has an integer sequence of length n, which can be denoted as a1,a2,⋯,ana1,a2,⋯,an There are ...

最新文章

  1. 【计算机图形学】六面体旋转并实时切换虚线实线 - 代码实现
  2. FPGA中时钟相关概念
  3. iOS 15.2计划上线“数字遗产”!网友:管的真远,身后事都替我操心?
  4. 智能工作:人工智能将如何重塑远程工作
  5. 用html5做一条线,使用HTML5 canvas绘制线条的方法
  6. 记一次 .NET 某外贸Web站 内存泄漏分析
  7. Debian10降级安装php,如何在Debian 10 Linux上安装PHP
  8. Android的权限
  9. Python附带了大量的库 - 初学者如何学起
  10. 硬件基础知识(12)---为什么我的处理器这么耗电?原因不只是一个小小的限流电阻.
  11. java 时间戳转换成时间_java 10位时间戳 转成时间
  12. jquery绑定方法on的
  13. Spring事务传播实验剖析(一)
  14. 发字的楷书写法图片_硬笔书法笔顺正确写法,手写示范动态图
  15. 拳皇FANS们不得不看的动画
  16. yolov3的weights文件获取方法(yolov3-spp.weights等等)
  17. office表格标题和表格距离过大怎么解决
  18. php 获取当前域名大胡子,养黄金大胡子的小经验
  19. Mac下Aria2加速各种网盘下载,你值得拥有!
  20. 10100cpu支持Linux,i3-10100 cpu能装win7吗?i3-10100 装win7详细教程(完美支持)

热门文章

  1. c语言 有趣的代码,分享一段有趣的小代码
  2. CCNA-第七篇-思科私有路由协议-EIGRP-初级
  3. 【51nod - 1108】距离之和最小 V2(曼哈顿距离,中位数性质)
  4. 【nyoj 47】 过河问题(思维)
  5. Waymo自动驾驶数据集介绍与使用教程
  6. CS231n Convolutional Neural Networks for Visual Recognition------Scipy and MatplotlibTutorial
  7. java11创建项目_2019-04-11 使用IDEA创建SpringBoot项目
  8. C++ 多态和虚函数
  9. 李牛(Linux)脚本
  10. 《Python Cookbook 3rd》笔记(1.2):拆分任意长可迭代对象后赋值给多个变量