数据结构练习题代码及简析

vijos1081 野生动物园

     把区间以首端点为第一关键字,尾端点为第二关键字排序,充分利用区间不互相包含的性质,每次把新到元素插入,超出当前区间的元素删除,统计答案即可,不要得意忘形,忘掉了要按询问顺序输出,codewaysky为这个问题调了一个下午,偷笑

View Code
  1 {$inline on}
2 program zoo(input,output);
3 var
4 left,right,key,s,eat:array[0..100001] of longint;
5 x,y,c,number,ans:array[0..50001] of longint;
6 n,q,tot,root:longint;
7 procedure init; inline;
8 var
9 i:longint;
10 begin
11 tot:=0;
12 root:=0;
13 fillchar(s,sizeof(s),0);
14 fillchar(left,sizeof(left),0);
15 fillchar(right,sizeof(right),0);
16 readln(n,q);
17 for i:=1 to n do
18 read(eat[i]);
19 readln;
20 for i:=1 to q do
21 begin
22 readln(x[i],y[i],c[i]);
23 number[i]:=i;
24 end;
25 end;
26 procedure swap(var aa,bb:longint); inline;
27 var
28 tt:longint;
29 begin
30 tt:=aa;
31 aa:=bb;
32 bb:=tt;
33 end;
34 procedure sort(p,q:longint); inline;
35 var
36 i,j,m:longint;
37 begin
38 i:=p;
39 j:=q;
40 m:=x[(i+j)>>1];
41 repeat
42 while x[i]<m do
43 inc(i);
44 while x[j]>m do
45 dec(j);
46 if i<=j then
47 begin
48 swap(x[i],x[j]);
49 swap(y[i],y[j]);
50 swap(number[i],number[j]);
51 swap(c[i],c[j]);
52 inc(i);
53 dec(j);
54 end;
55 until i>j;
56 if i<q then sort(i,q);
57 if j>p then sort(p,j);
58 end;
59 procedure left_rotate(var t:longint); inline;
60 var
61 k:longint;
62 begin
63 k:=right[t];
64 right[t]:=left[k];
65 left[k]:=t;
66 s[k]:=s[t];
67 s[t]:=s[left[t]]+s[right[t]]+1;
68 t:=k;
69 end;
70 procedure right_rotate(var t:longint); inline;
71 var
72 k:longint;
73 begin
74 k:=left[t];
75 left[t]:=right[k];
76 right[k]:=t;
77 s[k]:=s[t];
78 s[t]:=s[left[t]]+s[right[t]]+1;
79 t:=k;
80 end;
81 procedure maintain(var t:longint;flag:boolean); inline;
82 begin
83 if not flag then
84 begin
85 if s[left[left[t]]]>s[right[t]] then
86 right_rotate(t)
87 else
88 if s[right[left[t]]]>s[right[t]] then
89 begin
90 left_rotate(left[t]);
91 right_rotate(t);
92 end
93 else
94 exit;
95 end
96 else
97 if s[right[right[t]]]>s[left[t]] then
98 left_rotate(t)
99 else
100 if s[left[right[t]]]>s[left[t]] then
101 begin
102 right_rotate(right[t]);
103 left_rotate(t);
104 end
105 else
106 exit;
107 maintain(left[t],false);
108 maintain(right[t],true);
109 maintain(t,false);
110 maintain(t,true);
111 end;
112 procedure insect(var t,k:longint); inline;
113 begin
114 if t=0 then
115 begin
116 inc(tot);
117 t:=tot;
118 s[t]:=1;
119 left[t]:=0;
120 right[t]:=0;
121 key[t]:=k;
122 end
123 else
124 begin
125 inc(s[t]);
126 if k<key[t] then
127 insect(left[t],k)
128 else
129 insect(right[t],k);
130 maintain(t,k>=key[t]);
131 end;
132 end;
133 function select(t,k:longint):longint; inline;
134 begin
135 if s[left[t]]+1=k then
136 exit(key[t]);
137 if k<=s[left[t]] then
138 select:=select(left[t],k)
139 else
140 select:=select(right[t],k-s[left[t]]-1);
141 end;
142 function delete(var t:longint;k:longint):longint; inline;
143 begin
144 dec(s[t]);
145 if (key[t]=k)or((k<key[t])and(left[t]=0))or((k>key[t])and(right[t]=0)) then
146 begin
147 delete:=key[t];
148 if (s[left[t]]=0)or(s[right[t]]=0) then
149 t:=left[t]+right[t]
150 else
151 key[t]:=delete(left[t],key[t]+1);
152 end
153 else
154 if k<key[t] then
155 delete:=delete(left[t],k)
156 else
157 delete:=delete(right[t],k);
158 end;
159 procedure main; inline;
160 var
161 i,start,endd,tmp:longint;
162 begin
163 start:=1;
164 endd:=0;
165 for i:=1 to q do
166 begin
167 while endd<y[i] do
168 begin
169 inc(endd);
170 insect(root,eat[endd]);
171 end;
172 while start<x[i] do
173 begin
174 tmp:=delete(root,eat[start]);
175 inc(start);
176 end;
177 ans[number[i]]:=select(root,c[i]);
178 end;
179 end;
180 procedure print; inline;
181 var
182 i:longint;
183 begin
184 for i:=1 to q do
185 writeln(ans[i]);
186 end;
187 begin
188 assign(input,'zoo.in');reset(input);
189 assign(output,'zoo.out');rewrite(output);
190 init;
191 sort(1,q);
192 main;
193 print;
194 close(input);
195 close(output);
196 end.

tyvj1185 营业额统计

    从题目可以看出,要在至少logn的时间内求出某个数前面与之最接近的数,可以用SBT维护,插入该节点后找其前驱和后继,取一个最接近的即可。

View Code
  1 program calc(input,output);
2 var
3 left,right,s,key:array[0..50000] of longint;
4 n,ans,tot,root:longint;
5 procedure left_rotate(var t:longint);
6 var
7 k:longint;
8 begin
9 k:=right[t];
10 right[t]:=left[k];
11 left[k]:=t;
12 s[k]:=s[t];
13 s[t]:=s[left[t]]+s[right[t]]+1;
14 t:=k;
15 end;
16 procedure right_rotate(var t:longint);
17 var
18 k:longint;
19 begin
20 k:=left[t];
21 left[t]:=right[k];
22 right[k]:=t;
23 s[k]:=s[t];
24 s[t]:=s[left[t]]+s[right[t]]+1;
25 t:=k;
26 end;
27 procedure maintain(var t:longint;flag:boolean);
28 begin
29 if not flag then
30 begin
31 if s[left[left[t]]]>s[right[t]] then
32 right_rotate(t)
33 else
34 if s[right[left[t]]]>s[right[t]] then
35 begin
36 left_rotate(left[t]);
37 right_rotate(t);
38 end
39 else
40 exit;
41 end
42 else
43 if s[right[right[t]]]>s[left[t]] then
44 left_rotate(t)
45 else
46 if s[left[right[t]]]>s[left[t]] then
47 begin
48 right_rotate(right[t]);
49 left_rotate(t);
50 end
51 else
52 exit;
53 maintain(left[t],false);
54 maintain(right[t],true);
55 maintain(t,false);
56 maintain(t,true);
57 end;
58 procedure insect(var t,k:longint);
59 begin
60 if t=0 then
61 begin
62 inc(tot);
63 t:=tot;
64 left[t]:=0;
65 right[t]:=0;
66 s[t]:=1;
67 key[t]:=k;
68 end
69 else
70 begin
71 inc(s[t]);
72 if k<key[t] then
73 insect(left[t],k)
74 else
75 insect(right[t],k);
76 maintain(t,k>=key[t]);
77 end;
78 end;
79 function find(t,k:longint):boolean;
80 begin
81 if t=0 then
82 exit(false);
83 if k<key[t] then
84 find:=find(left[t],k)
85 else
86 find:=(key[t]=k)or(find(right[t],k));
87 end;
88 function pred(t,k:longint):longint;
89 begin
90 if t=0 then
91 exit(k);
92 if k<=key[t] then
93 pred:=pred(left[t],k)
94 else
95 begin
96 pred:=pred(right[t],k);
97 if pred=k then
98 pred:=key[t];
99 end;
100 end;
101 function succ(t,k:longint):longint;
102 begin
103 if t=0 then
104 exit(k);
105 if k>=key[t] then
106 succ:=succ(right[t],k)
107 else
108 begin
109 succ:=succ(left[t],k);
110 if succ=k then
111 succ:=key[t];
112 end;
113 end;
114 function min(aa,bb:longint):longint;
115 begin
116 if aa<bb then
117 exit(aa);
118 exit(bb);
119 end;
120 procedure main;
121 var
122 i,tmp:longint;
123 begin
124 root:=0;
125 tot:=0;
126 fillchar(s,sizeof(s),0);
127 fillchar(left,sizeof(left),0);
128 fillchar(right,sizeof(right),0);
129 readln(n);
130 readln(tmp);
131 ans:=tmp;
132 insect(root,tmp);
133 tmp:=maxlongint>>2;
134 insect(root,tmp);
135 tmp:=-(maxlongint>>2);
136 insect(root,tmp);
137 for i:=2 to n do
138 begin
139 readln(tmp);
140 if find(root,tmp) then
141 continue;
142 insect(root,tmp);
143 ans:=ans+min(tmp-pred(root,tmp),succ(root,tmp)-tmp);
144 end;
145 end;
146 procedure print;
147 begin
148 writeln(ans);
149 end;
150 begin
151 main;
152 print;
153 end.

vijos1404 遭遇战

   dp方程很好写,但时间复杂度不敢恭维,要充分利用数据结构进行优化,思考后发现每次去最小值可以用线段树实现,复杂度将降到logn,完美AC

View Code
  1 program fight(input,output);
2 type
3 treenode=record
4 left,right,x,y,minn:longint;
5 end;
6 var
7 tree:array[-10..200000] of treenode;
8 f:array[-10..90000] of longint;
9 newx,newy,neww:array[0..10001] of longint;
10 n,start,endd,tot:longint;
11 function min(aa,bb:longint):longint;
12 begin
13 if aa<bb then
14 exit(aa);
15 exit(bb);
16 end;
17 procedure build(xx,yy:longint);
18 var
19 mid,now:longint;
20 begin
21 inc(tot);
22 tree[tot].x:=xx;
23 tree[tot].y:=yy;
24 if xx=yy then
25 begin
26 tree[tot].minn:=f[xx];
27 exit;
28 end;
29 mid:=(xx+yy)>>1;
30 now:=tot;
31 tree[now].left:=tot+1;
32 build(xx,mid);
33 tree[now].right:=tot+1;
34 build(mid+1,yy);
35 tree[now].minn:=min(tree[tree[now].left].minn,tree[tree[now].right].minn);
36 end;
37 procedure change(now,xx,tmp:longint);
38 var
39 mid:longint;
40 begin
41 if (tree[now].x=tree[now].y) then
42 begin
43 tree[now].minn:=tmp;
44 exit;
45 end;
46 mid:=(tree[now].x+tree[now].y)>>1;
47 if xx<=mid then
48 change(tree[now].left,xx,tmp)
49 else
50 change(tree[now].right,xx,tmp);
51 tree[now].minn:=min(tree[tree[now].left].minn,tree[tree[now].right].minn);
52 end;
53 function getmin(now,xx,yy:longint):longint;
54 var
55 mid:longint;
56 begin
57 if (tree[now].x=xx)and(tree[now].y=yy) then
58 exit(tree[now].minn);
59 mid:=(tree[now].x+tree[now].y)>>1;
60 if yy<=mid then
61 exit(getmin(tree[now].left,xx,yy))
62 else
63 if xx>mid then
64 exit(getmin(tree[now].right,xx,yy))
65 else
66 exit(min(getmin(tree[now].left,xx,mid),getmin(tree[now].right,mid+1,yy)));
67 end;
68 procedure init;
69 var
70 i:longint;
71 begin
72 readln(n,start,endd);
73 inc(start);
74 inc(endd);
75 for i:=1 to n do
76 begin
77 readln(newx[i],newy[i],neww[i]);
78 inc(newx[i]);
79 inc(newy[i]);
80 if newy[i]>endd then
81 newy[i]:=endd;
82 if newx[i]<start then
83 newx[i]:=start;
84 end;
85 fillchar(f,sizeof(f),63);
86 f[start-1]:=0;
87 build(0,endd);
88 end;
89 procedure swap(var aa,bb:longint);
90 var
91 tt:longint;
92 begin
93 tt:=aa;
94 aa:=bb;
95 bb:=tt;
96 end;
97 procedure sort(p,q:longint);
98 var
99 i,j,m:longint;
100 begin
101 i:=p;
102 j:=q;
103 m:=newy[(i+j)>>1];
104 repeat
105 while newy[i]<m do
106 inc(i);
107 while newy[j]>m do
108 dec(j);
109 if i<=j then
110 begin
111 swap(newx[i],newx[j]);
112 swap(newy[i],newy[j]);
113 swap(neww[i],neww[j]);
114 inc(i);
115 dec(j);
116 end;
117 until i>j;
118 if i<q then sort(i,q);
119 if j>p then sort(p,j);
120 end;
121 procedure main;
122 var
123 i,tmp:longint;
124 begin
125 for i:=1 to n do
126 begin
127 tmp:=getmin(1,newx[i]-1,newy[i]);
128 if tmp+neww[i]<f[newy[i]] then
129 begin
130 f[newy[i]]:=tmp+neww[i];
131 change(1,newy[i],f[newy[i]]);
132 end;
133 end;
134 end;
135 procedure print;
136 begin
137 if f[endd]>19950714 then
138 writeln(-1)
139 else
140 writeln(f[endd]);
141 end;
142 begin
143 assign(input,'fight.in');reset(input);
144 assign(output,'fight.out');rewrite(output);
145 init;
146 sort(1,n);
147 main;
148 print;
149 close(input);
150 close(output);
151 end.

vijos1083 小白逛公园

   线段树求最大连续子和,很经典的模板,每个节点开maxl,maxr,maxn表示包含左端点的最大子和,包含右端点的最大子和和该线段的最大子和,sum表示当前线段元素和,则有

  tree[now].sum=tree[tree[now].left].sum+tree[tree[now].right].sum.

  tree[now].maxl=max{tree[tree[now].left].maxl,tree[tree[now].left].sum+tree[tree[now].right].maxl}

  tree[now].maxr=max{tree[tree[now].right].maxr,tree[tree[now].right].sum+tree[tree[now].left].maxr}

  tree[now].maxn=max{tree[tree[now].right].maxn,tree[tree[now].left].maxn,tree[tree[now].left].maxr+tree[tree[now].right].maxl}

View Code
  1 program park(input,output);
2 const
3 oo=-(maxlongint>>2);
4 type
5 longint=int64;
6 treenode=record
7 left,right,x,y,maxl,maxr,sum,maxn:longint;
8 end;
9 var
10 tree:array[0..1000000] of treenode;
11 a:array[0..500001] of longint;
12 n,m,ans,tot:longint;
13 function max(aa,bb:longint):longint;
14 begin
15 if aa>bb then
16 exit(aa);
17 exit(bb);
18 end;
19 procedure swap(var aa,bb:longint);
20 var
21 tt:longint;
22 begin
23 tt:=aa;
24 aa:=bb;
25 bb:=tt;
26 end;
27 function min(aa,bb:longint):longint;
28 begin
29 if aa<bb then
30 exit(aa);
31 exit(bb);
32 end;
33 procedure clean(var now:treenode);
34 begin
35 now.left:=oo;
36 now.right:=oo;
37 now.maxn:=oo;
38 now.maxl:=oo;
39 now.sum:=oo;
40 now.maxr:=oo;
41 end;
42 procedure build(xx,yy:longint);
43 var
44 mid,now:longint;
45 begin
46 inc(tot);
47 now:=tot;
48 tree[now].x:=xx;
49 tree[now].y:=yy;
50 if xx=yy then
51 begin
52 tree[now].maxl:=a[xx];
53 tree[now].maxr:=a[xx];
54 tree[now].sum:=a[xx];
55 tree[now].maxn:=a[xx];
56 exit;
57 end;
58 mid:=(xx+yy)>>1;
59 tree[now].left:=tot+1;
60 build(xx,mid);
61 tree[now].right:=tot+1;
62 build(mid+1,yy);
63 tree[now].sum:=tree[tree[now].left].sum+tree[tree[now].right].sum;
64 tree[now].maxl:=max(tree[tree[now].left].maxl,tree[tree[now].left].sum+tree[tree[now].right].maxl);
65 tree[now].maxr:=max(tree[tree[now].right].maxr,tree[tree[now].left].maxr+tree[tree[now].right].sum);
66 tree[now].maxn:=max(max(tree[tree[now].left].maxn,tree[tree[now].right].maxn),tree[tree[now].left].maxr+tree[tree[now].right].maxl);
67 end;
68 procedure init;
69 var
70 i:cardinal;
71 begin
72 tot:=0;
73 readln(n,m);
74 for i:=1 to n do
75 readln(a[i]);
76 build(1,n);
77 end;
78 procedure change(now,pos,tmp:longint);
79 var
80 mid:longint;
81 begin
82 if tree[now].x=tree[now].y then
83 begin
84 tree[now].sum:=tmp;
85 tree[now].maxl:=tmp;
86 tree[now].maxr:=tmp;
87 tree[now].maxn:=tmp;
88 exit;
89 end;
90 mid:=(tree[now].x+tree[now].y)>>1;
91 if pos<=mid then
92 change(tree[now].left,pos,tmp)
93 else
94 change(tree[now].right,pos,tmp);
95 tree[now].sum:=tree[tree[now].left].sum+tree[tree[now].right].sum;
96 tree[now].maxl:=max(tree[tree[now].left].maxl,tree[tree[now].left].sum+tree[tree[now].right].maxl);
97 tree[now].maxr:=max(tree[tree[now].right].maxr,tree[tree[now].right].sum+tree[tree[now].left].maxr);
98 tree[now].maxn:=max(max(tree[tree[now].left].maxn,tree[tree[now].right].maxn),tree[tree[now].left].maxr+tree[tree[now].right].maxl);
99 end;
100 function getans(now,xx,yy:longint):treenode;
101 var
102 mid :longint;
103 tmp1,tmp2:treenode;
104 begin
105 clean(tmp1);
106 clean(tmp2);
107 if (tree[now].x>=xx)and(tree[now].y<=yy) then
108 exit(tree[now]);
109 mid:=(tree[now].x+tree[now].y)>>1;
110 if yy>mid then
111 tmp2:=getans(tree[now].right,xx,yy);
112 if xx<=mid then
113 tmp1:=getans(tree[now].left,xx,yy);
114 getans.sum:=tmp1.sum+tmp2.sum;
115 getans.maxn:=max(max(tmp1.maxn,tmp2.maxn),tmp1.maxr+tmp2.maxl);
116 getans.maxl:=max(tmp1.maxl,tmp1.sum+tmp2.maxl);
117 getans.maxr:=max(tmp2.maxr,tmp2.sum+tmp1.maxr);
118 end;
119 procedure main;
120 var
121 k,x1,y1:longint;
122 tmp:treenode;
123 i:cardinal;
124 begin
125 for i:=1 to m do
126 begin
127 readln(k,x1,y1);
128 if k=2 then
129 change(1,x1,y1);
130 if k=1 then
131 begin
132 if x1>y1 then
133 swap(x1,y1);
134 tmp:=getans(1,x1,y1);
135 writeln(tmp.maxn);
136 end;
137 end;
138 end;
139 begin
140 assign(input,'park.in');reset(input);
141 assign(output,'park.out');rewrite(output);
142 init;
143 main;
144 close(input);
145 close(output);
146 end.

tyvj1473 校门外的树3

  用括号表示法,用两个树状数组维护左括号和右括号的数量,对于区间[x,y],内部包含的颜色数是y左侧的左括号数减去x左侧的右括号数,一画图就明白了。

View Code
 1 program tree3(input,output);
2 var
3 c1,c2:array[0..66666] of longint;
4 n,m:longint;
5 procedure init;
6 begin
7 readln(n,m);
8 fillchar(c1,sizeof(c1),0);
9 fillchar(c2,sizeof(c2),0);
10 end;
11 function lowbit(x:longint):longint;
12 begin
13 exit(x and (x xor (x-1)));
14 end;
15 procedure insect1(now,x:longint);
16 begin
17 while now<=n do
18 begin
19 inc(c1[now],x);
20 now:=now+lowbit(now);
21 end;
22 end;
23 procedure insect2(now,x:longint);
24 begin
25 while now<=n do
26 begin
27 inc(c2[now],x);
28 now:=now+lowbit(now);
29 end;
30 end;
31 function getsum1(now:longint):longint;
32 var
33 k:longint;
34 begin
35 k:=0;
36 while now>0 do
37 begin
38 inc(k,c1[now]);
39 now:=now-lowbit(now);
40 end;
41 exit(k);
42 end;
43 function getsum2(now:longint):longint;
44 var
45 k:longint;
46 begin
47 k:=0;
48 while now>0 do
49 begin
50 inc(k,c2[now]);
51 now:=now-lowbit(now);
52 end;
53 exit(k);
54 end;
55 procedure main;
56 var
57 i,k,x,y:longint;
58 begin
59 for i:=1 to m do
60 begin
61 readln(k,x,y);
62 if k=1 then
63 begin
64 insect1(x,1);
65 insect2(y,1);
66 end;
67 if k=2 then
68 writeln(getsum1(y)-getsum2(x-1));
69 end;
70 end;
71 begin
72 init;
73 main;
74 end.

vijos1512 superbrother打鼹鼠

  二维的树状数组,没什么难的,由于树状数组下标要从1开始,所以所有坐标要加1,容斥原理应该能用对吧!

View Code
 1 program mice(input,output);
2 type
3 longint=int64;
4 integer=longint;
5 var
6 c:array[0..1030,0..1030] of longint;
7 n,m:longint;
8 i,j:integer;
9 function lowbit(x:longint):longint;
10 begin
11 exit(x and(-x));
12 end;
13 procedure insect(now,x,y:longint);
14 var
15 z:longint;
16 begin
17 while x<=n do
18 begin
19 z:=y;
20 while z<=n do
21 begin
22 inc(c[x,z],now);
23 z:=z+lowbit(z);
24 end;
25 x:=x+lowbit(x);
26 end;
27 end;
28 function getsum(x,y:longint):longint;
29 var
30 k:longint;
31 s:longint;
32 begin
33 s:=0;
34 while x>0 do
35 begin
36 k:=y;
37 while k>0 do
38 begin
39 inc(s,c[x,k]);
40 k:=k-lowbit(k);
41 end;
42 x:=x-lowbit(x);
43 end;
44 exit(s);
45 end;
46 procedure main;
47 var
48 x1,y1,x2,y2:longint;
49 i:integer;
50 begin
51 readln(n);
52 read(m);
53 while m<>3 do
54 begin
55 if m=1 then
56 begin
57 readln(x1,x2,y1);
58 insect(y1,x1+1,x2+1);
59 end;
60 if m=2 then
61 begin
62 readln(x1,y1,x2,y2);
63 writeln(getsum(x2+1,y2+1)+getsum(x1,y1)-getsum(x1,y2+1)-getsum(x2+1,y1));
64 end;
65 read(m);
66 end;
67 end;
68 begin
69 assign(input,'mice.in');reset(input);
70 assign(output,'mice.out');rewrite(output);
71 main;
72 close(input);
73 close(output);
74 end.

附上tyvj1476三维树状数组的代码,容斥原理要好好想想

View Code
 1 program miceagain(input,output);
2 var
3 c:array[0..101,0..101,0..101] of longint;
4 n,m:longint;
5 function lowbit(x:longint):longint;
6 begin
7 exit(x and (-x));
8 end;
9 procedure add(xx,yy,zz,now:longint);
10 var
11 y1,z1:longint;
12 begin
13 while xx<=n do
14 begin
15 y1:=yy;
16 while y1<=n do
17 begin
18 z1:=zz;
19 while z1<=n do
20 begin
21 inc(c[xx,y1,z1],now);
22 z1:=z1+lowbit(z1);
23 end;
24 y1:=y1+lowbit(y1);
25 end;
26 xx:=xx+lowbit(xx);
27 end;
28 end;
29 function getsum(xx,yy,zz:longint):longint;
30 var
31 y1,z1:longint;
32 begin
33 getsum:=0;
34 while xx>0 do
35 begin
36 y1:=yy;
37 while y1>0 do
38 begin
39 z1:=zz;
40 while z1>0 do
41 begin
42 inc(getsum,c[xx,y1,z1]);
43 z1:=z1-lowbit(z1);
44 end;
45 y1:=y1-lowbit(y1);
46 end;
47 xx:=xx-lowbit(xx);
48 end;
49 end;
50 procedure main;
51 var
52 x1,y1,z1,x2,y2,z2:longint;
53 k,i:longint;
54 begin
55 readln(n);
56 read(k);
57 while k<>3 do
58 begin
59 if k=1 then
60 begin
61 readln(x1,y1,z1,x2);
62 add(x1+1,y1+1,z1+1,x2);
63 end;
64 if k=2 then
65 begin
66 readln(x1,y1,z1,x2,y2,z2);
67 writeln(getsum(x2+1,y2+1,z2+1)+2*(getsum(x1,y1,z1))-getsum(x1,y2+1,z2+1)-getsum(x2+1,y1,z2+1)-getsum(x2+1,y2+1,z1));
68 end;
69 read(k);
70 end;
71 end;
72 begin
73 main;
74 end.

 

原文地址:https://www.cnblogs.com/neverforget/p/2243530.html