首页 > 代码库 > codeforces round373(div.2) 题解

codeforces round373(div.2) 题解

这一把打得还算过得去。。。

最大问题在于A题细节被卡了好久。。。连续被hack两次。。。

B题是个规律题。。。C题也是一个细节题。。。D由于不明原因标程错了被删掉了。。。E是个线段树套矩阵。。。

考试的时候过了ABC三个。。。

Problem A:

这题纯细节,只要看最后两个数就可以了。(注意n=1的情况以及最后一个数是0或者15的情况)

代码如下:

 1 var n,i:longint; 2     a:array[1..100] of longint; 3 begin 4   readln(n); 5   fillchar(a,sizeof(a),0); 6   for i:=1 to n do 7     read(a[i]); 8   readln; 9   if (a[n]=0) then writeln(UP)10   else if (a[n]=15) then writeln(DOWN)else11   if (n=1) then writeln(-1)12   else if (a[n]<a[n-1]) or (a[n]=15) then writeln(DOWN) 13   else writeln(UP);14 end.15   

Problem B:

这题是个规律题。。。(或者说贪心)

先考虑010101的情况,并且假装(嗯,就是假装)不能进行染色,然后跑出最大值,

另一种情况一样处理,最后两个最大值较小的一个就是答案。

代码如下:

 1 uses math; 2 var n,i,j,ans,ans1,ans2:longint; 3     a:array[0..100000] of longint; 4     x:char; 5 begin 6   readln(n); 7   fillchar(a,sizeof(a),0); 8   for i:=1 to n do 9   begin10     read(x);11     if (x=r) then a[i]:=1;12   end;13   ans1:=0;14   ans2:=0;15   for i:=1 to n do16   begin17     if (i mod 2=1) and (a[i]=0) then inc(ans1);18     if (i mod 2=0) and (a[i]=1) then inc(ans2);19   end;20   ans:=max(ans1,ans2);21   ans1:=0;22   ans2:=0;23   for i:=1 to n do24   begin25     if (i mod 2=0) and (a[i]=0) then inc(ans1);26     if (i mod 2=1) and (a[i]=1) then inc(ans2);27   end;28   ans:=min(ans,max(ans1,ans2));29   writeln(ans);30 end.31   

Problem C:

这题是一个细节题。。。

先把大于等于5的或者等于4且后面一个数字可能进位的全部分开处理出来,

然后跑贪心就可以了,注意细节。。。

(P.S.这题的pretest非常弱。。。然后比赛结束发现room一堆人过了。。。第二天看的时候只有我和另一个人过了hhh)

代码如下:

 1 var n,k,i,j,t,tmp,now,noww,cnt:longint; 2     a:array[1..200050] of char; 3     flag:array[1..200050] of longint; 4 begin 5   readln(n,t); 6   for i:=1 to n do 7   begin 8     read(a[i]); 9     if (a[i]=.) then cnt:=i;10   end;11   readln;12   fillchar(flag,sizeof(flag),0);13   if (ord(a[n])>=48+5) then flag[n]:=1;14   for i:=n-1 downto tmp+1 do15     if (ord(a[i])>=48+5) then flag[i]:=1 else if  ((flag[i+1]>0) and (a[i]=4)) then flag[i]:=2;16   now:=cnt+1;17   while (now<=n) and (flag[now]<>1) do inc(now);18   if (now=n+1) then19   begin20     j:=n;21     while (j>cnt) and (a[j]=0) do dec(j);22     if (j=cnt) then j:=cnt-1;23     for i:=1 to j do24       write(a[i]);25     writeln;26   end27   else28   begin29     noww:=1;30     while (noww<=t) do31     begin32       if (flag[now-1]=2) then flag[now-1]:=1;33       now:=now-1;34       if (flag[now]<>1) then break;35       inc(noww);36     end;37     if (now=cnt) then38     begin39       j:=cnt-1;40       while (j>=1) do41       begin42         if (a[j]=9) then43         begin44           a[j]:=0;45           dec(j);46         end47         else48         begin49           a[j]:=chr(ord(a[j])+1);50           break;51         end;52       end;53       if (j=0) then write(1);54       for i:=1 to cnt-1 do55         write(a[i]);56       writeln;57     end58     else59     begin60             j:=now;61       while (j>=1) do62       begin63         if (a[j]=9) then64         begin65           a[j]:=0;66           dec(j);67           if (j=cnt) then j:=cnt-1;68         end69         else70         begin71           a[j]:=chr(ord(a[j])+1);72           break;73         end;74       end;75       if (j=0) then write(1);76       for i:=1 to cnt-1 do77         write(a[i]);78       j:=now;79       while (j>=cnt+1) and (a[j]=0) do dec(j);80       if (j>=cnt+1) then81       begin82         write(.);83         for i:=cnt+1 to j do84             write(a[i]);85       end;86       writeln;87     end;88   end;89 end.

Problem E:

这题是一个经典线段树,和模版题不同的是这题需要将原先的数字全部替换成矩阵。

中间用到一系列的快速幂,Fibonacci数列等运算。。。

然后卡卡常就能过了。。。

注意线段树调用的时候参数越少越好。。。(感谢cyand神犇QAQQQ)

代码如下:

  1 type arr=array[1..2,1..2] of int64;  2 nodetype=record  3     sum,cover:arr;  4     flag:boolean;  5     lx,rx:longint;  6 end;  7 const modp=1000000007;  8     fff:arr=((1,0),(0,0));  9     one:arr=((1,0),(0,1)); 10     onee:arr=((0,0),(0,0)); 11     oneee:arr=((1,1),(1,0)); 12 var t:array[0..400050] of nodetype; 13     a:array[0..100050] of longint; 14     i,j,n,m,op,x,y,z:longint; 15     xx:arr; 16     x1,y1:int64; 17 function plus(a,b:arr):arr; 18 var ans:arr; 19     i,j:longint; 20 begin 21   for i:=1 to 2 do 22   begin 23     ans[i,1]:=(a[i,1]+b[i,1]) mod modp; 24     ans[i,2]:=(a[i,2]+b[i,2]) mod modp; 25   end; 26   exit(ans); 27 end; 28 function time(a,b:arr):arr; 29 var ans:arr; 30     i,j,k:longint; 31 begin 32   for i:=1 to 2 do 33     for j:=1 to 2 do 34         ans[i,j]:=(a[i,1]*b[1,j]+a[i,2]*b[2,j]) mod modp; 35   exit(ans); 36 end; 37 function try1(i:longint):arr; 38 var ans,now:arr; 39     left:longint; 40 begin 41   ans:=one; 42   now:=oneee; 43   left:=i; 44   while (left>0) do 45   begin 46     if (left mod 2=1) then ans:=time(ans,now); 47     left:=left div 2; 48     now:=time(now,now); 49   end; 50   exit(ans); 51 end; 52 procedure build(node,lx,rx:longint); 53 var mid:longint; 54 begin 55   if (lx=rx) then 56   begin 57     t[node].sum:=time(fff,try1(a[lx]-1)); 58     t[node].cover:=one; 59     t[node].lx:=lx; 60     t[node].rx:=rx; 61   end 62   else 63   begin 64     mid:=(lx+rx) div 2; 65     build(node*2,lx,mid); 66     build(node*2+1,mid+1,rx); 67     t[node].sum:=plus(t[node*2].sum,t[node*2+1].sum); 68     t[node].cover:=one; 69     t[node].lx:=lx; 70     t[node].rx:=rx; 71   end; 72 end; 73 procedure pushdown(node:longint); 74 begin 75   if not(t[node].flag) then exit; 76   t[node*2].cover:=time(t[node*2].cover,t[node].cover); 77   t[node*2+1].cover:=time(t[node*2+1].cover,t[node].cover); 78   t[node*2].sum:=time(t[node*2].sum,t[node].cover); 79   t[node*2+1].sum:=time(t[node*2+1].sum,t[node].cover); 80   t[node*2].flag:=true; 81   t[node*2+1].flag:=true; 82   t[node].cover:=one; 83   t[node].flag:=false; 84 end; 85 procedure updata(node:longint); 86 var mid:longint; 87 begin 88   if (t[node].lx>y) or (t[node].rx<x) then exit; 89   if (t[node].lx>=x) and (t[node].rx<=y) then 90   begin 91     t[node].cover:=time(t[node].cover,xx); 92     t[node].sum:=time(t[node].sum,xx); 93     t[node].flag:=true; 94     exit; 95   end; 96   pushdown(node); 97   mid:=(t[node].lx+t[node].rx) div 2; 98   updata(node*2); 99   updata(node*2+1);100   t[node].sum:=plus(t[node*2].sum,t[node*2+1].sum);101 end;102 function query(node:longint):arr;103 var mid:longint;104 begin105   if (t[node].lx>y) or (t[node].rx<x) then exit(onee);106   if (t[node].lx>=x) and (t[node].rx<=y) then exit(t[node].sum);107   pushdown(node);108   mid:=(t[node].lx+t[node].rx) div 2;109   exit(plus(query(node*2),query(node*2+1)));110 end;111 begin112   readln(n,m);113   fillchar(t,sizeof(t),0);114   for i:=1 to n do115     read(a[i]);116   readln;117   build(1,1,n);118   for i:=1 to m do119   begin120     read(op);121     if (op=1) then122     begin123       readln(x,y,z);124       xx:=try1(z);125       updata(1);126     end127     else128     begin129       readln(x,y);130       writeln(query(1)[1,1]);131     end;132   end;133 end.

完结撒花!

codeforces round373(div.2) 题解