首页新闻找找看学习计划

python编写算法提示超时,怎么解决?360笔试第二题

0
[待解决问题]

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

提示超时,是代码有问题吗?

数据科学小白的主页 数据科学小白 | 菜鸟二级 | 园豆:202
提问于:2018-08-29 15:05
< >
分享
所有回答(3)
0

while 1:

难道不会发生 死循环?你的try语句块里面可没有break或return的,

 

em,超时是指什么超时?哪里超时?没有输入数据吗?

还需要更多信息,代码或者错误提示,

智人N | 园豆:601 (小虾三级) | 2018-08-29 19:31

算法有时间限制,需要在3s内运行完毕。是会有算例输入的,没有死循环。

支持(0) 反对(0) 数据科学小白 | 园豆:202 (菜鸟二级) | 2018-08-29 19:58

@数据科学小白: 

下面有个C++的代码,,C++属于编译型,效率应该会更快吧,,对了,干嘛不一次性读入所有算例,存储到内存里面,,然后再做处理?

IO读操作会很耗时吧?

支持(0) 反对(0) 智人N | 园豆:601 (小虾三级) | 2018-08-30 08:30
1

肯定超时,你这样做时间复杂度是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;
}
happyZYM | 园豆:248 (菜鸟二级) | 2018-08-29 20:55
0

这不是莫队模板题吗(逃 ~~虽然大佬线段树能强行搞~~

Qihoo360 | 园豆:202 (菜鸟二级) | 2018-08-30 08:46
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册