总是TLE,郁闷死!!!!

dzxpjf 2009-07-30 07:17:50
ACM的一个题
http://acm.pku.edu.cn/JudgeOnline/problem?id=2443

思路是正确的,但是总TLE,怎么优化?谢谢高手
...全文
133 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
这样不行。

数组 a【10000】【1000】
a【i】中包含包含有i的所有行 。

查询 i、j时
判断 a[i][]中 和a[j][]中是不是有一个相同的数
不过查询算法是 也近乎是 O(n)?


mark 了, 等有时间再搞。

[Quote=引用 2 楼 vshuang 的回复:]
能不能把所有的包含两个数的情况全都存储下来。
或者说建立一个字典。

这样查询起来就是O(1) 的代价了 。
怀疑查询代价过高。
所以TLE
[/Quote]
dzxpjf 2009-07-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 logic0 的回复:]
bool num[1003][10010];

这一句,换成bool num[10010][1003];


这样就可以过了,基本的代码优化技巧
[/Quote]

晕,真的可以,什么原理?
非兔子_Logic0 2009-07-30
  • 打赏
  • 举报
回复
bool num[1003][10010];

这一句,换成bool num[10010][1003];


这样就可以过了,基本的代码优化技巧
  • 打赏
  • 举报
回复
看看先
  • 打赏
  • 举报
回复
能不能把所有的包含两个数的情况全都存储下来。
或者说建立一个字典。

这样查询起来就是O(1) 的代价了 。
怀疑查询代价过高。
所以TLE
dzxpjf 2009-07-30
  • 打赏
  • 举报
回复
TLE的代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
bool num[1003][10010];

int main()
{
int n,m;
int i,j,k,tmp,p,q;
scanf("%d",&n);
for(i=0 ; i<n ; i++)
{
scanf("%d",&m);
for(j=0 ; j<m ; j++)
{
scanf("%d",&tmp);
num[i][tmp] = 1;
}
}
scanf("%d",&m);
for(p=0 ; p<m ; p++)
{
scanf("%d%d",&i,&j);
for(q=0 ; q<n ; q++)
{
if(num[q][i] && num[q][j])
{
printf("Yes\n");
break;
}
}
if(q==n)
{
printf("No\n");
}
}
return 0;
}

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧