三维裸的做法是一维排序,剩下树套树,可我好像还没写过树套树
先说cdq分治吧,先对一维排序,相当于原来修改询问里的时间线
在这上面分治、划分,计算前半部分对后半部分的影响,显然可以按第二维的顺序维护树状数组

  1 type node=record
  2        a,b,c,s,p:longint;
  3      end;
  4 
  5 var a,b,q:array[0..100010] of node;
  6     ans,c:array[0..200010] of longint;
  7     n,m,i,t,j:longint;
  8 
  9 procedure swap(var a,b:node);
 10   var c:node;
 11   begin
 12     c:=a;
 13     a:=b;
 14     b:=c;
 15   end;
 16 
 17 function cmp(a,b:node):boolean;
 18   begin
 19     if a.a<b.a then exit(true);
 20     if a.a>b.a then exit(false);
 21     if (a.b<b.b) or (a.b=b.b) and (a.c<b.c) then exit(true);
 22     exit(false);
 23   end;
 24 
 25 procedure sorta(l,r:longint);
 26   var i,j:longint;
 27       x:node;
 28   begin
 29     i:=l;
 30     j:=r;
 31     x:=a[(l+r) shr 1];
 32     repeat
 33       while cmp(a[i],x) do inc(i);
 34       while cmp(x,a[j]) do dec(j);
 35       if not(i>j) then
 36       begin
 37         swap(a[i],a[j]);
 38         inc(i);
 39         dec(j);
 40       end;
 41     until i>j;
 42     if l<j then sorta(l,j);
 43     if i<r then sorta(i,r);
 44   end;
 45 
 46 function lowbit(x:longint):longint;
 47   begin
 48     exit(x and (-x));
 49   end;
 50 
 51 procedure add(x,w:longint);
 52   begin
 53     while x<=m do
 54     begin
 55       inc(c[x],w);
 56       x:=x+lowbit(x);
 57     end;
 58   end;
 59 
 60 function ask(x:longint):longint;
 61   begin
 62     ask:=0;
 63     while x>0 do
 64     begin
 65       ask:=ask+c[x];
 66       x:=x-lowbit(x);
 67     end;
 68   end;
 69 
 70 procedure cdq(l,r:longint);
 71   var m,i,j,l1,l2:longint;
 72   begin
 73     if l=r then exit;
 74     m:=(l+r) shr 1;
 75     cdq(l,m);
 76     cdq(m+1,r);
 77     j:=l;
 78     for i:=m+1 to r do
 79     begin
 80       while (j<=m) and (b[j].b<=b[i].b) do
 81       begin
 82         add(b[j].c,b[j].p);
 83         inc(j);
 84       end;
 85       inc(b[i].s,ask(b[i].c));
 86     end;
 87     for i:=l to j-1 do
 88       add(b[i].c,-b[i].p);
 89     l1:=l; l2:=m+1;
 90     for i:=l to r do
 91       if ((l1<=m) and (b[l1].b<b[l2].b)) or (l2>r) then
 92       begin
 93         q[i]:=b[l1];
 94         inc(l1);
 95       end
 96       else begin
 97         q[i]:=b[l2];
 98         inc(l2);
 99       end;
100     for i:=l to r do
101       b[i]:=q[i];
102   end;
103 
104 begin
105   readln(n,m);
106   for i:=1 to n do
107     readln(a[i].a,a[i].b,a[i].c);
108   sorta(1,n);
109   i:=0;
110   while i<n do
111   begin
112     inc(i);
113     j:=i+1;
114     while (a[j].a=a[i].a) and (a[j].b=a[i].b) and (a[j].c=a[i].c) do inc(j);  //这步不能少,因为要保证后半部分序列对前半部分没有影响
115     inc(t);
116     b[t]:=a[i];
117     b[t].p:=j-i;
118     i:=j-1;
119   end;
120   cdq(1,t);
121   for i:=1 to t do
122     inc(ans[b[i].s+b[i].p-1],b[i].p);
123   for i:=0 to n-1 do
124     writeln(ans[i]);
125 end.
View Code

 

posted on 2015-04-06 20:56  acphile  阅读(153)  评论(0编辑  收藏  举报