F. One Occurrence
time limit per test
3 seconds
memory limit per test
768 megabytes
input
standard input
output
standard output
You are given an array aa consisting of nn integers, and qq queries to it. ii-th query is denoted by two integers lili and riri. For each query, you have to find any integer that occurs exactly once in the subarray of aa from index lili to index riri (a subarray is a contiguous subsegment of an array). For example, if a=[1,1,2,3,2,4]a=[1,1,2,3,2,4], then for query (li=2,ri=6)(li=2,ri=6) the subarray we are interested in is [1,2,3,2,4][1,2,3,2,4], and possible answers are 11, 33 and 44; for query (li=1,ri=2)(li=1,ri=2) the subarray we are interested in is [1,1][1,1], and there is no such element that occurs exactly once.
Can you answer all of the queries?
Input
The first line contains one integer nn (1≤n≤5⋅1051≤n≤5⋅105).
The second line contains nn integers a1,a2,…,ana1,a2,…,an (1≤ai≤5⋅1051≤ai≤5⋅105).
The third line contains one integer qq (1≤q≤5⋅1051≤q≤5⋅105).
Then qq lines follow, ii-th line containing two integers lili and riri representing ii-th query (1≤li≤ri≤n1≤li≤ri≤n).
Output
Answer the queries as follows:
If there is no integer such that it occurs in the subarray from index lili to index riri exactly once, print 00. Otherwise print any such integer.
Example
input
Copy
6 1 1 2 3 2 4 2 2 6 1 2
output
Copy
4 0
莫队用了各种优化
一开始无限TLE,看了别人过的代码 发现基本没啥不同
最后竟然发现 vis 数组的类型如果是int 型 就会很大几率TLE ,char 型 和 bool 型 就能过 感觉好像是对比字节长度不同 花费的时间也会不同 。。。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<cstdlib>
#include<queue>
#include<set>
using namespace std;
const int Maxn = 500500;
struct node
{
int l,r,ID,num;
}q[Maxn];
int ans[Maxn],kind[Maxn];
int as[Maxn];
bool vis[Maxn];
int b,n,m;
inline bool cmp(const node &x,const node &y)
{
if (x.l/b<y.l/b)
return 1;
if (x.l/b>y.l/b)
return 0;
return ((x.l/b)&1)?x.r<y.r:x.r>y.r;
}
vector <int >vec;
inline void modify(int x,int add){
/*
if(kind[a[i]])
sum --;
*/
kind[ans[x]] += add;
if(kind[ans[x]] == 1 && vis[ans[x]] == 0)
{
vec.push_back(ans[x]);
vis[ans[x]] = 1;
}
}
inline void Read(int &x)
{
char c=getchar();
x=0;
while (c<'0'||c>'9')
{
c=getchar();
}
while (c>='0'&&c<='9')
{
x=x*10+c-'0';
c=getchar();
}
}
inline void Out(int a) //输出一个整型
{
if(a<0)
{
putchar('-');
a=-a;
}
if(a>9)
Out(a/10);
putchar(a%10+'0');
}
int main()
{
Read(n);
b = sqrt(n);
for(int i = 1;i <= n;++ i){
Read(ans[i]);
}
Read(m);
for(int i = 1;i <= m;++ i){
Read(q[i].l);
Read(q[i].r);
q[i].ID = i;
}
sort(q+1,q+1+m,cmp);
int l = 1,r = 0;
vec.push_back(0);
kind[0] = 1;
for(int i = 1;i <= m;++ i){
while(l > q[i].l){modify(--l,1);}
while(l < q[i].l){modify(l++,-1);}
while(r < q[i].r){modify(++r,1);}
while(r > q[i].r){modify(r--,-1);}
while(kind[vec.back()] != 1)
{
vis[vec.back()] = 0;
vec.pop_back();
}
as[q[i].ID] = vec.back();
}
for(int i = 1;i <= m;++ i){
Out(as[i]);
putchar('\n');
}
return 0;
}