题目的意思是把数字像串糖葫芦一样串来串去,询问某个数字下方有多少个数。我看明白了popopopolo的思路后就按他的想法自己写了一个,结果用了282ms,而他的只有32ms,排名第二,差距还真是大orz。仔细对比一下,他的数据类型是short,输入输出函数也是重写的。我试着把int改为short,结果是266ms,基本没什么优化,而我也懒得重写函数了。原来我只知道scanf比cin强,没想到手写的效率要更强。
 1 #include <stdio.h>
 2 #include <string.h>
 3 #define N 30005
 4 int fa[N],d[N];
 5 int find(int x)
 6 {
 7     if(fa[x] <= 0) return x;
 8     int t = fa[x];
 9     fa[x] = find(t);
10     if(t != fa[x])
11         d[x] += d[t];
12     return fa[x];
13 }
14 int main()
15 {
16     int n,a,b,i,x,y;
17     char ch;
18     scanf("%d",&n);
19     getchar();
20     memset(fa,-1,sizeof fa);
21     while(n--)
22     {
23         scanf("%c",&ch);
24         if(ch == 'M')
25         {
26             scanf("%d%d",&a,&b);
27             x = find(a);
28             y = find(b);
29             d[x] -= fa[y];
30             fa[y] += fa[x];
31             fa[x] = y;
32         }
33         else
34         {
35             scanf("%d",&a);
36             find(a);
37             printf("%d\n",d[a]);
38         }
39         getchar();
40     }
41     return 0;
42 }

 

……