• 1062: [NOI2008]糖果雨


    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1062

    神题一个,直接讲思路了(全都是看别人的)

    首先我们把一个云用一个平面上的点(t,length)表示,t表示云的左端到0时的时间,因为运动周期为len*2,所以mod len*2

    然后我们要做的就是回答询问(t,l,r)

    对于时间>t的点,时间不超过t+r,因为超过t+r,云的左端点就到了r的右边,然后length要在(l-(时间-t),r-(时间-t))之间
    对于时间<t的点,时间不小于t-r,因为小于t-r,云的左端点就到了r的右边,然后length要在(l-(t-时间),r-(t-时间))之间

    我们要求的答案就是在这两个平行四边形的内部的点的个数,用两个树状数组维护平行四边形内部点的个数(一个左偏45度,一个右偏45度)

    实际情况要求4个平行四边形,因为有可能t+r或t-r越界

     1 const
     2         maxl=1010;
     3         maxn=1000010;
     4 type
     5         arr=array[0..maxl*2,0..maxl*4]of longint;
     6 var
     7         a,b:arr;
     8         t,l:array[0..maxn]of longint;
     9         n,len:longint;
    10 
    11 procedure add(var a:arr;x,y,z:longint);
    12 var
    13         i:longint;
    14 begin
    15         inc(x);
    16         inc(y);
    17         if (x<=0) or (y<=0) then exit;
    18         while x<=len*2+1 do
    19           begin
    20             i:=y;
    21             while i<=len*4+1 do
    22               begin
    23                 inc(a[x,i],z);
    24                 i:=i+(i and(-i));
    25               end;
    26             x:=x+(x and(-x));
    27           end;
    28 end;
    29 
    30 function sum(var a:arr;x,y:longint):longint;
    31 var
    32         i:longint;
    33 begin
    34         inc(x);
    35         inc(y);
    36         sum:=0;
    37         if x>len*2 then x:=len*2+1;
    38         if y>len*4 then y:=len*4+1;
    39         sum:=0;
    40         while x>0 do
    41           begin
    42             i:=y;
    43             while i>0 do
    44               begin
    45                 inc(sum,a[x,i]);
    46                 i:=i-(i and(-i));
    47               end;
    48             x:=x-(x and (-x));
    49           end;
    50 end;
    51 
    52 procedure add(x,y,z:longint);
    53 begin
    54         add(a,x,y+x,z);
    55         add(b,x,y-x+len*2,z);
    56 end;
    57 
    58 function area(var a:arr;x1,y1,x2,y2:longint):longint;
    59 begin
    60         exit(sum(a,x2,y2)+sum(a,x1-1,y1-1)-sum(a,x1-1,y2)-sum(a,x2,y1-1));
    61 end;
    62 
    63 procedure main;
    64 var
    65         i,k,tt,cc,ll,rr,dd,s,ans:longint;
    66 begin
    67         read(n,len);
    68         for i:=1 to n do
    69           begin
    70             read(k);
    71             case k of
    72               1:begin
    73                 read(tt,cc,ll,rr,dd);
    74                 t[cc]:=(tt-dd*ll+len*2)mod (len*2);
    75                 l[cc]:=rr-ll;
    76                 add(t[cc],l[cc],1);
    77               end;
    78               2:begin
    79                 read(tt,ll,rr);
    80                 tt:=tt mod (len*2);
    81                 s:=longint(rr=len);
    82                 ans:=area(a,tt,ll+tt,rr+tt,len*4)
    83                 +area(a,0,ll+tt-len*2,rr+tt-len*2-s,len*4)
    84                 +area(b,tt-rr+len*2+s,ll-tt,len*2,len*4)
    85                 +area(b,tt-rr,ll-tt+len*2,tt-1,len*4);
    86                 writeln(ans);
    87               end;
    88               3:begin
    89                 read(tt,cc);
    90                 add(t[cc],l[cc],-1);
    91               end;
    92             end;
    93           end;
    94 end;
    95 
    96 begin
    97         main;
    98 end.
    View Code
  • 相关阅读:
    bat windows批处理 移动所有子目录文件
    Oracle常见的QA
    [转载]行动起来
    [转载]微笑
    Excel数据更新至Mysql数据库
    sql server QA
    关于SharpZipLib的压缩与解压问题
    整合Spring.net到asp.net网站开发中初探
    设计模式概要
    Oracle 常用语句档案(二)
  • 原文地址:https://www.cnblogs.com/Randolph87/p/3674812.html
Copyright © 2020-2023  润新知