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')else
11   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   begin
10     read(x);
11     if (x='r') then a[i]:=1;
12   end;
13   ans1:=0;
14   ans2:=0;
15   for i:=1 to n do
16   begin
17     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 do
24   begin
25     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 do
15     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) then
19   begin
20     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 do
24       write(a[i]);
25     writeln;
26   end
27   else
28   begin
29     noww:=1;
30     while (noww<=t) do
31     begin
32       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) then
38     begin
39       j:=cnt-1;
40       while (j>=1) do
41       begin
42         if (a[j]='9') then
43         begin
44           a[j]:='0';
45           dec(j);
46         end
47         else
48         begin
49           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 do
55         write(a[i]);
56       writeln;
57     end
58     else
59     begin
60             j:=now;
61       while (j>=1) do
62       begin
63         if (a[j]='9') then
64         begin
65           a[j]:='0';
66           dec(j);
67           if (j=cnt) then j:=cnt-1;
68         end
69         else
70         begin
71           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 do
77         write(a[i]);
78       j:=now;
79       while (j>=cnt+1) and (a[j]='0') do dec(j);
80       if (j>=cnt+1) then
81       begin
82         write('.');
83         for i:=cnt+1 to j do
84             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 begin
105   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 begin
112   readln(n,m);
113   fillchar(t,sizeof(t),0);
114   for i:=1 to n do
115     read(a[i]);
116   readln;
117   build(1,1,n);
118   for i:=1 to m do
119   begin
120     read(op);
121     if (op=1) then
122     begin
123       readln(x,y,z);
124       xx:=try1(z);
125       updata(1);
126     end
127     else
128     begin
129       readln(x,y);
130       writeln(query(1)[1,1]);
131     end;
132   end;
133 end.

完结撒花!

posted @ 2016-09-26 23:12  Tommyr7  阅读(237)  评论(0编辑  收藏  举报