2、小明有一个花园,花园里一共有m朵花,对于每一朵花,都是不一样的,小明用1~m中的一个整数表示每一朵花。一天他看n次花,每次只看一朵,将他n次看花的种类是什么按照时间顺序记录下来。记录用a[i]表示第i次他看了a[i]这朵花。
小红有Q个问题,问[l,r]的时间内,小明一共看了多少朵不同的花。
输入:
第一行输入两个整数n,m(1≤n≤2000,1≤m≤100);分别表示n次看花,m种花朵。
接下来输入n个数,a[1]-a[n],表示看花的记录
输入一个数Q(1≤Q≤1000000),表示小红的问题数量;
输入Q行,每行两个数l,r(1≤l≤r≤n),表示小红想知道在第l次到第r次,小明一共看了多少不同的花。
输出:
一共Q行,每一行输出一个数,表示小明在[l,r]的时间内看了多少种花。
样例输入:
5 3
1 2 3 2 2
3
1 4
2 4
1 5
样例输出:
3
2
3
#超时 while 1: try: n,m = map(int,input().split()) lis1 = list(map(int,input().split())) lis3 =[] Q = int(input()) num = 0 while num <Q: l,r = map(int,input().split()) lis2 = lis1[l-1:r] res = len(set(lis2)) lis3.append(res) num += 1 for i in lis3: print(i) except: break
提示超时,是代码有问题吗?
while 1:
难道不会发生 死循环?你的try语句块里面可没有break或return的,
em,超时是指什么超时?哪里超时?没有输入数据吗?
还需要更多信息,代码或者错误提示,
算法有时间限制,需要在3s内运行完毕。是会有算例输入的,没有死循环。
@数据科学小白:
下面有个C++的代码,,C++属于编译型,效率应该会更快吧,,对了,干嘛不一次性读入所有算例,存储到内存里面,,然后再做处理?
IO读操作会很耗时吧?
肯定超时,你这样做时间复杂度是O(Qnlogn)的,还有百万级的输入量python连读入都会超时啊。。。
我个人认为用莫队解决这题比较好。。。
c++代码:
#include<cstdio>
#include<algorithm>
using namespace std;
template<typename T> inline void read(T& t)
{
t=0; int ch,f=false;
while(ch=getchar(),!((ch>='0'&&ch<='9')||ch=='-'));
if(ch=='-') f=true,ch=getchar();
t=ch^48;
while(ch=getchar(),ch>='0'&&ch<='9') t=t*10+(ch^48);
if(f) t=-t;
}
template<typename T,typename... Args> inline void read(T& t,Args&... args) { read(t); read(args...); }
const int maxq=1000005;
const int maxn=2005;
int n,m,q;
struct Query { int l,r,id; };
Query qs[maxq];
int hsh[105],res[maxq],a[maxn];
int blo,bid[maxn];
inline bool cmp(const Query &a,const Query &b)
{ return bid[a.l]!=bid[b.l]?bid[a.l]<bid[b.l]:((bid[a.l]&1)?a.r<b.r:a.r>b.r); }
int cnt=0;
inline void Add(int x) { cnt+=(++hsh[x]==1); }
inline void Del(int x) { cnt-=(--hsh[x]==0); }
int main()
{
read(n,m);
for(int i=1;i<=n;i++) read(a[i]);
read(q);
for(int i=1;i<=q;i++)
{
read(qs[i].l,qs[i].r);
qs[i].id=i;
}
blo=sqrt(n);
for(int i=1;i<=n;i++) bid[i]=(i-1)/blo+1;
sort(qs+1,qs+1+q,cmp);
for(int i=qs[1].l;i<=qs[1].r;i++) Add(a[i]);
res[qs[1].id]=cnt;
int l=qs[1].l,r=qs[1].r;
for(int i=2;i<=q;i++)
{
Query &Q=qs[i];
while(l<Q.l) Del(a[l++]);
while(l>Q.l) Add(a[--l]);
while(r>Q.r) Del(a[r--]);
while(r<Q.r) Add(a[++r]);
res[Q.id]=cnt;
}
for(int i=1;i<=q;i++) printf("%d\n",res[i]);
return 0;
}
这不是莫队模板题吗(逃 ~~虽然大佬线段树能强行搞~~