1062: [NOI2008]糖果雨 - BZOJ

题目链接: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

 

你可能感兴趣的:(2008)