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
原文地址:https://www.cnblogs.com/Randolph87/p/3674812.html