CodeChef DISTNUM2 Easy Queries 节点数组线段树
Description
You are given an array A consisting of N positive integers. You have to answer Q queries on it of following type:
- l r k : Let S denote the sorted (in increasing order) set of elements of array A with its indices between l and r. Note that set Scontains distinct elements (i.e. no duplicates).
You need to find kth number in it. If such a number does not exist, i.e. the S has less than k elements, output -1.
All the indices in the queries are 1-based.
Input
The first line of input contains two space separated integers N and Q denoting the number of elements in A, and the number of queries, respectively.
The second line of input contains N space separated integers denoting the array A.
Each of the next Q lines contains five integers ai, bi, ci, di, ki.
We will generate li, ri indices for this query as follows:
Let answer for i - 1th query equal ansi - 1.
For 0th query ans0 = 0.
Define li = (ai x max(ansi - 1, 0) + bi) mod N + 1,
ri = (ci x max(ansi-1, 0) + di) mod N + 1.
If li > ri, then swap li and ri.
Output
For each query, output the answer to the query in a single line. If such a number doesn't exist, output -1.
Constraints
- 1 ≤ N, Q ≤ 105
- 1 ≤ Ai ≤ 109
- 0 ≤ ai, bi, ci, di ≤ N
- 1 ≤ li ≤ ri ≤ N
- 1 ≤ ki ≤ N
Example
Input:
4 4
3 2 1 2
0 1 0 3 2
2 0 0 3 4
1 2 1 3 2
2 0 0 3 3 Output:
2
-1
2
3 Input:
10 10
9 10 6 3 8 4 9 6 4 10
0 2 0 9 3
1 9 1 3 3
1 8 1 0 3
1 2 1 7 2
1 6 1 2 3
1 4 1 3 1
1 6 1 6 1
1 4 1 8 1
1 9 1 3 3
1 9 1 2 1 Output:
6
9
10
4
6
3
10
4
6
4
Subtasks
- Subtask #1 (10 points) : Q x N ≤ 107
- Subtask #2 (20 points) : ki = 1
- Subtask #3 (30 points) : ai = 0, ci = 0
- Subtask #4 (40 points) : Original constraints
Explanation
Example #1:
Query 1. Sorted set of elements : {1, 2}. Second number in this is 2.
Query 2. Sorted set of elements : {1, 2, 3}. Fourth number doesn't exist, hence answer is -1.
Query 3. Sorted set of elements : {1, 2}. Second number in this set is 2.
Query 4. Sorted set of elements : {1, 2, 3}. Third number in this set is 3.
题意:
给定长度为N的序列A,其中每个元素都有正整数。
你需要回答Q个询问:
l,r,k:记s为序列 A下标在l到r之间的元素按照升序排列得到的序列(重复元素只留一个)。
你需要求出其第k个元素的值,如果包含小于k个元素,则输出-1.
下标从1开始编号
题解:
线段树,每个节点保存不含重复元素的动态数组
查询的时候二分就OK 复杂度O( q*logn*logn)
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
const int N = 1e5+, M = 2e2+, inf = 2e9, mod = 1e9+;
typedef long long ll;
int n, q;
ll ar[N],num[N];
vector< ll > da[ * N];
void merges(vector<ll> &a, vector<ll> &b, vector<ll> &c)
{
int lenb = , lenc = ;
while(lenb < b.size() && lenc < c.size()) {
if(b[lenb] == c[lenc]) {
a.push_back(b[lenb]);
lenb++, lenc++;
}else {
if(b[lenb] < c[lenc]) {
a.push_back(b[lenb++]);
} else a.push_back(c[lenc++]); }
}
while(lenb < b.size()) {
a.push_back(b[lenb++]);
}
while(lenc < c.size()) {
a.push_back(c[lenc++]);
}
} void build(int k,int l,int r) {
if(r == l) {
da[k].push_back(ar[l]);
return ;
}
build(k<<,l,(l+r)/);build(k<<|,(r+l)/+,r);
merges(da[k],da[k<<],da[k<<|]);
}
ll query(int i,int j,ll x,int k,int l,int r) {
if(i==l&&j==r) return upper_bound(da[k].begin(),da[k].end(),x) - da[k].begin();
else {
int mid = (l+r)>>;
if(j<=mid) return query(i,j,x,k<<,l,mid);
else if(i>mid) return query(i,j,x,k<<|,mid+,r);
else return query(i,mid,x,k<<,l,mid)+query(mid+,j,x,k<<|,mid+,r);
}
} ll solve(int l,int r,int k) {
int lb = , rb = n, ans = ;
while(lb<=rb) {
int mid = (lb+rb)>>;
if(query(l,r,num[mid],,,n)>=k) rb = mid-, ans = mid;
else lb = mid + ;
// cout<<1<<endl;
}
if(query(l,r,num[ans],,,n)<k) {
return -;
}
else return num[ans];
}
int main()
{
scanf("%d%d",&n,&q);
for(int i=;i<=n;i++) scanf("%lld",&ar[i]), num[i] = ar[i];
sort(num+,num+n+);
build(,,n);
ll pre = ;
for(int i=;i<=q;i++) {
ll a,b,c,d,k;
scanf("%lld%lld%lld%lld%lld",&a,&b,&c,&d,&k);
int l = (a*max(pre,0ll)+b) % n + ;
int r = (c*max(pre,0ll)+d) % n + ;
printf("%d\n",pre = solve(l,r,k));
}
}
CodeChef DISTNUM2 Easy Queries 节点数组线段树的更多相关文章
- 洛谷P2414 阿狸的打字机 [NOI2011] AC自动机+树状数组/线段树
正解:AC自动机+树状数组/线段树 解题报告: 传送门! 这道题,首先想到暴力思路还是不难的,首先看到y有那么多个,菜鸡如我还不怎么会可持久化之类的,那就直接排个序什么的然后按顺序做就好,这样听说有7 ...
- Can you answer these queries? HDU 4027 线段树
Can you answer these queries? HDU 4027 线段树 题意 是说有从1到编号的船,每个船都有自己战斗值,然后我方有一个秘密武器,可以使得从一段编号内的船的战斗值变为原来 ...
- 树状数组 && 线段树应用 -- 求逆序数
参考:算法学习(二)——树状数组求逆序数 .线段树或树状数组求逆序数(附例题) 应用树状数组 || 线段树求逆序数是一种很巧妙的技巧,这个技巧的关键在于如何把原来单纯的求区间和操作转换为 求小于等于a ...
- hdu1394(枚举/树状数组/线段树单点更新&区间求和)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题意:给出一个循环数组,求其逆序对最少为多少: 思路:对于逆序对: 交换两个相邻数,逆序数 +1 ...
- BZOJ 4636 (动态开节点)线段树
思路: 偷懒 懒得离散化 搞了个动态开节点的线段树 (其实是一样的--..) 注意会有a=b的情况 要判掉 //By SiriusRen #include <cstdio> #includ ...
- [Codeforces 266E]More Queries to Array...(线段树+二项式定理)
[Codeforces 266E]More Queries to Array...(线段树+二项式定理) 题面 维护一个长度为\(n\)的序列\(a\),\(m\)个操作 区间赋值为\(x\) 查询\ ...
- hdu 5147 Sequence II【树状数组/线段树】
Sequence IITime Limit: 5000/2500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem ...
- SPOJ GSS2 - Can you answer these queries II(线段树 区间修改+区间查询)(后缀和)
GSS2 - Can you answer these queries II #tree Being a completist and a simplist, kid Yang Zhe cannot ...
- hdu 1166:敌兵布阵(树状数组 / 线段树,入门练习题)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
随机推荐
- Oracle 客户端配置
nstantclient-basic-nt-12.1.0.1.0\instantclient_12_1下面新建NETWORK文件夹,NETWORK下新建ADMIN文件夹,ADMIN下新建tnsname ...
- iOS开发摇动手势实现详解
1.当设备摇动时,系统会算出加速计的值,并告知是否发生了摇动手势.系统只会运动开始和结束时通知你,并不会在运动发生的整个过程中始终向你报告每一次运动.例如,你快速摇动设备三次,那只会收到一个摇动事件. ...
- centos6.4yum搭建lamp环境
1.配置防火墙,开启80端口.3306端口vi /etc/sysconfig/iptables-A INPUT -m state --state NEW -m tcp -p tcp --dport 8 ...
- Object、Function、String、Array原生对象扩展方法
JavaScript原生对象的api有些情况下使用并不方便,考虑扩展基于Object.Function.String.Array扩展,参考了prototype.js的部分实现,做了提取和修改,分享下: ...
- 自定义 array_map() 对应的递归函数 array_map_recursive()
array_walk 有个原生递归函数 array_walk_recursive($arr, 'function', 'words'),但是 array_map 却没有对应的递归函数 array_ma ...
- Unity3D 4.x 使用Mecanim实现连击
http://blog.csdn.net/onerain88/article/details/12854817 Unity3D 4.x 版本之后提供了一种新的动画机制Mecanim,虽然目前还支持之前 ...
- 采用Unity快速开发高质量游戏的若干优化建议
http://files.cnblogs.com/123ing/%E9%87%87%E7%94%A8Unity%E5%BF%AB%E9%80%9F%E5%BC%80%E5%8F%91%E9%AB%98 ...
- WPF 样式和行为
样式(style):组织和重用格式化选项的重要工具,将细节如边距.字体.字号等信息封装起来,然后再需要的地方通过属性来应用样式. 行为(behavior):封装一些通用的UI行为,如拖动,缩放元素的代 ...
- WPF 元素绑定
1.什么是数据绑定数据绑定是一种关系,WPF程序从源对象中提取一些信息,并根据这些信息设置目标对象的属性,目标属性作为依赖项属性.源对象可以是任何内容,可以是另一个wpf内容,甚至是自行创建的纯数据对 ...
- DCMTK3.6.0(MD支持库)安装说明
一.运行环境:WIN7 32bit + VisualStudio2008 + dcmtk3.6.0 + Cmake2.8.8 或者 WIN7 64bit 二.准备工作: 1)MD/MT的知识储备: / ...