这是我要解决的问题,我正在使用The Fact That Prefix Sum[i] - Prefix Sum[i-1]
导致频率大于零的频率来标识不同的数字,然后消除频率,但是即使使用BIT,我也获得了标题
给定n个数字a1,a2,…,an和多个d查询的序列。
d查询是一对(i,j)(1≤i≤j≤n)。
对于每个d查询(i,j),您必须返回子序列ai,ai + 1,…,aj中不同元素的数量。
Input
Line 1: n (1 ≤ n ≤ 30000).
Line 2: n numbers a1, a2, ..., an (1 ≤ ai ≤ 106).
Line 3: q (1 ≤ q ≤ 200000), the number of d-queries.
In the next q lines, each line contains 2 numbers i, j
representing a d-query (1 ≤ i ≤ j ≤ n).
Output
For each d-query (i, j), print the number of distinct elements in the
subsequence ai, ai+1, ..., aj in a single line.
Example
Input
5
1 1 2 1 3
3
1 5
2 4
3 5
Output
3
2
3
代码是:
#include <iostream>
#include <algorithm>
#include <vector>
#include <stdlib.h>
#include <stdio.h>
typedef long long int ll;
using namespace std;
void update(ll n, ll val, vector<ll> &b);
ll read(ll n,vector<ll> &b);
ll readsingle(ll n,vector<ll> &b);
void map(vector<ll> &a,vector<ll> &b,ll n) /**** RElative Mapping ***/
{
ll temp;
a.clear();
b.clear();
for(ll i=0; i<n; i++)
{
cin>>temp;
a.push_back(temp);
b.push_back(temp);
}
sort(b.begin(),b.end());
for(ll i=0; i<n; i++)
*(a.begin()+i) = (lower_bound(b.begin(),b.end(),a[i])-b.begin())+1;
b.assign(n+1,0);
}
int main()
{
ll n;
cin>>n;
vector<ll> a,b;
map(a,b,n);
ll t;
cin>>t;
while(t--)
{
ll l ,u;
b.assign(n+1,0);
cin>>l>>u;
l--;/*** Reduce For Zero Based INdex ****/
u--;
for(ll i=l;i<=u;i++)
update(a[i],1,b);
ll cont=0;
for(ll i=l;i<=u;i++)
if(readsingle(a[i],b)>0)
{
cont++;
update(a[i],-readsingle(a[i],b),b); /***Eliminate The Frequency */
}
cout<<cont<<endl;
}
return 0;
}
ll readsingle(ll n,vector<ll> &b)
{
return read(n,b)-read(n-1,b);
}
ll read(ll n,vector<ll> &b)
{
ll sum=0;
for(; n; sum+=b[n],n-=n&-n);
return sum;
}
void update(ll n, ll val, vector<ll> &b)
{
for(; n<=b.size(); b[n]+=val,n+=n&-n);
}
您使用的算法太慢。对于每个查询,您都要遍历整个查询范围,而整个查询范围已经提供了n * q
操作(显然,这太多了)。这是一个更好的解决方案(它具有O((n + q) * log n)
时间和O(n + q)
空间复杂性(这是一个脱机解决方案):
让我们按其右端对所有查询进行排序(无需显式对它们进行排序,您只需将查询添加到适当的位置(从0
到n - 1
))。
现在让我们从左到右遍历数组中的所有位置并保持BIT。BIT中的每个位置要么是1
(表示在位置有一个新元素i
),要么是0
(最初是用零填充)。
对于每个元素a[i]
:如果它是该元素的第一次出现,则只需i
在BIT中的位置添加一个即可。否则,将其添加-1
到该元素上一次出现的位置,然后添加1
到该i
位置。
查询的答案(left, right)
只是从left
到的所有元素的总和right
。
要维护每个元素的最后一次出现,可以使用地图。
可以使用持久性段树使其联机(时间复杂度是相同的,相同的复杂度将变为O(n * log n + q)
),但是这里并不需要。
编辑:此处不允许的消息不再显示。 我正在使用Volley访问google books,api是IcecreamSandwich。即使包括对清单文件的权限,我仍然会得到关于权限的异常。我已经读了一些已回答的问题(这个,这个)。当光标指向时,表示此处不允许使用该标记。我该如何解决问题呢? logcat:
我对Android Studio和Android编程都很陌生。我刚刚读了关于第一个common Intent教程的内容,它是关于。我试着编写一个简单的代码来测试这个意图,但是抛出的无效,堆栈跟踪如下所示: 05-20 15:36:25.010 2342-2342/com。维法隆。helloandroid E/AndroidRuntime:致命异常:主进程:com。维法隆。helloandroid,
问题内容: 有人可以告诉我线程开始执行的顺序吗?我写了下面的代码 还有这个 当我执行此代码时,我得到许多不同的输出。 另一个, 为什么会这样呢?线程顺序永远不会相同吗?如果有人可以给我一些有关线程和示例基础的知识,那就太好了。PS:我是线程的新手,这是我的第一个线程程序。提前致谢。 问题答案: 当我执行此代码时,我得到许多不同的输出。 这是预期的。该顺序未定义,并且随着线程开始运行并由OS进行线程
我看了stackoverflow上关于漂亮汤的大部分问题,只从网站上抓取了一半的数据,但是到目前为止没有一个有效。我尝试过将该功能更改为lxml或html5lib等。我也尝试使用硒,现在我尝试用硒向下滚动网站,加载网站上的所有内容,并使用漂亮的汤来抓取数据,但是当需要超过100个项目时,它只保留抓取16个项目。我在下面附上了我的代码。 我试图刮掉的网站链接:https://www.ranker.c
我试图发布一个有效载荷到我们的后端系统从我的UWP应用程序。为此,我首先做一个GET来获取CSRF令牌,然后将其添加到POST请求的标题中。虽然发布,我仍然得到403禁止错误。 我正在用“失眠症”REST客户端进行交叉测试,通过执行单独的GET和POST请求,并将从GET获取的CSRF令牌提供给POST头,它工作正常。 我是新来的C#,所以请原谅不好的编码标准。 拿到代币 我收到了带有csrf令牌
我有下面的代码: 联机System.NullReferenceException:DownloadLinkList.Add(Item.SelectSingleNode(“.//a”).Attributes[“href”].Value); 怎样才能妥善处理,让它不再崩溃?我的印象是,它应该只是跳过前面。 使用也不是一个选项,因为我仍然需要没有所需的的某个页面的信息。
使用图形api, 创建了一个应用 更新了其权限以包括domain.read.all 之后,我要求管理员使用 https://login.microsoftonline.com/organizations/v2.0/adminconsent?client_id=myid 提供同意 一旦我得到管理员的同意,响应就会被发送到我的重定向endpoint,在那里我尝试获取令牌,有时令牌不包含所需的权限。 微
问题内容: 我正在运行一个简单的Calculator应用程序来学习Java的异常处理。我设置了两个要处理的异常:InputMismatchException和ArithmeticException,用于除以零。 ArithmeticException得到处理,并且do-while循环继续。但是在捕获InputMismatchException之后,执行将终止而不是继续循环。 码: 输出: 预期:在