zoukankan      html  css  js  c++  java
  • 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的方法找到了  这中几乎要闪瞎我的双眼的却又在情理之中的做法……链接在一楼

  • 相关阅读:
    Ural 1996 Cipher Message 3 (生成函数+FFT)
    UVA 12633 Super Rooks on Chessboard (生成函数+FFT)
    HDU 5307 He is Flying (生成函数+FFT)
    BZOJ 2039 人员雇佣 (最小割)
    BZOJ 3158 千钧一发 (最大流->二分图带权最大独立集)
    BZOJ 3144 [HNOI2013]切糕 (最大流+巧妙的建图)
    BZOJ 3774 最优选择 (最小割+二分图)
    BZOJ 3876 [AHOI/JSOI2014]支线剧情 (最小费用可行流)
    BZOJ 3771 Triple (FFT+生成函数+容斥)
    洛谷 P3121 【[USACO15FEB]审查(黄金)Censoring (Gold)】
  • 原文地址:https://www.cnblogs.com/zmx354/p/3111328.html
Copyright © 2011-2022 走看看