atcoder beginner 349 (abc349) D E 题解
AtCoder Beginner Contest 349 - AtCoder
D
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 }
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小时前