A XORwice
答案是 a \oplus b 。证明:显然。
B Putting Bricks in the Wall
由于只能左右上下动,结果就是限定移动的砖块只有 (1,2) \quad (2,1) \quad (n,n-1) \quad (n-1, n) 。
然后就 if
一下分情况讨论就可以了。代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
#include<cstdio> #include<iostream> #include<cstring> #include<string> #include<cmath> #include<algorithm> #include<cstdlib> #include<vector> #include<queue> #include<map> #include<set> typedef long long ll; using namespace std; char g[210][210]; int n; template<typename int_t> void readx(int_t &x) { x=0; int_t k=1; char ch=0; while (ch<'0' || ch>'9') { ch=getchar(); if (ch=='-') k=-1; } while (ch>='0' && ch<='9') { x=x*10+ch-'0'; ch=getchar(); } x*=k; } int main() { int T; readx(T); while (T--) { readx(n); for (int i=1;i<=n;i++) scanf(" %s", g[i]+1); int sim=0; if (g[2][1]==g[1][2]) sim++; if (g[n][n-1]==g[n-1][n]) sim++; // case 1 if (sim==2) { if (g[2][1]==g[n-1][n]) { printf("2\n2 1\n1 2\n"); continue; } else { cout<<0<<endl; continue; } } if (sim==1) { if (g[2][1]==g[1][2]) { printf("1\n"); if (g[n][n-1]==g[2][1]) printf("%d %d\n", n, n-1); else printf("%d %d\n", n-1, n); } else { printf("1\n"); if (g[2][1]==g[n][n-1]) printf("2 1\n"); else printf("1 2\n"); } continue; } if (!sim) { printf("2\n"); printf("1 2\n"); if (g[n][n-1]==g[2][1]) printf("%d %d\n", n, n-1); else printf("%d %d\n", n-1, n); continue; } } return 0; } |
C Palindromifier
是这样构造的:
然后就没了。代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
#include<cstdio> #include<iostream> #include<cstring> #include<string> #include<cmath> #include<algorithm> #include<cstdlib> #include<vector> #include<queue> #include<map> #include<set> typedef long long ll; using namespace std; char ch[100010]; template<typename int_t> void readx(int_t &x) { x=0; int_t k=1; char ch=0; while (ch<'0' || ch>'9') { ch=getchar(); if (ch=='-') k=-1; } while (ch>='0' && ch<='9') { x=x*10+ch-'0'; ch=getchar(); } x*=k; } int main() { scanf(" %s", ch+1); int len=strlen(ch+1); if (len==3) { printf("4\nL 2\nR 3\nL 4\nL 2\n"); return 0; } printf("4\n"); printf("L %d\n", len-1); len+=len-2; printf("R %d\n", len-1); len++; printf("L %d\n", len-1); len+=len-2; printf("L 2\n"); return 0; } |
D Hexagons
首先可以贪心地证明一定是只选择两个方向走最优。
选的话一共 12 种组合,挨个判断一下,然后更新答案。
粉兔の怒:
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
#include<cstdio> #include<iostream> #include<cstring> #include<string> #include<cmath> #include<algorithm> #include<cstdlib> #include<vector> #include<queue> #include<map> #include<set> typedef long long ll; using namespace std; template<typename int_t> void readx(int_t &x) { x=0; int_t k=1; char ch=0; while (ch<'0' || ch>'9') { ch=getchar(); if (ch=='-') k=-1; } while (ch>='0' && ch<='9') { x=x*10+ch-'0'; ch=getchar(); } x*=k; } int main() { int T; readx(T); while (T--) { ll c1,c2,c3,c4,c5,c6; ll ex,ey; readx(ex); readx(ey); readx(c1); readx(c2); readx(c3); readx(c4); readx(c5); readx(c6); swap(ex,ey); ll ans=2100000000000000000LL; if (ex>=0 && ey>=0) //c2 c6 OK ans=min(ans, ex*c2+ey*c6); if ((ex-ey)>=0 && ey>=0) // c2 c1 OK ans=min(ans, ey*c1+(ex-ey)*c2); if ((ex-ey)>=0 && ey<=0) // c2 c4 OK ans=min(ans, (-ey)*c4+(ex-ey)*c2); if (ey<=0 && ex>=0) //c2 c3 OK ans=min(ans, ex*c2+(-ey)*c3); if ((ex-ey)<=0 && ey>=0 && ex>=0) // c1 c6 OK(?) ans=min(ans, (ey-ex)*c6+ex*c1); if (ey>=0 && (ex-ey)<=0) // c1 c5 OK(?) ans=min(ans, (ey-ex)*c5+ey*c1); if (ex>=0 && (ex-ey)>=0) //c1 c3 OK ans=min(ans, ex*c1+(ex-ey)*c3); if (ey>=0 && ex<=0) //c6 c5 OK ans=min(ans, ey*c6+(-ex)*c5); if (ex<=0 && (ex-ey)<=0) // c6 c4 OK ans=min(ans, (-ex)*c4+(ey-ex)*c6); if (ex<=0 && ey<=0) // c5 c3 OK ans=min(ans, (-ey)*c3+(-ex)*c5); if (ey<=0 && (ex-ey)<=0) // c5 c4 OK ans=min(ans, (ey-ex)*c5+(-ey)*c4); if (ex<=0 && (ey-ex)<=0) // c4 c3 OK ans=min(ans, (-ex)*c4+(ex-ey)*c3); printf("%lld\n",ans); } } |
E
还没补,咕着先。