# bzoj3262

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
52   begin
53     while x<=m do
54     begin
55       inc(c[x],w);
56       x:=x+lowbit(x);
57     end;
58   end;
59
61   begin
63     while x>0 do
64     begin
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
83         inc(j);
84       end;
86     end;
87     for i:=l to j-1 do
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
106   for i:=1 to n do
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  阅读(140)  评论(0编辑  收藏  举报