atcoder beginner 349 (abc349) D E 题解

AtCoder Beginner Contest 349 - AtCoder

 

lowbit的第一感觉。

如果+lowbit后,>R,就逐渐/2,直到新加后的值<=R

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <stdbool.h>
 6 #include <string>
 7 #include <algorithm>
 8 #include <iostream>
 9 #include <sstream>
10 #include <ctime>
11 #include <stack>
12 #include <vector>
13 #include <queue>
14 #include <set>
15 #include <map>
16 using namespace std;
17 #define LL long long
18 const int maxn=1e5+10;
19 
20 
21 
22 LL er[100];
23 LL result[maxn];
24 
25 int main()
26 {
27     LL L,R,newL,add, i,ind=0;
28     er[0]=1;
29     for (i=1;i<=61;i++)
30         er[i]=er[i-1]<<1;
31     cin>>L>>R;
32     result[0]=L;
33 
34     /*
35     L+= (L&-L);
36     cout<<L<<endl;
37     */
38 
39     if (L==0)
40     {
41         for (i=0;i<=61;i++)
42             if (er[i]*2>R-L)
43                 break;
44         ind++;
45         result[ind]=er[i];
46         L=er[i];
47     }
48 
49     while (L<R)
50     {
51         add = (L&-L);
52         newL = L + add;
53 
54         if (newL>R)
55         {
56             //break;
57 
58             while (add>R-L)
59                 add=add>>1;
60             newL = L + add;
61         }
62 
63         ind++;
64         result[ind] = newL;
65         L = newL;
66     }
67 
68     cout<<ind<<endl;
69     for (i=1;i<=ind;i++)
70         cout<<result[i-1]<<" "<<result[i]<<endl;
71 
72     return 0;
73 }
View Code

 

 

E

博弈论题目,A、B交替下。

DFS。

枚举所有9个点,每个点2种选择,就是最多9!,不会超时。

当C(C这个人,无论是A还是B)处于某个位置,它可以胜利的方案是,对于随便一个C的下法,xorC(下一个人)都一定输;而失败的方案是,对于所有C的下法,xorC(下一个人)都必须赢。

A、B的操作可以想办法写代码的时候合并,让它们同一个代码就可以处理,这样写得舒服,方便找到错误然后修改。比如选择A、B分别设置这个格子为1/-1,只要有3个数加起来是3/-3,那么A、B分别赢。

这种难调试,要有看代码找错误的能力。

  1 #include <cstdio>
  2 #include <cstdlib>
  3 #include <cstring>
  4 #include <cmath>
  5 #include <stdbool.h>
  6 #include <string>
  7 #include <algorithm>
  8 #include <iostream>
  9 #include <sstream>
 10 #include <ctime>
 11 #include <stack>
 12 #include <vector>
 13 #include <queue>
 14 #include <set>
 15 #include <map>
 16 using namespace std;
 17 #define LL long long
 18 const int maxn=1e5+10;
 19 
 20 LL ori=1e15;
 21 LL score[20],bel[20], pos[20];
 22 LL v[2]={1,-1};
 23 
 24 LL cal_bel()
 25 {
 26     LL cond=0;
 27     if (bel[1]+bel[2]+bel[3]==3)
 28         cond=1;
 29     if (bel[4]+bel[5]+bel[6]==3)
 30         cond=1;
 31     if (bel[7]+bel[8]+bel[9]==3)
 32         cond=1;
 33     if (bel[1]+bel[4]+bel[7]==3)
 34         cond=1;
 35     if (bel[2]+bel[5]+bel[8]==3)
 36         cond=1;
 37     if (bel[3]+bel[6]+bel[9]==3)
 38         cond=1;
 39     if (bel[1]+bel[5]+bel[9]==3)
 40         cond=1;
 41     if (bel[3]+bel[5]+bel[7]==3)
 42         cond=1;
 43 
 44     if (bel[1]+bel[2]+bel[3]==-3)
 45         cond=-1;
 46     if (bel[4]+bel[5]+bel[6]==-3)
 47         cond=-1;
 48     if (bel[7]+bel[8]+bel[9]==-3)
 49         cond=-1;
 50     if (bel[1]+bel[4]+bel[7]==-3)
 51         cond=-1;
 52     if (bel[2]+bel[5]+bel[8]==-3)
 53         cond=-1;
 54     if (bel[3]+bel[6]+bel[9]==-3)
 55         cond=-1;
 56     if (bel[1]+bel[5]+bel[9]==-3)
 57         cond=-1;
 58     if (bel[3]+bel[5]+bel[7]==-3)
 59         cond=-1;
 60 
 61     return cond;
 62 }
 63 
 64 bool dfs(LL person, LL cnt)   ///person 0: first person; 1 : second person
 65 {
 66     bool vis=0;
 67     LL cond,i;
 68 
 69     if (cnt==10)
 70     {
 71         LL fin=0;
 72         for (i=1;i<=9;i++)
 73             fin+=score[i]*bel[i];
 74         if (fin>0)
 75             return 0;
 76 
 77         return 1;
 78         ///zheli  opposite
 79     }
 80 
 81 
 82 
 83     for (i=1;i<=9;i++)
 84         if (bel[i]==ori)
 85         {
 86             /*
 87             ///test
 88             if (cnt==1)
 89                 i=5;
 90             */
 91 
 92 
 93 
 94             bel[i] = v[person];
 95 
 96             cond=cal_bel();
 97 
 98             if ((cond==1 && person==0) || (cond==-1 && person==1))
 99             {
100                 bel[i]=ori; ///restore
101                 pos[cnt]=i;
102                 return 1;
103             }
104 
105             if (cond!=1 && cond!=-1)
106             {
107 
108                 ///================
109 
110                 vis = dfs(person^1, cnt+1); ///when duishou both false, i am true
111                 bel[i]=ori; ///restore
112                 if (vis==0)
113                 {
114                     pos[cnt]=i;
115                     return 1;
116                 }
117 
118             }
119 
120             bel[i]=ori; ///restore
121         }
122     return 0;
123 }
124 
125 int main()
126 {
127     LL i;
128     for (i=1;i<=9;i++)
129         cin>>score[i];
130     for (i=1;i<=9;i++)
131         bel[i]=ori;
132     if (dfs(0,1))
133         cout<<"Takahashi";
134     else
135         cout<<"Aoki";
136 
137     return 0;
138 }
139 /*
140 -1 -1 -1
141 -1 -1 -1
142 -1 -1 -1
143 
144 Aoki
145 
146 ======
147 
148 1 1 1
149 1 1 1
150 1 1 1
151 
152 Takahashi
153 
154 ======
155 
156 1 1 5
157 1 1 1
158 1 1 1
159 
160 ======
161 
162 1 1 -5
163 1 1 1
164 1 1 1
165 
166 ======
167 
168 
169 */

 

TODO AA競程AtCoder Beginner Contest 349 A 至 G 題讲解 by dreamoon1小时前

posted @ 2024-04-15 02:04  congmingyige  阅读(27)  评论(0编辑  收藏  举报