- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
这是我要解决的问题,我正在使用 The Fact That Prefix Sum[i] - Prefix Sum[i-1]
Leads to Frequency being greater than zero 来识别不同的数字和然后我正在消除频率,但即使使用 BIT,我也会得到 TLE
给定一个由 n 个数字 a1、a2、...、an 和许多 d 查询组成的序列。
d-query 是一对 (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]
:如果它是该元素的第一次出现,只需在BIT 中的i
位置加一个。否则,将-1
添加到该元素上一次出现的位置,然后将1
添加到i
位置。
查询(left, right)
的答案只是从left
到right
的所有元素的总和。
要维护每个元素的最后一次出现,您可以使用 map 。
可以使用持久线段树使其在线(时间复杂度是相同的,相同的复杂度将变为O(n * log n + q)
),但它不是这里需要。
关于algorithm - SPOJ DQUERY : TLE Even With BIT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27656135/
有一个未排序的列表 a 和一个范围列表,如 ranges = [(10, 20), (30, 50), (15, 35) ...]。 a 中的最大值为 uint64_t。目标是计算每个范围的元素数量。
在没有Maps帮助的情况下通过Memoization解决问题,由于读取文件的方法,我得到了TLE,根据我的说法,这不应该是这种情况。可能的原因是什么? 这是给出 AC - http://ideone.
我正在用 C 语言编写一个宾果游戏程序,该程序出现“时间限制”当在线评委给我巨大的宾果游戏板(例如 256*256 板 1 人或 150*150 板 6 人)时,我超出了”。我如何优化我的代码以避免
我真的很困惑,为什么我的 Java 代码无法正常工作,它在 Hacker Earth 上的 Code Monks 上提供了 TLE。这是 1 的链接 Link to Question第一个问题 MON
我正在尝试来自 Interviewbit 的以下问题: Given a m x n grid filled with non-negative numbers, find a path from to
Question Given N and M, write an equation using left shift operators whose result will be equal to t
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
我正在尝试使用ephem TLE 数据跟踪月球的位置,然后将其存储在data.csv 文件中。但是,我找不到它! 下面的代码是我正在尝试做的事情的示例,这是针对国际空间站的,它是我找不到的月球的“第
当我在 hackerearth 提交此代码时,我得到了 TLE。 任何建议我如何优化这个代码。 #include #include int checkPrime(int); int main()
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我正在尝试解决这个问题:http://olimpiada-informatica.org/?cmd=downloadE&pbm=velo101&ext=pdf它是西类牙语,但我会尝试在这里翻译它: Y
我有顺时针旋转 2D 矩阵的工作代码,但当 k 达到大数时,我遇到了 TLE(超出时间限制)问题。我不知道如何简化我的代码,我猜是 for 循环导致了问题,但我看不出没有它们就可以使我的代码工作的方法
我正在解决 this problem通过使用线段树。我在每个节点保存总和、最大值、最左边的最大值和最右边的最大值。然后我搜索图表以找到特定时间间隔的答案。我怎样才能提高这段代码的速度? import
当我将我的解决方案提交给 codechef 时,我不断收到时间限制错误。我从扫描仪切换到缓冲阅读器,但这并没有解决它。我认为它在我的算法中,但我不确定在哪里,除了检查每 5 个减量之外可能是不必要的。
我正在重新尝试这个 problem statement , now that the contest is all over (所以这不是作弊或任何东西,只是想学习,因为答案没有公布,只有给定测试用例
问题的链接是 - spoj question 我尝试通过这种方法解决问题 - N 范围内的对数 = N-1 范围内的对数 + 一些新对。 但我不知道这里还应该做哪些优化来避免 TLE。我还阅读了有关
问题:Ekka 和他的 friend Dokka 决定买一个蛋糕。他们都喜欢蛋糕,这就是为什么他们买了蛋糕后想分享蛋糕。顾名思义,Ekka 非常喜欢奇数,Dokka 非常喜欢偶数,他们想分蛋糕,让 E
我正在尝试解决 UVA 在线判断上的 12503 问题。我想我已经找到了解决方案,但它给了我 TLE。这是问题所在: 你有一个机器人站在 x 轴的原点上。机器人将得到一些指令。你的任务是在执行完所有指
标准的两行元素 (TLE) 格式包含 2 位数年份加小数天的时间,因此 16012.375 将是 2016 年 1 月 12 日 09:00。使用 python 的 time 或 datatime 模
这是我要解决的问题,我正在使用 The Fact That Prefix Sum[i] - Prefix Sum[i-1] Leads to Frequency being greater than
我是一名优秀的程序员,十分优秀!