题目链接: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越界
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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.