HDU 1264 Counting Squares

  题意就是给你多个矩形,然后算出这些矩形所框出来的总面积,框过多次的按一次算。

  但是题目给的是二维的,线段树只是解决一维的问题比较简单。题目数据范围为0~100,所以我就建了一百棵线段树,这样就可以转化成一维的问题来解决了。-_-||

  结果跑了70+ms  不知道还能再怎么优化……HDU里面有好多0ms的大神……

 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 int st[110][10100];
 5 
 6 int change(int *t,int ml,int mr,int node,int l,int r)
 7 {

     if(t[node] == r-l+1)//加入该判断后,时间到了31ms,不过还是太慢……
        return 0;

 8     if(l == r)
 9     {
10         if(t[node] == 1)
11         {
12             return 0;
13         }
14         else
15         {
16             t[node] = 1;
17             return 1;
18         }
19     }
20     int temp;
21     int m = (l+r)/2;
22     if(mr <= m)
23     {
24         temp = change(t,ml,mr,node+node,l,m);
25         t[node] += temp;
26         return temp;
27     }
28     if(m < ml)
29     {
30         temp = change(t,ml,mr,node+node+1,m+1,r);
31         t[node] += temp;
32         return temp;
33     }
34     temp = change(t,ml,m,node+node,l,m) + change(t,m+1,mr,node+node+1,m+1,r);
35     t[node] += temp;
36     return temp;
37 }
38 
39 int main()
40 {
41     int a,b,c,d,t;
42     memset(st,0,sizeof(st));
43     while(scanf("%d %d %d %d",&a,&b,&c,&d) != EOF)
44     {
45         if(a == -1 && b == -1 && c == -1 && d == -1)
46         {
47             int sum = 0;
48             for(int i = 1;i <= 100; i++)
49             {
50                 sum += st[i][1];
51             }
52             printf("%d\n",sum);
53             memset(st,0,sizeof(st));
54         }
55         else if(a == -2 && b == -2 && c == -2 && d == -2)
56         {
57             int sum = 0;
58             for(int i = 1;i <= 100; i++)
59             {
60                 sum += st[i][1];//当前这棵树的第一个节点储存的数据即为该维度的所框出的面积
61             }
62             printf("%d\n",sum);
63             break;
64         }
65         else
66         {
67             if(a > c)
68             {
69                 t = a;
70                 a = c;
71                 c = t;
72             }
73             if(b > d)
74             {
75                 t = b;
76                 b = d;
77                 d = t;
78             }
79             for(int i = a+1;i <= c; i++)
80             {
81                 change(st[i],b+1,d,1,1,100);
82             }
83         }
84     }
85     return 0;
86 }

 0ms的方法找到了  这中几乎要闪瞎我的双眼的却又在情理之中的做法……链接在一楼

原文地址:https://www.cnblogs.com/zmx354/p/3111328.html