C. Not Equal on a Segment(codeforces)
1 second
256 megabytes
standard input
standard output
You are given array a with n integers and m queries. The i-th query is given with three integers li, ri, xi.
For the i-th query find any position pi (li ≤ pi ≤ ri) so that api ≠ xi.
The first line contains two integers n, m (1 ≤ n, m ≤ 2·105) — the number of elements in a and the number of queries.
The second line contains n integers ai (1 ≤ ai ≤ 106) — the elements of the array a.
Each of the next m lines contains three integers li, ri, xi (1 ≤ li ≤ ri ≤ n, 1 ≤ xi ≤ 106) — the parameters of the i-th query.
Print m lines. On the i-th line print integer pi — the position of any number not equal to xi in segment [li, ri] or the value - 1 if there is no such number.
6 4
1 2 1 1 3 5
1 4 1
2 6 2
3 4 1
3 4 2
2
6
-1
4
思路:求要询问的区间的最大和最小数,求出它们的下标,和所问的数比较,如果两个都和之相等则在这个区间无和他不同的,否则取最大和最小与之不同的下标即可,用线段树去维护每个区间最大最小值
复杂度为(n*logn);
1 #include<stdio.h>
2 #include<algorithm>
3 #include<iostream>
4 #include<string.h>
5 #include<stdlib.h>
6 #include<math.h>
7 #include<cstdio>
8 #include<queue>
9 #include<stack>
10 #include<map>
11 int ask(int l,int r,int aa,int bb,int k);
12 int ask1(int l,int r,int aa,int bb,int k);
13 void build(int l,int r,int k);
14 using namespace std;
15 typedef long long ll;
16 int tree[1000000];
17 int tree2[1000000];
18 int a[400005];
19 int main(void)
20 {
21 int i,j,k,p,q;
22 tree[0]=0;
23 int nn,mm,kk;
24 while(scanf("%d %d",&p,&q)!=EOF)
25 {
26 for(i=1; i<=p; i++)
27 {
28 scanf("%d",&a[i]);
29 }
30 build(1,p,0);
31 while(q--)
32 {
33 scanf("%d %d %d",&nn,&mm,&kk);
34 a[0]=0;
35 int maxxid=ask(nn,mm,1,p,0);
36 a[0]=1e8;
37 int minnid=ask1(nn,mm,1,p,0);
38 int maxx=a[maxxid];
39 int minn=a[minnid];
40 if(kk==maxx&&kk==minn)
41 {
42 printf("-1\n");
43 }
44 else
45 {
46 if(kk!=maxx)
47 {
48 printf("%d\n",maxxid);
49 }
50 else printf("%d\n",minnid);
51 }
52 }
53 }
54 return 0;
55 }
56
57 void build(int l,int r,int k)
58 {
59 if(l==r)
60 {
61 tree[k]=l;
62 tree2[k]=l;
63 return ;
64 }
65 else
66 {
67 build(l,(l+r)/2,2*k+1);
68 build((l+r)/2+1,r,2*k+2);
69 tree[k]=a[tree[2*k+1]]>a[tree[2*k+2]]?tree[2*k+1]:tree[2*k+2];
70 tree2[k]=a[tree2[2*k+1]]<a[tree2[2*k+2]]?tree2[2*k+1]:tree2[2*k+2];
71 }
72 }
73 int ask(int l,int r,int aa,int bb,int k)
74 {
75 if(l>bb||r<aa)
76 {
77 return 0;
78 }
79 else if(l<=aa&&r>=bb)
80 {
81 return tree[k];
82 }
83 else
84 {
85 int ll=ask(l,r,aa,(aa+bb)/2,2*k+1);
86 int uu=ask(l,r,(aa+bb)/2+1,bb,2*k+2);
87 return a[ll]>a[uu]?ll:uu;
88 }
89
90 }
91 int ask1(int l,int r,int aa,int bb,int k)
92 {
93 if(l>bb||r<aa)
94 {
95 return 0;
96 }
97 else if(l<=aa&&r>=bb)
98 {
99 return tree2[k];
100 }
101 else
102 {
103 int ll=ask1(l,r,aa,(aa+bb)/2,2*k+1);
104 int uu=ask1(l,r,(aa+bb)/2+1,bb,2*k+2);
105 return a[ll]<a[uu]?ll:uu;
106 }
107 }
C. Not Equal on a Segment(codeforces)的更多相关文章
- Educational Codeforces Round 7 C. Not Equal on a Segment 并查集
C. Not Equal on a Segment 题目连接: http://www.codeforces.com/contest/622/problem/C Description You are ...
- codeforces 622C C. Not Equal on a Segment
C. Not Equal on a Segment time limit per test 1 second memory limit per test 256 megabytes input sta ...
- Codeforces 622C Not Equal on a Segment 【线段树 Or DP】
题目链接: http://codeforces.com/problemset/problem/622/C 题意: 给定序列,若干查询,每个查询给定区间和t,输出区间内任意一个不等于t的元素的位置. 分 ...
- CodeForces 622C Not Equal on a Segment
预处理p[i],p[i]表示:[p[i],i]这段闭区间上所有数字都是a[i] 询问的时候,如果xi==a[ri]并且p[ri]<=li,一定无解 剩下的情况都是有解的,如果xi!=a[ri], ...
- CF622C Not Equal on a Segment
题目链接: http://codeforces.com/problemset/problem/622/C 题目大意: 给定一个长度为n(n不超过200000)的序列,有m(m不超过200000)次询问 ...
- HZNU 2019 Summer training 6 -CodeForces - 622
A - Infinite Sequence CodeForces - 622A 题目大意:给你一个这样的数列1,1,2,1,2,3,1,2,3,4,1,2,3,4,5....就是从1~n排列(n++ ...
- CF242E XOR on Segment
CF242E XOR on Segment codeforces 洛谷 关于异或,无法运用懒标记实现区间异或: 可以像trie树一样拆位,将每个值拆成二进制数,对此建相应个数的线段树. 0 1与 0异 ...
- Educational Codeforces Round 7
622A - Infinite Sequence 20171123 暴力枚举\(n\)在哪个区间即可,时间复杂度为\(O(\sqrt{n})\) #include<stdlib.h> ...
- 【cf比赛记录】Codeforces Round #605 (Div. 3)
比赛传送门 Div3真的是暴力杯,比div2还暴力吧(这不是明摆的嘛),所以对我这种一根筋的挺麻烦的,比如A题就自己没转过头来浪费了很久,后来才醒悟过来了.然后这次竟然还上分了...... A题:爆搜 ...
随机推荐
- 在windows 10家庭版上安装docker的步骤
本人之前写Redis书和Spring Cloud Alibaba书时,发现一些分布式组件更适合安装在linux环境,而在搭建Redis等集群时,更需要linux环境. 本人日常练习代码和写书所用的机器 ...
- 扩展kmp 学习笔记
学习了一下这个较为冷门的知识,由于从日报开始看起,还是比较绕的-- 首先定义 \(Z\) 函数表示后缀 \(i\) 与整个串的 \(lcp\) 长度 一个比较好的理解于实现方式是类似于 \(manac ...
- A Child's History of England.45
To forgive these unworthy princes was only to afford them breathing-time for new faithlessness. They ...
- A Child's History of England.36
CHAPTER 11 ENGLAND UNDER MATILDA AND STEPHEN The King was no sooner dead than all the plans and sche ...
- Hive(八)【行转列、列转行】
目录 一.行转列 相关函数 concat concat_ws collect_set collect_list 需求 需求分析 数据准备 写SQL 二.列转行 相关函数 split explode l ...
- python下载openpyxl
直接下载openpyxl报错 ERROR: Command errored out with exit status 1: python setup.py egg_info Check the log ...
- JAXB—Java类与XML文件之间转换
JAXB-Java类与XML文件之间转换 简介 JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生 ...
- Java事务与JTA
一.什么是JAVA事务 通俗的理解,事务是一组原子操作单元,从数据库角度说,就是一组SQL指令,要么全部执行成功,若因为某个原因其中一条指令执行有错误,则撤销先前执行过的所有指令.更简答的说就是:要么 ...
- Spring.DM web开发环境搭建
作为一个初学者来说,搭建好Spring.DM 的web开发环境还是有些麻烦的.我就遇到了N多麻烦,走了很多弯路.本文介绍了2种比较简单的搭建Spring.DM OSGi web开发环境的搭建. 第 ...
- 【Python】【Module】json and pickle
Python中用于序列化的两个模块 json 用于[字符串]和 [python基本数据类型] 间进行转换 pickle 用于[python特有的类型] 和 [python基本数据类型]间进 ...