Задача А-Податковий інспектор Нагін Сергій uses sysutils; var a,j1,n,t,ii,i,j:longint; g:array[0..1000,0..1000]of longint; i1:array[0..1000]of longint; begin read(t); fillchar(g,sizeof(g),0); for ii:=1 to t do begin read(n); fillchar(i1,sizeof(i1),0); for i:=1 to n do begin j1:=0; for j:=1 to n do begin read(a); a:=a mod 2; i1[j]:=(i1[j]+a)mod 2; j1:=(j1+a)mod 2; if ((not odd(i1[j])) and (g[i,j-1]=0)) or ((not odd(j1)) and (g[i-1,j]=0))then g[i,j]:=1 else g[i,j]:=0; end; end; writeln(g[n,n]); end; end.
Задача B-Обласна олімпіада Савчук Владислав Var a,b:array[1..100,1..100] of longint; ki,no:array[1..100] of longint; fl:array[1..100] of boolean; d,di,dj,j,i,n,max,mini,nom,sum:longint; Begin Readln(n); max:=0; For i:=1 to n do Begin For j:=1 to n do Begin Read(a[i,j]); if a[i,j]>max then max:=a[i,j] end; Readln end; For i:=1 to n do For j:=1 to n do b[i,j]:=max-a[i,j]; For i:=1 to n do Begin mini:=1; For j:=2 to n do if b[i,j]<b[i,mini] then mini:=j; inc(ki[mini]); no[i]:=mini; end; For nom:=1 to n do if ki[nom]>1 then break; While ki[nom]<>1 do Begin fl[nom]:=true; d:=maxlongint div 3; For i:=1 to n do if fl[no[i]] then For j:=1 to n do if not fl[j] and (b[i,j]-b[i,no[i]]<d) then Begin d:=b[i,j]-b[i,no[i]]; di:=i; dj:=j; end; if d<>0 then For j:=1 to n do if fl[j] then For i:=1 to n do inc(b[i,j],d); inc(ki[dj]); dec(ki[no[di]]); no[di]:=dj; For nom:=1 to n do if ki[nom]>1 then break; if ki[dj]>1 then nom:=dj else For i:=1 to n do fl[i]:=false; if ki[nom]=1 Then Break; sum:=0; end; For i:=1 to n do sum:=sum+a[i,no[i]]; Writeln(sum); End.
Задача C-Кодекс Оришин Сергій {$M 1000000,0,1000000} uses math; type pp=record x,y,p:longint; end; var ans,n,m,i,x,y,l:longint; p,a,b,k:array[0..10001] of longint; q:array[0..20001] of pp; procedure tt(x,pred:longint); var l,u,g,t:longint; begin if (k[x]=1) and (x<>1) then begin b[x]:=1; a[x]:=0; end else begin { a } g:=p[x]; while q[g].x<>0 do begin if q[g].y<>pred then tt(q[g].y,x); g:=q[g].p; end; l:=0; g:=p[x]; while q[g].x<>0 do begin if q[g].y<>pred then begin if (k[q[g].y]=1) and (q[g].y<>1) then l:=l+1 else l:=l+min(a[q[g].y],b[q[g].y]); end; g:=q[g].p; end; g:=p[x]; while q[g].x<>0 do begin if q[g].y<>pred then begin if (k[q[g].y]>1) or (q[g].y=1) then a[x]:=min(a[x],l-min(a[q[g].y],b[q[g].y])+b[q[g].y]) else a[x]:=min(a[x],l); end; g:=q[g].p; end; { b } l:=0; g:=p[x]; b[x]:=1; while q[g].x>0 do begin if q[g].y<>pred then begin l:=0; t:=p[q[g].y]; while q[t].x>0 do begin if q[t].y<>x then begin if (k[q[t].y]=1) and (q[t].y<>1) then l:=l+1 else l:=l+a[q[t].y]; end; t:=q[t].p; end; u:=min(a[q[g].y],b[q[g].y]); b[x]:=b[x]+min(u,l); end; g:=q[g].p; end; end; end; begin read(n,m); for i:=1 to m do begin read(x,y); inc(l); q[l].x:=x; q[l].y:=y; q[l].p:=p[x]; p[x]:=l; inc(l); q[l].x:=y; q[l].y:=x; q[l].p:=p[y]; p[y]:=l; inc(k[x]); inc(k[y]); end; for i:=1 to n do a[i]:=n; fillchar(b,sizeof(b),0); tt(1,0); ans:=min(a[1],b[1]); writeln(ans); end.