HDU - 5919 Sequence II
题意:
给定长度为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相关推荐
- HDU - 5919 Sequence II——主席树+区间种类++逆序建树
[题目描述] HDU - 5919 Sequence II [题目分析] 题目给定一个数组,每次查询一个区间,找出区间内不同数字的个数x,然后输出按出现顺序第x/2向上取整个数字的位置. 按照要求,我 ...
- HDU 5919 Sequence II 主席树
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5919 Sequence II Time Limit: 9000/4500 MS (Java/Othe ...
- HDU - 5919 Sequence II(主席树+思维)
题目链接:点击查看 题目大意:给出一个长度为 n 的数列 a ,再给出 m 次询问,每次询问给出一个区间 [ l , r ] ,问区间 [ l , r ] 内首次出现的数字的位置的中位数 题目分析:题 ...
- Sequence II (HDU 5919)(主席树)
Sequence II 题目大意是有mmm次询问,每次询问一段区间[l,r][l, r][l,r],从左到右,如果这个数是在这个区间第一次出现,则记录下其下标, 我们会得到一个新的数组,要求这个数组的 ...
- HDOJ 5147 Sequence II 树阵
树阵: 每个号码的前面维修比其数数少,和大量的这后一种数比他的数字 再枚举每一个位置组合一下 Sequence II Time Limit: 5000/2500 MS (Java/Others) ...
- 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变 ...
- 2016CCPC长春:Sequence II(主席树)
问题概述:n个数q次查询,每次查询(l,r)表示查询区间[l,r]内所有不同数字第一次出现的下标,输出这些下标中位数 特殊:如果下标数sum为偶数个,则输出第sum/2个下标,且强制在线,每一组的l和 ...
- hdu 3397 Sequence operation(线段树,lazy,区间合并)
hdu 3397 Sequence operation 线段树lazy和区间合并结合的一个题,相当于几个题集中到一起嘛,分开想就好了 0,1,2操作都要lazy,2的异或操作找到每一只含1或只含0的区 ...
- 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 ...
最新文章
- 【计算机图形学】六面体旋转并实时切换虚线实线 - 代码实现
- FPGA中时钟相关概念
- iOS 15.2计划上线“数字遗产”!网友:管的真远,身后事都替我操心?
- 智能工作:人工智能将如何重塑远程工作
- 用html5做一条线,使用HTML5 canvas绘制线条的方法
- 记一次 .NET 某外贸Web站 内存泄漏分析
- Debian10降级安装php,如何在Debian 10 Linux上安装PHP
- Android的权限
- Python附带了大量的库 - 初学者如何学起
- 硬件基础知识(12)---为什么我的处理器这么耗电?原因不只是一个小小的限流电阻.
- java 时间戳转换成时间_java 10位时间戳 转成时间
- jquery绑定方法on的
- Spring事务传播实验剖析(一)
- 发字的楷书写法图片_硬笔书法笔顺正确写法,手写示范动态图
- 拳皇FANS们不得不看的动画
- yolov3的weights文件获取方法(yolov3-spp.weights等等)
- office表格标题和表格距离过大怎么解决
- php 获取当前域名大胡子,养黄金大胡子的小经验
- Mac下Aria2加速各种网盘下载,你值得拥有!
- 10100cpu支持Linux,i3-10100 cpu能装win7吗?i3-10100 装win7详细教程(完美支持)
热门文章
- c语言 有趣的代码,分享一段有趣的小代码
- CCNA-第七篇-思科私有路由协议-EIGRP-初级
- 【51nod - 1108】距离之和最小 V2(曼哈顿距离,中位数性质)
- 【nyoj 47】 过河问题(思维)
- Waymo自动驾驶数据集介绍与使用教程
- CS231n Convolutional Neural Networks for Visual Recognition------Scipy and MatplotlibTutorial
- java11创建项目_2019-04-11 使用IDEA创建SpringBoot项目
- C++ 多态和虚函数
- 李牛(Linux)脚本
- 《Python Cookbook 3rd》笔记(1.2):拆分任意长可迭代对象后赋值给多个变量