zoukankan      html  css  js  c++  java
  • 数据结构练习题代码及简析

    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.

     

  • 相关阅读:
    使用kubeadm部署K8S v1.17.0集群
    06Shell并发控制
    05Shell循环语句
    04Shell流程控制
    03Shell条件测试
    02Shell变量
    01Shell入门02-echo和printf
    01Shell入门01-bash Shell特性
    局域网部署ntp时间服务器
    聊聊、Mybatis集成Spring XML方式
  • 原文地址:https://www.cnblogs.com/neverforget/p/2243530.html
Copyright © 2011-2022 走看看